Verilog HDL中的task任务

标签:
veriloghdltask |
分类: 数字IC |
在Verilog HDL中,task可以有输入,输出,并且可以调用其他task和function。这与function不一样,function只能调用function,且不能有输出,只能通过函数名来返回一个值。任务可以消耗时间,而函数不能。消耗时间是指:使用#10这类的时延语句,和@(posedge clk),wait(ready)这类的阻塞语句。
下面有下划线的部分是不太正确,后半部分进行了更正。
在书写一个testbench时,写了如下task
http://s2/mw690/7e2e98adgdbe1fba8b4c1&690HDL中的task任务" TITLE="Verilog
最上面那行是调用该task,可仿真时总是不出现预期结果,经过查找资料,找到一个解释是:task的返回值是在task完成以后才返回。用task只能得到最终的一个值,不能得到连续值。所以task适合在某个时刻给某个信号赋值,而不适合给某个信号在一段时间内不间断的赋值。
我把数据拆开,把task写成如下形式:
http://s13/mw690/7e2e98adgdbe21272f12c&690HDL中的task任务" TITLE="Verilog
发现还是不能得到正确结果,猜测跟内部的@(posedge clk)有关,于是将其删除,得到如下形式:
http://s11/mw690/7e2e98adg7c6368ce2b2a&690HDL中的task任务" TITLE="Verilog
至此,结果正确。这是Verilog
HDL书中最基本的task写法。本来想举一反三,让代码更简洁,谁知道完全不正确,故只有完全按照书上所述规则书写task和function。
在看了SystemVerilog验证中第一章的例1.2后,发现上面的说法不甚正确,于是又对上面的程序进行了更改并仿真。其实task是可以对一个信号进行连续赋值的。
书中的例子是这样来进行的:task有2个输入数据,用它们对task外的信号(必须是task所在module的信号)进行赋值,这些信号不需要在task的端口中进行声明。
按照类似的做法,我进行了如下的更改
http://s5/mw690/7e2e98adgdc078d6bcf04&690HDL中的task任务" TITLE="Verilog
这样则得到了正确的结果。
在此有点需要注意: