module bc #( parameter SIZE=2, parameter WIDTH=16 ) ( input clk, input rst, output wire din_ready, input wire din_valid, input wire [WIDTH-1:0] din_data, input wire [SIZE-1:0] dout_ready, output wire [SIZE-1:0] dout_valid, output wire [WIDTH*SIZE-1:0] dout_data ); reg [SIZE-1 : 0] ready_reg; wire [SIZE-1 : 0] ready_all; genvar i; initial begin ready_reg = 0; end generate for (i = 0; i < SIZE; i=i+1) begin assign ready_all[i] = dout_ready[i] | ready_reg[i]; assign dout_valid[i] = din_valid & !ready_reg[i]; assign dout_data[(i+1)*WIDTH-1:i*WIDTH] = din_data; always @(posedge clk) begin if (rst || (!din_valid) || din_ready) begin ready_reg[i] <= 1'b0; end else if (dout_ready[i]) begin ready_reg[i] <= 1'b1; end end end endgenerate assign din_ready = &ready_all; endmodule