【发布时间】: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