[英]Verilog: compare wire values in testbench
在测试平台中,我试图做一个非常简单的比较,即data_a !== 32'h14
,这令人惊讶地得出true
,但是在模拟中我清楚地看到data_a
恰好是32'h14
。
如果我使用!=
进行比较, false
预期是false
。
我不想使用!=
的原因是因为它可能导致X
在我的测试用例中充当false
。 因此,我已经错误地通过了测试。
我唯一的猜测为什么data_a !== 32'h14
可能是真的,是因为data_a
由St0 St0 St0 ...
和32'h14
,即0 0 0 ...
如图所示:
我的理解是0
是St0
的别名,因此不确定是否可能是原因。
测试平台的完整代码如下:
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
UPD。 答案是竞态条件(更多信息请参见Verilog教程的第3章),在设置addr_a
和读取结果( data_a
)之间几乎没有时间花费-模块register_file
在同一时间点对其进行了更新( 0
) ,但比阅读晚 。 一种解决方案可能是在设置和读取之间添加延迟(例如#1
),以确保为时隙0
安排的所有动作都已执行。
这很可能是比赛条件。 data_a
可能仍然是32'bx
时间为0时, If
语句执行。 在其前面放置一个$display
。 导线需要一些增量周期来传播值变化。 仅当导线上有多个驱动程序将值解析为0,1,X或Z时,才使用强度。
Verilog将所有连线初始化为“ x”。
在完成任何实际仿真之前, 初始块在时间0执行。 因此,在执行“ if”语句时,data_a和data_b的值为“ x”。 'x' 不等于或等于 h14或h40; 因此,您的情况应正确评估为true。 结果,您的“获取”操作将失败。
如果将“ x”与“ x”相比较的绝对相同的变量进行比较,则===运算符返回true。
'x' === 'x' ==> true
'x' === '1' ==> false
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.