在 Verilog 中实现 32x64 寄存器文件
Implement a 32x64 register file in Verilog
寄存器文件的规格如下:
总线 A、B 和 W 为 64 位宽。
当RegWr设置为1时,则Bus W上的数据存放在
由 Rw 指定的寄存器,在负(下降)时钟边沿。
寄存器 31 的读数必须始终为零。
来自寄存器的数据(由 Ra 和 Rb 指定)在总线 A 上发送,并且
总线 B 分别在延迟 2 次抽动后。
写入寄存器文件必须有 3 个 tic 的延迟。
注册文件模块应该有如下接口:
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
首先需要在代码中更改一些内容
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上模拟了这段代码,还创建了一个小的testbench来测试它。这是代码和测试平台的 link
https://www.edaplayground.com/x/5DXC
寄存器文件的规格如下:
总线 A、B 和 W 为 64 位宽。
当RegWr设置为1时,则Bus W上的数据存放在 由 Rw 指定的寄存器,在负(下降)时钟边沿。
寄存器 31 的读数必须始终为零。
来自寄存器的数据(由 Ra 和 Rb 指定)在总线 A 上发送,并且 总线 B 分别在延迟 2 次抽动后。
写入寄存器文件必须有 3 个 tic 的延迟。
注册文件模块应该有如下接口:
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
首先需要在代码中更改一些内容
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上模拟了这段代码,还创建了一个小的testbench来测试它。这是代码和测试平台的 link https://www.edaplayground.com/x/5DXC