在测试平台中,我试图做一个非常简单的比较,即data_a !== 32'h14
,这令人惊讶地导致true
,但在模拟中我清楚地看到data_a
正是{{1} }}
如果我使用32'h14
对其进行比较,则会按预期进行!=
。
我之所以不想使用false
,是因为它可能会导致!=
在我的测试用例中充当X
。由于这个原因,我已经错误地通过了测试。
我唯一猜到false
可能属实的原因是data_a !== 32'h14
由data_a
和St0 St0 St0 ...
32'h14
组成,如图所示:
我的理解是0 0 0 ...
是0
的别名,因此不确定这是否是原因。
测试平台的完整代码如下:
St0
UPD。答案是竞争条件(更多关于verilog tutorial,第3章中的内容)
设置module test_registers(clk);
input clk;
reg error = 0;
reg write = 0;
reg [4:0] addr_a = 0, addr_b = 0, addr_in = 0;
reg [31:0] data_in = 0;
wire [31:0] data_a, data_b;
register_file MUT(data_a, data_b, addr_a, addr_b, addr_in, data_in, write, clk);
initial begin
$readmemh("tests/registers/reg.dat", MUT.registers);
addr_a = 1;
addr_b = 2;
if (data_a !== 32'h14 || data_b !== 32'h40) begin
$display("Fetch 1 failed");
error = 1;
end
end
endmodule
和阅读结果(addr_a
)之间几乎没有花时间 - 模块data_a
在同一时间点(register_file
)更新了它,但< em>以后而不是读取。
解决方案可能是在set和read之间添加延迟(例如0
),以便保证为时隙#1
安排的所有操作都已执行。
答案 0 :(得分:2)
这很可能是竞争条件。 data_a
语句执行时,32'bx
在时间0可能仍为If
。在它前面放一个$display
。线路需要一些增量周期来传播值变化。仅当线上有多个驱动程序将值解析为0,1,X或Z时才使用强度。
答案 1 :(得分:0)
Verilog将所有导线初始化为'x'。
初始块在任何实际模拟完成之前在时间0执行。因此,在'if'语句时,data_a和data_b的值为'x'。 'x'是而不是===等于到h14或h40;因此,您的情况被正确地评估为真。结果,你的'fetch'应该会失败。
如果比较绝对相同的变量,其中'x'与'x'进行比较并返回true,则===运算符返回true。'x' === 'x' ==> true
'x' === '1' ==> false