【问题标题】:How to find the size of a reg in verilog?如何在verilog中找到一个reg的大小?
【发布时间】:2015-12-10 00:37:31
【问题描述】:

我想知道是否有一种方法可以在 Verilog 中计算 reg 的大小。我研究了一番,发现了$size(a),但它只在SystemVerilog中,在我的verilog程序中不起作用。

有人知道这个的替代品吗?

我还想顺便问一下;我的测试台遇到了一些问题,因为当我更新文件中的值时,在模拟时没有考虑到这种变化。有人告诉我,我可能一直在使用旧的测试台,但我不断模拟的那个是这个项目中唯一可用的。

编辑:

为了让您了解问题所在:在我的代码中有一个“开始”信号,当它设置为 1 时,操作开始。否则,它将保持空闲状态。我开始用 start=0 编写测试台,测试并模拟它,然后通过将 start 设置为 1 来编辑测试台。但是当我模拟它时,波形中的启动信号仍然为 0。我试图检查我是否在使用另一个测试台,但它是我在这个项目中使用的唯一测试台。

鉴于我已经到了最后期限,我编写了代码,以便它能够适应“冻结”的测试平台。我现在得到了我想要的所有结果,但我想测试我的代码的一些其他功能,所以我创建了一个新项目并将代码复制粘贴到新文件中(包括相同的测试台)。但是当我运行仿真时,波形显示错误的结果(即使我在所有模块和测试台中使用完全相同的代码)。知道为什么吗?

任何帮助将不胜感激:)

【问题讨论】:

  • 您使用什么 Verilog 模拟器和版本?
  • Icarus Verilog (0.10.0 11/23/14) 支持 $size() 系统函数。看看这个例子:edaplayground.com/x/Gph
  • 我使用的是 ModelSim 10.4a PE 学生版。我确实尝试了 $size() 但它不适用于我的程序,它只是一直返回 0。

标签: testing size verilog system-verilog test-bench


【解决方案1】:

有一种标准化的方法可以做到这一点,但它需要您使用 VPI,我认为您在 Modelsim 的学生版上无法使用。简而言之,您必须编写 C 代码,并将其动态链接到模拟器。在 C 代码中,您可以使用诸如vpi_get 之类的例程来获取对象属性。有用的属性可能是vpiSize,这就是你想要的,vpiLeftRangevpiRightRange,等等。

话虽如此,Verilog 本质上是一种静态语言,并且必须使用常量表达式以静态宽度声明对象。因此,拥有一个确定对象大小的运行时方法的价值非常有限(因为您应该已经知道它),并且可能无法解决您实际遇到的任何问题。您的问题对于动态得多的 VHDL(和 SystemVerilog?)更有意义。

关于 Icarus 的注意事项:开发人员已将大量 SystemVerilog 内容推回到主要语言中。如果您利用这一点,您可能会发现您的代码不可移植。

您问题的第二部分:您需要具体说明您的问题究竟是什么。

【讨论】:

  • 是的,我不认为我可以获得 VPI,但感谢您的建议 :)
  • 这个 vpi 的东西可以合成吗?
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多