在Verilog中实现一个32x64寄存器文件
以下是注册表文件的规格:在Verilog中实现一个32x64寄存器文件,verilog,armv8,Verilog,Armv8,以下是注册表文件的规格: 总线A、B和W的宽度为64位 input [4:0] RA,RB,RW; 当RegWr设置为1时,总线W上的数据存储在 由Rw指定的寄存器,位于负(下降)时钟边缘 寄存器31必须始终读取零 来自寄存器(由Ra和Rb指定)的数据通过总线A和总线B发送 总线B分别延迟2秒后 写入寄存器文件的延迟必须为3秒 寄存器文件模块应具有以下接口: module RegisterFile(BusA, BusB, BusW, RA, RB, RW, RegWr, Clk); 这是
- 总线A、B和W的宽度为64位
当RegWr设置为1时,总线W上的数据存储在 由Rw指定的寄存器,位于负(下降)时钟边缘 寄存器31必须始终读取零 来自寄存器(由Ra和Rb指定)的数据通过总线A和总线B发送 总线B分别延迟2秒后 写入寄存器文件的延迟必须为3秒input [4:0] RA,RB,RW;
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
模块寄存器文件(BusA、BusB、BusW、RA、RB、RW、RegWr、Clk);
输出[63:0]BusA;
输出[63:0]母线;
输出[63:0]BusW;
输入RA;
输入RB;
输入RW;
输入RegWr;
输入时钟;
reg[31:0]寄存器[31:0];
分配#2 BusA=寄存器[0];
分配#2总线=寄存器[1];
始终@(negedge Clk)开始
如果(RegWr&RW!=0)
寄存器[RW]首先需要在代码中更改一些内容
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
模块寄存器文件(BusA、BusB、BusW、RA、RB、RW、RegWr、Clk);
输出[63:0]总线A、总线B;
输入[63:0]BusW;
输入[4:0]RA、RB、RW;
输入RegWr;
输入时钟;
寄存器[63:0]寄存器[31:0];
分配#2 BusA=寄存器[RA];
分配#2总线=寄存器[RB];
始终@(negedge Clk)
开始
if(RegWr)
如果(RW!=4'd31)
寄存器[RW]