module \$reduce_or (A, Y); parameter A_SIGNED = 0; parameter A_WIDTH = 0; parameter Y_WIDTH = 0; input [A_WIDTH-1:0] A; output [Y_WIDTH-1:0] Y; function integer min; input integer a, b; begin if (a < b) min = a; else min = b; end endfunction genvar i; generate begin if (A_WIDTH == 0) begin assign Y = 0; end if (A_WIDTH == 1) begin assign Y = A; end if (A_WIDTH == 2) begin wire ybuf; OR3X1 g (.A(A[0]), .B(A[1]), .C(1'b0), .Y(ybuf)); assign Y = ybuf; end if (A_WIDTH == 3) begin wire ybuf; OR3X1 g (.A(A[0]), .B(A[1]), .C(A[2]), .Y(ybuf)); assign Y = ybuf; end if (A_WIDTH > 3) begin localparam next_stage_sz = (A_WIDTH+2) / 3; wire [next_stage_sz-1:0] next_stage; for (i = 0; i < next_stage_sz; i = i+1) begin localparam bits = min(A_WIDTH - 3*i, 3); assign next_stage[i] = |A[3*i +: bits]; end assign Y = |next_stage; end end endgenerate endmodule