为什么Verilog函数中不允许使用非阻塞赋值?

7
我已经了解到在Verilog函数中不允许使用非阻塞赋值语句。有人能给出一个合理的解释吗?
2个回答

9
IEEE Std for Verilog (1364-2001)中的“10.3.4函数规则”规定:函数不应有任何非阻塞赋值。
IEEE Std 1800-2009更详细地阐述了这一点:函数应该没有延迟。因此,调用函数的进程应立即返回。函数内允许使用不阻塞赋值、事件触发器、时钟驱动和fork-join_none结构的语句。
这是为了使Verilog事件队列中函数的评估更加简单。如果需要推进时间,请使用任务(task)而不是函数。

0

在Verilog中,不要把函数想象成C语言中的函数:

Verilog中的函数旨在以一种对开发人员友好的方式在多个位置同时实例化相同的组合逻辑,而不是重复编写/为其制作模块。 很多对Verilog新手尝试通过类比C语言中的函数来理解函数,虽然它们“返回”一个值,但最终更容易(也更正确)将它们概念化为组合门块。

请注意,这与“任务”不同,后者更通常用于按顺序执行事物,在测试平台情况下比函数更有用

当你学习Verilog时,请不要把你写的HDL理解为“代码”,因为这是一种不同的思维方式。

编辑:删去了我部分错误的解释。


1
在测试台中,将阻塞赋值语句放在函数中仍然没有意义。函数并不是软件函数,即使在测试台中也是如此。尽管在SystemVerilog测试台等环境中,测试台可能非常类似于“软件”,但它们仍然代表硬件,即使是抽象的硬件。 - omicron
1
你对阻塞和非阻塞的术语理解有误,而且你的理由令人怀疑。函数是可以被测试的。 - Jan Decaluwe
1
函数的首要目的是在软件中发挥作用。 - Jan Decaluwe
任务和函数是不同的。任务被设计成像软件一样按顺序执行。函数则像组合逻辑一样运行。除非你在编写只存在于模拟器环境中的Verilog代码,否则这种区别实际上很重要。(已修正上述的混淆) - omicron
@omicron 函数没有副作用,任务(过程)有。纯软件概念。 - Jan Decaluwe
1
该问题并不特定于综合,Verilog函数明显设计成模仿像C语言这样的语言的函数。 - user597225

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接