| module gen_test1(clk, a, b, y); | |
| input clk; | |
| input [7:0] a, b; | |
| output reg [7:0] y; | |
| genvar i, j; | |
| wire [15:0] tmp1; | |
| generate | |
| for (i = 0; i < 8; i = i + 1) begin:gen1 | |
| wire and_wire, or_wire; | |
| assign and_wire = a[i] & b[i]; | |
| assign or_wire = a[i] | b[i]; | |
| if (i % 2 == 0) begin:gen2true | |
| assign tmp1[i] = and_wire; | |
| assign tmp1[i+8] = or_wire; | |
| end else begin:gen2false | |
| assign tmp1[i] = or_wire; | |
| assign tmp1[i+8] = and_wire; | |
| end | |
| end | |
| for (i = 0; i < 8; i = i + 1) begin:gen3 | |
| wire [4:0] tmp2; | |
| for (j = 0; j <= 4; j = j + 1) begin:gen4 | |
| wire tmpbuf; | |
| assign tmpbuf = tmp1[i+2*j]; | |
| assign tmp2[j] = tmpbuf; | |
| end | |
| always @(posedge clk) | |
| y[i] <= ^tmp2; | |
| end | |
| endgenerate | |
| endmodule | |
| // ------------------------------------------ | |
| module gen_test2(clk, a, b, y); | |
| input clk; | |
| input [7:0] a, b; | |
| output reg [8:0] y; | |
| integer i; | |
| reg [8:0] carry; | |
| always @(posedge clk) begin | |
| carry[0] = 0; | |
| for (i = 0; i < 8; i = i + 1) begin | |
| casez ({a[i], b[i], carry[i]}) | |
| 3'b?11, 3'b1?1, 3'b11?: | |
| carry[i+1] = 1; | |
| default: | |
| carry[i+1] = 0; | |
| endcase | |
| y[i] = a[i] ^ b[i] ^ carry[i]; | |
| end | |
| y[8] = carry[8]; | |
| end | |
| endmodule | |
| // ------------------------------------------ | |
| module gen_test3(a, b, sel, y, z); | |
| input [3:0] a, b; | |
| input sel; | |
| output [3:0] y, z; | |
| genvar i; | |
| generate | |
| for (i=0; i < 2; i=i+1) | |
| assign y[i] = sel ? a[i] : b[i], z[i] = sel ? b[i] : a[i]; | |
| for (i=0; i < 2; i=i+1) begin | |
| if (i == 0) | |
| assign y[2] = sel ? a[2] : b[2]; | |
| else | |
| assign z[2] = sel ? a[2] : b[2]; | |
| case (i) | |
| default: | |
| assign z[3] = sel ? a[3] : b[3]; | |
| 0: | |
| assign y[3] = sel ? a[3] : b[3]; | |
| endcase | |
| end | |
| endgenerate | |
| endmodule | |
| // ------------------------------------------ | |
| module gen_test4(a, b); | |
| input [3:0] a; | |
| output [3:0] b; | |
| genvar i; | |
| generate | |
| for (i=0; i < 3; i=i+1) begin : foo | |
| localparam PREV = i - 1; | |
| wire temp; | |
| if (i == 0) | |
| assign temp = a[0]; | |
| else | |
| assign temp = foo[PREV].temp & a[i]; | |
| assign b[i] = temp; | |
| end | |
| endgenerate | |
| endmodule | |
| // ------------------------------------------ | |
| module gen_test5(input_bits, out); | |
| parameter WIDTH = 256; | |
| parameter CHUNK = 4; | |
| input [WIDTH-1:0] input_bits; | |
| output out; | |
| genvar step, i, j; | |
| generate | |
| for (step = 1; step <= WIDTH; step = step * CHUNK) begin : steps | |
| localparam PREV = step / CHUNK; | |
| localparam DIM = WIDTH / step; | |
| for (i = 0; i < DIM; i = i + 1) begin : outer | |
| localparam LAST_START = i * CHUNK; | |
| for (j = 0; j < CHUNK; j = j + 1) begin : inner | |
| wire temp; | |
| if (step == 1) | |
| assign temp = input_bits[i]; | |
| else if (j == 0) | |
| assign temp = steps[PREV].outer[LAST_START].val; | |
| else | |
| assign temp | |
| = steps[step].outer[i].inner[j-1].temp | |
| & steps[PREV].outer[LAST_START + j].val; | |
| end | |
| wire val; | |
| assign val = steps[step].outer[i].inner[CHUNK - 1].temp; | |
| end | |
| end | |
| endgenerate | |
| assign out = steps[WIDTH].outer[0].val; | |
| endmodule | |
| // ------------------------------------------ | |
| module gen_test6(output [3:0] o); | |
| generate | |
| genvar i; | |
| for (i = 3; i >= 0; i = i-1) begin | |
| assign o[i] = 1'b0; | |
| end | |
| endgenerate | |
| endmodule |