1 module \$__COUNT_ (CE, CLK, OUT, POUT, RST, UP);
7 output wire[WIDTH-1:0] POUT;
11 parameter COUNT_TO = 1;
12 parameter RESET_MODE = "RISING";
13 parameter RESET_TO_MAX = 0;
14 parameter HAS_POUT = 0;
17 parameter DIRECTION = "DOWN";
19 if (DIRECTION == "UP") begin
22 $display("ERROR: \$__COUNT_ must be at least 2 bits wide (bug in extract_counter pass?).");
29 assign OUT = POUT == COUNT_TO;
33 for (i = 0; i < WIDTH; i++) begin: countbits
34 // each bit = (cur & !reset) ^ (all prev & !reset)
45 wire orterm_to_xor_bitn;
46 wire pterm0_to_or_bitn;
47 wire pterm1_to_or_bitn;
51 .IN_ORTERM(orterm_to_xor_bitn),
52 .IN_PTC(pterm1_to_or_bitn),
58 .IN(pterm0_to_or_bitn),
59 .OUT(orterm_to_xor_bitn)
67 .OUT(pterm0_to_or_bitn)
73 .IN({POUT[i-1:0], CE}),
75 .OUT(pterm1_to_or_bitn)
79 // Bit0 is special; toggle unless reset
95 wire pterm_to_xor_bit0;
99 .IN_PTC(pterm_to_xor_bit0),
107 .IN_B({POUT[0], OUT}),
108 .OUT(pterm_to_xor_bit0)
112 for (i = 1; i < WIDTH; i++) begin: countbits
113 // each bit = (cur & !reset) ^ (all prev & !reset)
124 wire orterm_to_xor_bitn;
125 wire pterm0_to_or_bitn;
126 wire pterm1_to_or_bitn;
130 .IN_ORTERM(orterm_to_xor_bitn),
131 .IN_PTC(pterm1_to_or_bitn),
137 .IN(pterm0_to_or_bitn),
138 .OUT(orterm_to_xor_bitn)
146 .OUT(pterm0_to_or_bitn)
154 .OUT(pterm1_to_or_bitn)
160 // FIXME: down counters