Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
verilog测试台比较原因错误_Verilog - Fatal编程技术网

verilog测试台比较原因错误

verilog测试台比较原因错误,verilog,Verilog,我有一个最奇怪的问题,我办公室的人都没有遇到过,也不知道如何处理,也许你们会发现问题出在哪里 在我的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 i

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

在我的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的比较总是失败的,而其余的比较都顺利通过(这会让我的跑步变得一团糟):
“>错误:参考Fifo 090c不等于2字节后的DUT Fifo 090c”
我尝试在这个过程中更改比较的位置,在比较之前打印值(以防它们在比较过程中发生变化),添加括号,将比较范围更改为[7:0]并构建一个新的环境,但没有任何帮助,也没有指出2字节的比较出了什么问题。
有人遇到过这样的问题吗?有人知道如何解决这个问题吗?
我使用ModelSim 10.1d_1运行,没有进行任何优化,以防它与我的谜有关。

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

我看不出您的代码有任何问题。
&
的结果必须是
1'b1
,才能执行
$display
。这意味着两个比较的结果必须是
1'b1
,因此
resFifo
DUT.fifo
rnd
中没有任何未知项。您应该将比较运算符更改为
==
===
来确认这一点。ModelSim也没有使用
%h
修改器打印任何X。我想把它改成
%b
,只是为了确定一下


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

我觉得您的代码很好。您可能遇到了一个模拟器错误;如果您可以在测试用例中复制此内容,则应将其提交给Mentor支持部门

以下是其他一些可以尝试的东西:

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

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