72 lines
1.9 KiB
Verilog
72 lines
1.9 KiB
Verilog
`include "VX_define.vh"
|
|
|
|
module VX_gpr_wrapper (
|
|
input wire clk,
|
|
input wire reset,
|
|
VX_gpr_read_inter VX_gpr_read,
|
|
VX_wb_inter VX_writeback_inter,
|
|
VX_gpr_jal_inter VX_gpr_jal,
|
|
|
|
output wire[`NUM_THREADS-1:0][31:0] out_a_reg_data,
|
|
output wire[`NUM_THREADS-1:0][31:0] out_b_reg_data
|
|
|
|
);
|
|
|
|
wire[`NUM_WARPS-1:0][`NUM_THREADS-1:0][31:0] temp_a_reg_data;
|
|
wire[`NUM_WARPS-1:0][`NUM_THREADS-1:0][31:0] temp_b_reg_data;
|
|
|
|
wire[`NUM_THREADS-1:0][31:0] jal_data;
|
|
genvar index;
|
|
generate
|
|
for (index = 0; index < `NUM_THREADS; index = index + 1) begin : jal_data_assign
|
|
assign jal_data[index] = VX_gpr_jal.curr_PC;
|
|
end
|
|
endgenerate
|
|
|
|
`ifndef ASIC
|
|
assign out_a_reg_data = (VX_gpr_jal.is_jal ? jal_data : (temp_a_reg_data[VX_gpr_read.warp_num]));
|
|
assign out_b_reg_data = (temp_b_reg_data[VX_gpr_read.warp_num]);
|
|
`else
|
|
|
|
wire zer = 0;
|
|
|
|
wire[`NW_BITS-1:0] old_warp_num;
|
|
VX_generic_register #(`NW_BITS-1+1) store_wn(
|
|
.clk (clk),
|
|
.reset(reset),
|
|
.stall(zer),
|
|
.flush(zer),
|
|
.in (VX_gpr_read.warp_num),
|
|
.out (old_warp_num)
|
|
);
|
|
|
|
assign out_a_reg_data = (VX_gpr_jal.is_jal ? jal_data : (temp_a_reg_data[old_warp_num]));
|
|
assign out_b_reg_data = (temp_b_reg_data[old_warp_num]);
|
|
|
|
`endif
|
|
|
|
genvar warp_index;
|
|
generate
|
|
|
|
for (warp_index = 0; warp_index < `NUM_WARPS; warp_index = warp_index + 1) begin : warp_gprs
|
|
|
|
wire valid_write_request = warp_index == VX_writeback_inter.wb_warp_num;
|
|
VX_gpr vx_gpr(
|
|
.clk (clk),
|
|
.reset (reset),
|
|
.valid_write_request(valid_write_request),
|
|
.VX_gpr_read (VX_gpr_read),
|
|
.VX_writeback_inter (VX_writeback_inter),
|
|
.out_a_reg_data (temp_a_reg_data[warp_index]),
|
|
.out_b_reg_data (temp_b_reg_data[warp_index])
|
|
);
|
|
|
|
end
|
|
|
|
endgenerate
|
|
|
|
|
|
endmodule
|
|
|
|
|