68 lines
1.8 KiB
Verilog
Executable File
68 lines
1.8 KiB
Verilog
Executable File
module regfile(
|
|
input clk,
|
|
input reset,
|
|
// READ PORT 1
|
|
input [ 4:0] raddr1,
|
|
output [31:0] rdata1,
|
|
// READ PORT 2
|
|
input [ 4:0] raddr2,
|
|
output [31:0] rdata2,
|
|
// WRITE PORT
|
|
input we, //write enable, HIGH valid
|
|
input [ 4:0] waddr,
|
|
input [31:0] wdata
|
|
);
|
|
reg [31:0] rf[31:0];
|
|
|
|
//WRITE
|
|
always @(posedge clk) begin
|
|
if (reset) begin
|
|
rf[ 0] <= 32'b0;
|
|
rf[ 1] <= 32'b0;
|
|
rf[ 2] <= 32'b0;
|
|
rf[ 3] <= 32'b0;
|
|
rf[ 4] <= 32'b0;
|
|
rf[ 5] <= 32'b0;
|
|
rf[ 6] <= 32'b0;
|
|
rf[ 7] <= 32'b0;
|
|
rf[ 8] <= 32'b0;
|
|
rf[ 9] <= 32'b0;
|
|
rf[10] <= 32'b0;
|
|
rf[11] <= 32'b0;
|
|
rf[12] <= 32'b0;
|
|
rf[13] <= 32'b0;
|
|
rf[14] <= 32'b0;
|
|
rf[15] <= 32'b0;
|
|
rf[16] <= 32'b0;
|
|
rf[17] <= 32'b0;
|
|
rf[18] <= 32'b0;
|
|
rf[19] <= 32'b0;
|
|
rf[20] <= 32'b0;
|
|
rf[21] <= 32'b0;
|
|
rf[22] <= 32'b0;
|
|
rf[23] <= 32'b0;
|
|
rf[24] <= 32'b0;
|
|
rf[25] <= 32'b0;
|
|
rf[26] <= 32'b0;
|
|
rf[27] <= 32'b0;
|
|
rf[28] <= 32'b0;
|
|
rf[29] <= 32'b0;
|
|
rf[30] <= 32'b0;
|
|
rf[31] <= 32'b0;
|
|
end
|
|
else if (we) begin
|
|
rf[waddr]<= wdata;
|
|
end
|
|
end
|
|
|
|
//READ OUT 1
|
|
assign rdata1 = (raddr1==5'b0 ) ? 32'b0 :
|
|
(raddr1==waddr) ? wdata :
|
|
rf[raddr1];
|
|
|
|
//READ OUT 2
|
|
assign rdata2 = (raddr2==5'b0 ) ? 32'b0 :
|
|
(raddr2==waddr) ? wdata :
|
|
rf[raddr2];
|
|
|
|
endmodule |