1 module \$__COUNT_ (CE, CLK, OUT, POUT, RST, UP);
6 output wire[WIDTH-1:0] POUT;
10 parameter COUNT_TO = 1;
11 parameter RESET_MODE = "RISING";
12 parameter RESET_TO_MAX = 0;
13 parameter HAS_POUT = 0;
16 parameter DIRECTION = "DOWN";
18 if (DIRECTION == "UP") begin
21 $display("ERROR: \$__COUNT_ must be at least 2 bits wide (bug in extract_counter pass?).");
28 assign OUT = POUT == COUNT_TO;
32 for (i = 0; i < WIDTH; i++) begin: countbits
33 // each bit = (cur & !reset) ^ (all prev & !reset)
44 wire orterm_to_xor_bitn;
45 wire pterm0_to_or_bitn;
46 wire pterm1_to_or_bitn;
50 .IN_ORTERM(orterm_to_xor_bitn),
51 .IN_PTC(pterm1_to_or_bitn),
57 .IN(pterm0_to_or_bitn),
58 .OUT(orterm_to_xor_bitn)
66 .OUT(pterm0_to_or_bitn)
72 .IN({POUT[i-1:0], CE}),
74 .OUT(pterm1_to_or_bitn)
78 // Bit0 is special; toggle unless reset
94 wire pterm_to_xor_bit0;
98 .IN_PTC(pterm_to_xor_bit0),
106 .IN_B({POUT[0], OUT}),
107 .OUT(pterm_to_xor_bit0)
111 for (i = 1; i < WIDTH; i++) begin: countbits
112 // each bit = (cur & !reset) ^ (all prev & !reset)
123 wire orterm_to_xor_bitn;
124 wire pterm0_to_or_bitn;
125 wire pterm1_to_or_bitn;
129 .IN_ORTERM(orterm_to_xor_bitn),
130 .IN_PTC(pterm1_to_or_bitn),
136 .IN(pterm0_to_or_bitn),
137 .OUT(orterm_to_xor_bitn)
145 .OUT(pterm0_to_or_bitn)
153 .OUT(pterm1_to_or_bitn)
159 // FIXME: down counters