0

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

在我的 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 个字节) 现在,问题是 2 的比较总是失败,而其余的比较顺利通过(这搞砸了我的运行): '>错误:参考 Fifo 090c 不等于 DUT fifo 090c after 2 byte' 我尝试在过程中更改比较的位置,在比较之前打印值(以防它们在比较过程中以某种方式改变),添加括号,将比较范围更改为 [7:0] 并构建一个新的环境,但没有任何帮助或表明比较 2 个字节时出了什么问题。 有没有人遇到过这样的问题?有谁知道如何解决它? 我使用没有优化的 ModelSim 10.1d_1 运行,以防它与我的谜团有关。
else
$display("Success!");






更新也在 ModelSim 10.0d_1 上尝试过,但没有任何帮助。

4

2 回答 2

0

I can't see anything wrong with your code. The result of the && must be 1'b1 for the $display to be executed. This means both comparisons must also have a result of 1'b1, so there aren't any unknowns in resFifo, DUT.fifo, or rnd. You should change your comparison operators to !== and === to confirm this. ModelSim is also not printing any X's with the %h modifier. I'd change this to %b just to be sure.

Unless I've missed something obvious, I'd remove the cross-module reference (DUT.fifo) and try again. Get a fifo port out of the DUT, and do the comparison against the port value. This might help to track down the issue.

于 2013-10-10T10:04:39.217 回答
0

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

以下是一些其他的尝试:

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