繁体   English   中英

Verilog:比较测试台中的导线值

[英]Verilog: compare wire values in testbench

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

如果我使用!=进行比较, false预期是false

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

我唯一的猜测为什么data_a !== 32'h14可能是真的,是因为data_aSt0 St0 St0 ...32'h14 ,即0 0 0 ...如图所示: Modelsim中的模拟数据

我的理解是0St0的别名,因此不确定是否可能是原因。

测试平台的完整代码如下:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM