Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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_System Verilog_Hdl - Fatal编程技术网

为什么Verilog函数中不允许非阻塞分配?

为什么Verilog函数中不允许非阻塞分配?,verilog,system-verilog,hdl,Verilog,System Verilog,Hdl,我已经读到Verilog函数中不允许使用非阻塞赋值。有人能对此提出合理的解释吗?IEEE标准Verilog(1364-2001)第10.3.4节“功能规则”规定: 函数不应具有任何非阻塞分配 1800-2009 IEEE标准对此进行了详细阐述: 功能应无延迟地执行。因此,调用 功能应立即返回。不阻塞的语句应 允许在函数内部使用;具体来说,非阻塞分配, 事件触发器、时钟驱动器和fork-join_结构应 可以在函数中使用 其目的是使函数在Verilog事件队列中易于计算。如果您需要提前完成时间,请

我已经读到Verilog函数中不允许使用非阻塞赋值。有人能对此提出合理的解释吗?

IEEE标准Verilog(1364-2001)第10.3.4节“功能规则”规定:

函数不应具有任何非阻塞分配

1800-2009 IEEE标准对此进行了详细阐述:

功能应无延迟地执行。因此,调用 功能应立即返回。不阻塞的语句应 允许在函数内部使用;具体来说,非阻塞分配, 事件触发器、时钟驱动器和fork-join_结构应 可以在函数中使用


其目的是使函数在Verilog事件队列中易于计算。如果您需要提前完成时间,请使用
任务
而不是
函数

尽量不要考虑Verilog中的函数,就像C中的函数一样:

Verilog中的函数被设计成一种开发人员友好的方式,可以同时在多个位置实例化相同的组合逻辑,而无需重新编写/为其制作模块。许多Verilog的“新手”试图合理化函数,就像它们是C函数一样,当它们“返回”一个值时,最终将它们概念化为组合门块会更容易(也更正确)

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

当您学习Verilog时,请尽量不要将您编写的HDL合理化为“代码”,因为这是一种不同的思维方式


编辑:对我的部分做了一些不好的解释

在测试台上,在函数中有阻塞分配仍然没有意义。函数不是软件函数,即使在测试台中也是如此。即使是在SystemVerilog测试台中,它们也可以是非常“软件”的,它们仍然是硬件的代表,如果非常抽象的话。你的理由是值得怀疑的。函数是不可测试的。。。功能首先要像软件一样工作。任务和功能是不同的。任务被设计为像软件一样“按顺序”执行。函数的行为类似于组合逻辑。除非你写的是只存在于模拟器中的Verilog,否则这种差异实际上很重要。(修复了上面的混淆)这个问题并不是专门针对合成的,verilog函数显然是为了模仿C语言中的函数而设计的。是否缺少一个“not”呢?“非阻塞分配…应允许在函数内部。”直接与“函数不应具有任何非阻塞分配”相矛盾