Verilog中建模行为
以下内容来源于《Verilog数字系统设计教程》
Task和function分别用来定义任务和函数,利用任务和函数可以把一个很大的程序模块分解为许多较小的任务和函数便于理解和调试,即增强了代码的可读性和可维护性。
Function和task说明语句的不同点:
(1)函数只能和主模块共用同一个仿真时间单位,而任务可以自己定义自己的仿真时间单位。
(2)函数不能启动任务,但是任务可以能启动其他任务和函数。
(3)函数至少要有一个输入变量,而任务可以没有或者有多个任何类型的变量。
(4)函数返回一个值,而任务则不返回值。
(5) 任务可以有任意多个输入、输入输出inout、输出变量;在任务中可以使用延迟、事件和时序控制结构,在任务中可以调用其他的任务和函数。
(6) 可重入任务使用关键字automatic进行定义,它的每一次调用都对不同的地址空间进行操作。因此在被多次并发调用时,它仍然可以获得正确的结果。
(7) 函数只能有一个返回值,并且至少要有一个输入变量;在函数中不能使用延迟、事件和时序控制结构,但可以调用其他函数,不能调用任务。
(8) 当声明函数时,Verilog仿真器都会隐含地声明一个同名的寄存器变量,函数返回值通过这个寄存器传递回调用处。
(9) 递归函数使用关键字automatic进行定义,递归函数的每一次调用都拥有不同的地址空间。因此对这种函数的递归调用和并发调用可以得到正确的结果。
(10) 任务和函数都包含在设计层次之中,可以通过层次名对它们进行调用。
注意:
在Verilog中函数不能调用任务,但在SystemVerilog对这条限制稍有放宽,允许函数调用任务,但只能在由 fork…join_none语句生成的线程中调用。