50 lines
997 B
Verilog
50 lines
997 B
Verilog
|
|
|
|
module VX_register_file (
|
|
input wire clk,
|
|
input wire in_valid,
|
|
input wire in_write_register,
|
|
input wire[4:0] in_rd,
|
|
input wire[31:0] in_data,
|
|
input wire[4:0] in_src1,
|
|
input wire[4:0] in_src2,
|
|
|
|
output reg[31:0] out_src1_data,
|
|
output reg[31:0] out_src2_data
|
|
);
|
|
|
|
reg[31:0] registers[31:0];
|
|
|
|
wire[31:0] write_data;
|
|
|
|
wire[4:0] write_register;
|
|
|
|
wire write_enable;
|
|
|
|
// reg[5:0] i;
|
|
// always @(posedge clk) begin
|
|
// for (i = 0; i < 32; i++) begin
|
|
// $display("%d: %h",i, registers[i[4:0]]);
|
|
// end
|
|
// end
|
|
|
|
assign write_data = in_data;
|
|
assign write_register = in_rd;
|
|
|
|
assign write_enable = in_write_register && (in_rd != 5'h0) && in_valid;
|
|
|
|
always @(posedge clk) begin
|
|
if(write_enable) begin
|
|
$display("Writing %h to %d",write_data, write_register);
|
|
registers[write_register] <= write_data;
|
|
end
|
|
end
|
|
|
|
always @(negedge clk) begin
|
|
out_src1_data <= registers[in_src1];
|
|
out_src2_data <= registers[in_src2];
|
|
end
|
|
|
|
|
|
endmodule
|