采用二维组织的形式实现了一堆寄存器,对应的是单发射五级流水的MIPS CPU
对应一个32项,每项32位的寄存器堆。
为了支持流水,寄存器堆要具备每周期读入两个32位数,写入一个32位数的能力。
还有一个特殊的0号寄存器
verilog代码如下
module regfile(
input clk,
input [4:0]raddr1,
output [31:0]rdata1,
input [4:0]raddr2,
output [31:0]rdata2,
input we,//write enable signal
input [4:0]waddr,
input [31:0]wdata
);
reg [31:0]reg_array[31:0];
//write
always @(posedge clk)begin
if(we)reg_array[waddr]<=wdata;
end
assign rdata1=(raddr1==5'b0)?32'b0:reg_array[raddr1];
//write channel 1 raddr1 is an address directs to the place
assign rdata2=(raddr2==5'b0)?32'b0:reg_array[raddr2];
//two channel in sum
endmodule
可以看出这里寄存器的结果比较简单,有两输出地址,两个输出的数据,一个使能信号”en”,一个输入的地址和数据
后面根据时钟周期进行写入,然后读取的话,这种写法还是值得学习的,他相当于进行了5-32位译码,软件会自动加入译码的电路,只用这样的写法实现译码,是值得学习的。