verilog中task的用法

本文系转载。转载网址:https://www.cnblogs.com/xiaoyueqingfeng/articles/3788193.html

在Verilog HDL中,task可以有输入,输出,并且可以调用其他task和function。这与function不一样,function只能调用function,且不能有输出,只能通过函数名来返回一个值。任务可以消耗时间,而函数不能。消耗时间是指:使用#10这类的时延语句,和@(posedge clk),wait(ready)这类的阻塞语句。

下面有下划线的部分是不太正确,后半部分进行了更正。

在书写一个testbench时,写了如下task

Verilog <wbr>HDL中的task任务

最上面那行是调用该task,可仿真时总是不出现预期结果,经过查找资料,找到一个解释是:task的返回值是在task完成以后才返回。用task只能得到最终的一个值,不能得到连续值。所以task适合在某个时刻给某个信号赋值,而不适合给某个信号在一段时间内不间断的赋值。
我把数据拆开,把task写成如下形式:

Verilog <wbr>HDL中的task任务
发现还是不能得到正确结果,猜测跟内部的@(posedge clk)有关,于是将其删除,得到如下形式:

Verilog <wbr>HDL中的task任务
至此,结果正确。这是Verilog HDL书中最基本的task写法。本来想举一反三,让代码更简洁,谁知道完全不正确,故只有完全按照书上所述规则书写task和function。

 

在看了SystemVerilog验证中第一章的例1.2后,发现上面的说法不甚正确,于是又对上面的程序进行了更改并仿真。其实task是可以对一个信号进行连续赋值的。

书中的例子是这样来进行的:task有2个输入数据,用它们对task外的信号(必须是task所在module的信号)进行赋值,这些信号不需要在task的端口中进行声明。

按照类似的做法,我进行了如下的更改

Verilog <wbr>HDL中的task任务
这样则得到了正确的结果。

在此有点需要注意:

  1. task端口中的信号不要与所在module的信号同名。因为task可以引用其所在module中的所有信号,这样可能会造成信号的冲突。上面的写法可能就是由于“in,out”这2个信号与所在module中的信号同名,导致冲突。我更改后的写法是把“in”改成了“sti_in”。

  2. task是可以使用所在module中的信号的。所以没必要对task内部所用信号全部在端口中声明,这样可以简化task的代码,更改后的写法则没有在端口中声明“in”这个信号。

阅读更多
换一批

没有更多推荐了,返回首页