Verilog:比较测试平台

时间:2017-06-25 19:58:07

标签: verilog

在测试平台中,我试图做一个非常简单的比较,即data_a !== 32'h14,这令人惊讶地导致true,但在模拟中我清楚地看到data_a正是{{1} }}

如果我使用32'h14对其进行比较,则会按预期进行!=

我之所以不想使用false,是因为它可能会导致!=在我的测试用例中充当X。由于这个原因,我已经错误地通过了测试。

我唯一猜到false可能属实的原因是data_a !== 32'h14data_aSt0 St0 St0 ... 32'h14组成,如图所示: Simulation data in Modelsim

我的理解是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安排的所有操作都已执行。

2 个答案:

答案 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