加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Verilog HDL中的task任务

(2013-05-04 18:27:00)
标签:

veriloghdl

task

分类: 数字IC

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

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

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

http://s2/mw690/7e2e98adgdbe1fba8b4c1&690HDL中的task任务" TITLE="Verilog HDL中的task任务" />

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

http://s13/mw690/7e2e98adgdbe21272f12c&690HDL中的task任务" TITLE="Verilog HDL中的task任务" />
发现还是不能得到正确结果,猜测跟内部的@(posedge clk)有关,于是将其删除,得到如下形式:

http://s11/mw690/7e2e98adg7c6368ce2b2a&690HDL中的task任务" TITLE="Verilog HDL中的task任务" />
至此,结果正确。这是Verilog HDL书中最基本的task写法。本来想举一反三,让代码更简洁,谁知道完全不正确,故只有完全按照书上所述规则书写task和function。

 

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

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

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

http://s5/mw690/7e2e98adgdc078d6bcf04&690HDL中的task任务" TITLE="Verilog HDL中的task任务" />
这样则得到了正确的结果。

在此有点需要注意:

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

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有