File size: 2,341 Bytes
f5498f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Popcount-reformulated 1-parameter person classifier, thresholds baked in.
// Generated by rtl_gen.py; do not edit by hand.
//
// Inputs are the 40 Stage 0 classifier dims as signed INT8, post-LayerNorm and
// post-max-pool. Output is one bit. Combinational, no multipliers, no memory.
//
// Per-dim thresholds are the calibrated float values scaled by 8 and rounded.

module person_classifier_popcount_folded (
    input  signed [7:0] f00, f01, f02, f03, f04, f05, f06, f07, f08, f09,
    input  signed [7:0] f10, f11, f12, f13, f14, f15, f16, f17, f18, f19,
    input  signed [7:0] f20, f21, f22, f23, f24, f25, f26, f27, f28, f29,
    input  signed [7:0] f30, f31, f32, f33, f34, f35, f36, f37, f38, f39,
    output person_present
);
    localparam signed [7:0] T00 =   53, T01 =   56, T02 =   26, T03 =   60, T04 =   17,
                             T05 =   12, T06 =   16, T07 =    1, T08 =    5, T09 =   11,
                             T10 =    4, T11 =    4, T12 =    6, T13 =    9, T14 =    8,
                             T15 =   16, T16 =    6, T17 =    6, T18 =    7, T19 =    8,
                             T20 =   36, T21 =   45, T22 =   19, T23 =   14, T24 =   14,
                             T25 =   63, T26 =   18, T27 =   49, T28 =   17, T29 =   17,
                             T30 =   17, T31 =   21, T32 =   11, T33 =   18, T34 =   19,
                             T35 =   14, T36 =   18, T37 =   16, T38 =   21, T39 =   14;
    localparam signed [5:0] FINAL_T = 13;

    wire [5:0] count_pos =
        (f00 > T00) + (f01 > T01) + (f02 > T02) +
        (f03 > T03) + (f04 > T04) + (f05 > T05) +
        (f06 > T06) + (f07 > T07) + (f08 > T08) +
        (f09 > T09) + (f10 > T10) + (f11 > T11) +
        (f12 > T12) + (f13 > T13) + (f14 > T14) +
        (f15 > T15) + (f16 > T16) + (f17 > T17) +
        (f18 > T18) + (f19 > T19);

    wire [5:0] count_neg =
        (f20 > T20) + (f21 > T21) + (f22 > T22) +
        (f23 > T23) + (f24 > T24) + (f25 > T25) +
        (f26 > T26) + (f27 > T27) + (f28 > T28) +
        (f29 > T29) + (f30 > T30) + (f31 > T31) +
        (f32 > T32) + (f33 > T33) + (f34 > T34) +
        (f35 > T35) + (f36 > T36) + (f37 > T37) +
        (f38 > T38) + (f39 > T39);

    wire signed [6:0] diff = {1'b0, count_pos} - {1'b0, count_neg};
    assign person_present = diff > FINAL_T;
endmodule