35 lines
1.0 KiB
Verilog
35 lines
1.0 KiB
Verilog
`include "VX_define.vh"
|
|
|
|
`TRACING_OFF
|
|
module VX_gpr_ram (
|
|
input wire clk,
|
|
input wire [`NUM_THREADS-1:0] we,
|
|
input wire [`NW_BITS+`NR_BITS-1:0] waddr,
|
|
input wire [`NUM_THREADS-1:0][31:0] wdata,
|
|
input wire [`NW_BITS+`NR_BITS-1:0] rs1,
|
|
input wire [`NW_BITS+`NR_BITS-1:0] rs2,
|
|
output wire [`NUM_THREADS-1:0][31:0] rs1_data,
|
|
output wire [`NUM_THREADS-1:0][31:0] rs2_data
|
|
);
|
|
|
|
reg [`NUM_THREADS-1:0][3:0][7:0] mem [(`NUM_WARPS * `NUM_REGS)-1:0];
|
|
reg [`NUM_THREADS-1:0][31:0] q1, q2;
|
|
|
|
always @(posedge clk) begin
|
|
for (integer i = 0; i < `NUM_THREADS; i++) begin
|
|
if (we[i]) begin
|
|
mem[waddr][i][0] <= wdata[i][07:00];
|
|
mem[waddr][i][1] <= wdata[i][15:08];
|
|
mem[waddr][i][2] <= wdata[i][23:16];
|
|
mem[waddr][i][3] <= wdata[i][31:24];
|
|
end
|
|
end
|
|
q1 <= mem[rs1];
|
|
q2 <= mem[rs2];
|
|
end
|
|
|
|
assign rs1_data = q1;
|
|
assign rs2_data = q2;
|
|
|
|
endmodule
|
|
`TRACING_ON |