【问题标题】:Why can't functions have delays?为什么函数不能有延迟?
【发布时间】:2018-03-05 17:04:04
【问题描述】:

Verilog 和 VHDL 都禁止函数延迟。此外,任务/过程不能有返回值。这意味着这样的代码:

if (my_function(arg) > 0) begin (...) end

必须替换为

int r;
my_task(arg, r);
if (r > 0) begin (...) end

如果需要延迟。为什么会有这个限制?似乎即使是 SystemVerilog 类成员函数也有它,这对我来说意义不大。

显然不能支持综合延迟,但是让综合工具在遇到延迟时产生错误是完全可以接受的,就像 always/process 块中的延迟一样。

【问题讨论】:

  • 这又回到了基本的语言设计原则,即表达式应该是无状态的并且没有副作用。函数是表达式的抽象。
  • 不纯函数可能有副作用。在上面的第一个代码示例中, my_function() 可以修改模块级信号。在 SystemVerilog 中,您甚至可以使用函数生成后台线程,据我所知,这显然违反了这一原则。
  • 对于 VHDL IEEE Std 1076-2008 9.3.4 函数调用,10.2 等待语句第 9 段“如果等待语句出现在函数子程序或具有父级的过程中是错误的一个功能子程序”)。函数调用是一个表达式,“......定义值计算的公式”(9.1)并且函数可以在声明中提供一个值(6.2、6.3、6.4、6.5、6.6、6.7、9.2、4.5 .2, 16.2),而“...wait 语句导致进程语句的暂停...” (10.2)。表达式不仅仅存在于语句中。
  • 是的,我记得这个;对于 VHDL 模拟器供应商来说,这一定很有趣。您甚至可以让一个函数调用一个过程调用另一个过程,如果第二个过程包含等待语句,则模拟器应该在编译时抛出错误。在 Verilog 中根本不允许从函数中调用任务,这听起来更容易实现。
  • 您必须能够搜索备份“详细说明”树以识别信号的进程驱动程序。

标签: vhdl verilog system-verilog


【解决方案1】:

无论是不是类方法,任务和函数的规则都是一样的。函数绝不能阻塞,并且对函数的调用,无论它是否返回值(void)都构成了它确实会阻塞的保证。

这个来自 Verilog 的规则是必需的,因为函数是表达式的一部分,并且在表达式中间永远不会有延迟。现在它用于显示意图,SystemVerilog 中的其他规则利用了这种非阻塞意图。 (即 DPI)。

【讨论】:

  • 表达式中间的延迟听起来确实是应该避免的。另一方面,据我所知,现有规则的行为是明确的。 (例如,从左到右执行并在结果已知时停止。)我认为在许多情况下,允许函数延迟或任务返回值会提供更易读的代码。
猜你喜欢
  • 2020-07-02
  • 1970-01-01
  • 2016-06-28
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多