概述
本文系转载。转载网址:https://www.cnblogs.com/xiaoyueqingfeng/articles/3788193.html
在Verilog HDL中,task可以有输入,输出,并且可以调用其他task和function。这与function不一样,function只能调用function,且不能有输出,只能通过函数名来返回一个值。任务可以消耗时间,而函数不能。消耗时间是指:使用#10这类的时延语句,和@(posedge clk),wait(ready)这类的阻塞语句。
下面有下划线的部分是不太正确,后半部分进行了更正。
在书写一个testbench时,写了如下task
最上面那行是调用该task,可仿真时总是不出现预期结果,经过查找资料,找到一个解释是:task的返回值是在task完成以后才返回。用task只能得到最终的一个值,不能得到连续值。所以task适合在某个时刻给某个信号赋值,而不适合给某个信号在一段时间内不间断的赋值。
我把数据拆开,把task写成如下形式:
发现还是不能得到正确结果,猜测跟内部的@(posedge clk)有关,于是将其删除,得到如下形式:
至此,结果正确。这是Verilog HDL书中最基本的task写法。本来想举一反三,让代码更简洁,谁知道完全不正确,故只有完全按照书上所述规则书写task和function。
在看了SystemVerilog验证中第一章的例1.2后,发现上面的说法不甚正确,于是又对上面的程序进行了更改并仿真。其实task是可以对一个信号进行连续赋值的。
书中的例子是这样来进行的:task有2个输入数据,用它们对task外的信号(必须是task所在module的信号)进行赋值,这些信号不需要在task的端口中进行声明。
按照类似的做法,我进行了如下的更改
这样则得到了正确的结果。
在此有点需要注意:
1. task端口中的信号不要与所在module的信号同名。因为task可以引用其所在module中的所有信号,这样可能会造成信号的冲突。上面的写法可能就是由于“in,out”这2个信号与所在module中的信号同名,导致冲突。我更改后的写法是把“in”改成了“sti_in”。
2. task是可以使用所在module中的信号的。所以没必要对task内部所用信号全部在端口中声明,这样可以简化task的代码,更改后的写法则没有在端口中声明“in”这个信号。
最后
以上就是大方皮皮虾为你收集整理的verilog中task的用法的全部内容,希望文章能够帮你解决verilog中task的用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复