从寄存器文件(解压缩数组)中检索数据
Retrieving Data from Register File (Unpacked Array)
我尝试编写一个寄存器文件来从中更新和检索数据。这是我的代码
module RegisterFile(input logic clk
,input logic M_we // M_we is write enabled
,input logic M_re // M_re is read enabled
,input logic [2:0] M_add // Memory Adress
,input logic [3:0] M_wd // Memory write data
,output logic [3:0] M_rd // Memory read data
,output logic [3:0] rfOut [15:0]);
logic [3:0] rf [7:0]; // There will be seven slot on the register file
logic [3:0] readData;
always_ff@(posedge clk) begin
if(M_we) begin
rf[M_add] <= M_wd;
end
else if(M_re) begin
readData <= rf[M_add];
end
end
assign M_rd = readData;
endmodule
寄存器文件上有七个槽,每个槽可容纳 4 位数据。我认为必须有两个信号来决定寄存器文件是读操作还是写操作。对于写作,我使用了M_we
,对于阅读,我使用了M_re
。然后我写了这个testbench。
module RegisterFile_Simulation();
logic clk;
logic M_we;
logic M_re;
logic [2:0] M_add;
logic [3:0] M_wd;
logic [3:0] M_rd;
logic [3:0] rfOut [15:0];
RegisterFile DUT(clk, M_we, M_re, M_add, M_wd, M_rd, rfOut);
always begin
clk = 0;
#10;
clk = 1;
#10;
end
initial begin
M_we = 1;
M_re = 1;
M_add = 0;
M_wd = 1;
#10;
M_we = 0;
for(int b = 0; b < 8; b++) begin
M_add = b;
#10;
end
end
endmodule
在此测试台中,我希望在 rf[0]
处看到 1,因为 M_add
在 0 的第一次迭代中将为 0。另一方面,我只得到 xxxx结果,这意味着它是未定义的。我认为我的测试台是错误的,但它也不适用于其他测试台。为什么这个代码块不能设置 rf[0]
= 1 ?
您在测试台中存在竞争条件。设计 (RegisterFile
) 不会将 M_we
信号采样为 1。
您应该像在设计中驱动信号一样在测试台中驱动同步输入:使用 @(posedge clk)
并使用非阻塞分配 (<=
):
initial begin
M_we = 1;
M_re = 1;
M_add = 0;
M_wd = 1;
@(posedge clk);
M_we <= 0;
for(int b = 0; b < 8; b++) begin
@(posedge clk);
M_add <= b;
end
end
我尝试编写一个寄存器文件来从中更新和检索数据。这是我的代码
module RegisterFile(input logic clk
,input logic M_we // M_we is write enabled
,input logic M_re // M_re is read enabled
,input logic [2:0] M_add // Memory Adress
,input logic [3:0] M_wd // Memory write data
,output logic [3:0] M_rd // Memory read data
,output logic [3:0] rfOut [15:0]);
logic [3:0] rf [7:0]; // There will be seven slot on the register file
logic [3:0] readData;
always_ff@(posedge clk) begin
if(M_we) begin
rf[M_add] <= M_wd;
end
else if(M_re) begin
readData <= rf[M_add];
end
end
assign M_rd = readData;
endmodule
寄存器文件上有七个槽,每个槽可容纳 4 位数据。我认为必须有两个信号来决定寄存器文件是读操作还是写操作。对于写作,我使用了M_we
,对于阅读,我使用了M_re
。然后我写了这个testbench。
module RegisterFile_Simulation();
logic clk;
logic M_we;
logic M_re;
logic [2:0] M_add;
logic [3:0] M_wd;
logic [3:0] M_rd;
logic [3:0] rfOut [15:0];
RegisterFile DUT(clk, M_we, M_re, M_add, M_wd, M_rd, rfOut);
always begin
clk = 0;
#10;
clk = 1;
#10;
end
initial begin
M_we = 1;
M_re = 1;
M_add = 0;
M_wd = 1;
#10;
M_we = 0;
for(int b = 0; b < 8; b++) begin
M_add = b;
#10;
end
end
endmodule
在此测试台中,我希望在 rf[0]
处看到 1,因为 M_add
在 0 的第一次迭代中将为 0。另一方面,我只得到 xxxx结果,这意味着它是未定义的。我认为我的测试台是错误的,但它也不适用于其他测试台。为什么这个代码块不能设置 rf[0]
= 1 ?
您在测试台中存在竞争条件。设计 (RegisterFile
) 不会将 M_we
信号采样为 1。
您应该像在设计中驱动信号一样在测试台中驱动同步输入:使用 @(posedge clk)
并使用非阻塞分配 (<=
):
initial begin
M_we = 1;
M_re = 1;
M_add = 0;
M_wd = 1;
@(posedge clk);
M_we <= 0;
for(int b = 0; b < 8; b++) begin
@(posedge clk);
M_add <= b;
end
end