以下是寄存器文件的规范:
总线A,B和W为64位宽。
当RegWr设置为1时,总线W上的数据存储在 Rw指定的寄存器,在负(下降)时钟沿。
寄存器31必须始终读为零。
来自寄存器的数据(由Ra和Rb指定)在总线A和A上发送 总线B分别经过2次抽搐延迟。
写入寄存器文件必须有3个抽头的延迟。
“注册文件”模块应具有以下界面:
module RegisterFile(BusA, BusB, BusW, RA, RB, RW, RegWr, Clk);
这是我目前的计划
module RegisterFile(BusA, BusB, BusW, RA, RB, RW, RegWr, Clk);
output [63:0] BusA;
output [63:0] BusB;
output [63:0] BusW;
input RA;
input RB;
input RW;
input RegWr;
input Clk;
reg [31:0] registers [31:0];
assign #2 BusA = registers [0];
assign #2 BusB = registers [1];
always @ (negedge Clk) begin
if(RegWr & RW !=0)
registers[RW] <= #3 BusW;
end
endmodule
我想知道如何将RA和RB初始化为零,并想知道如何正确地将数据从RA和RB发送到BusA和BusB
答案 0 :(得分:0)
首先需要在代码中更改一些内容
BusA,BusB和BusW是每64位宽的数据总线。 BusW用作输入总线,而BusA和BusB用作输出总线。因此,端口的声明需要更改为
input [63:0] BusW;
output [63:0] BusA, BusB;
寄存器文件的深度为32. RA,RB和RW是地址总线。这些地址需要5位宽。
input [4:0] RA,RB,RW;
然后可以将完整的代码重写为
module RegisterFile(BusA, BusB, BusW, RA, RB, RW, RegWr, Clk);
output [63:0] BusA, BusB;
input [63:0] BusW;
input [4:0] RA, RB, RW;
input RegWr;
input Clk;
reg [63:0] registers [31:0];
assign #2 BusA = registers[RA];
assign #2 BusB = registers[RB];
always @ (negedge Clk)
begin
if(RegWr)
if (RW != 4'd31)
registers[RW] <= #3 BusW;
else
// This is done to allow the user to reset the 0th location to a zero value.
registers[0] <= #3 'd0;
end
endmodule
我已经在edaplayground上模拟了这个代码,并且还创建了一个小测试平台来测试它。这是代码和测试平台的链接 https://www.edaplayground.com/x/5DXC