【问题标题】:verilog testbench compare cause errorsverilog testbench比较原因错误
【发布时间】:2013-10-11 03:00:07
【问题描述】:

我有一个最奇怪的问题,我办公室的人都没有遇到过或知道如何处理,也许你们会发现问题所在。

在我的 verilog 测试平台中,我有以下比较代码:

if (refFifo[7:0] != DUT.fifo[7:0] && rnd == 1) begin
  $display("Error! ref Fifo %h not equal DUT fifo %h after 1 byte", refFifo[7:0], DUT.fifo[7:0]);
  $stop;
end
else if (refFifo[15:0] != DUT.fifo[15:0] && rnd == 2) begin
  $display("Error! ref Fifo %h not equal DUT fifo %h after 2 byte", refFifo[15:0], DUT.fifo[15:0]);
  $stop;
end

...(直到 5 个字节)
else
$display("Success!");

现在,问题是 2 的比较总是失败,而其余的比较顺利通过(这搞砸了我的运行):
'>错误:ref Fifo 090c 在 2 个字节后不等于 DUT fifo 090c'
我尝试在此过程中更改比较的位置,在比较之前打印值(以防它们在比较期间以某种方式发生变化),添加括号,将比较范围更改为 [7:0] 并构建一个新环境,但没有任何帮助或给出一些关于比较 2 个字节时出了什么问题的指示。
有没有人遇到过这样的问题?有人知道如何解决吗?
我在没有优化的情况下使用 ModelSim 10.1d_1 运行,以防它与我的谜团有关。
更新也在 ModelSim 10.0d_1 上尝试过,但没有任何帮助。

【问题讨论】:

标签: verilog


【解决方案1】:

我看不出您的代码有什么问题。 && 的结果必须是 1'b1 才能执行 $display。这意味着两个比较的结果也必须为1'b1,因此resFifoDUT.fifornd 中没有任何未知数。您应该将比较运算符更改为 !===== 以确认这一点。 ModelSim 也不会使用 %h 修饰符打印任何 X。为了确定,我将其更改为 %b

除非我遗漏了一些明显的东西,否则我会删除跨模块引用 (DUT.fifo) 并重试。从 DUT 中获取一个 fifo 端口,并与端口值进行比较。这可能有助于追查问题。

【讨论】:

  • 尝试了 !== 和 %b 但没有用。由于所有其他比较都使用相同的机制(resFifo 与 DUT.fifo 相比),我不明白这可能是什么问题,但是当我在 wave 上使用它们时,我可以看到它们是相同的。这是一个棘手的问题,不是吗?
  • 我会尝试 DUT.fifo 的东西 - 删除跨模块引用,看看它是否有所作为。
  • 哇,这很奇怪......如果你添加这样的括号怎么办:((refFifo[15:0] != DUT.fifo[15:0]) && rnd == 2) 以确保操作是否以正确的顺序完成?在这里只是在黑暗中拍摄...我要检查的另一件事是查看您的另一段代码是否干扰了此 IF 语句。尝试从这个文件中取出这个进程,并在它自己的文件中运行它。
  • @Russell 我已经尝试过您建议的括号内容,但没有用。比较过程在漫长的过程结束时起作用,请详细说明将其从文件中取出的含义。
  • 其他的尝试。这不太可能是竞态问题,因为 ModelSim 几乎肯定只会在到达代码中的事件控件时运行调度程序,而这里没有事件控件。但是,它可能在到达$display 时也运行调度程序,并且在显示产生输出之前另一个进程正在更改resFifoDUT.fifo。通过在$display 之前存储它们的值并打印存储的值来测试这一点。
【解决方案2】:

您的代码对我来说看起来不错。您可能遇到了模拟器错误;如果您可以在测试用例中重现此内容,则应将其提交给 Mentor 支持。

这里有一些其他的尝试:

  • if 语句之前为 DUT 值创建一个 5 字节的局部变量,并在检查中使用它。
  • 更改检查顺序,以便您首先查看rnd。这样,表达式将短路并避免在您不需要检查的情况下比较 DUT 值。
  • 重构检查以在rnd 上使用case 语句。包含默认情况可能有助于调试rnd != 2 的任何问题。
  • 删除该行并手动重新键入。或复制/粘贴另一行并更改数字。我见过一些奇怪的情况,隐藏/错误/unicode 字符会编译并运行,但会导致某些行为异常。

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    相关资源
    最近更新 更多