我是靠谱客的博主 大方皮皮虾,最近开发中收集的这篇文章主要介绍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”这个信号。

最后

以上就是大方皮皮虾为你收集整理的verilog中task的用法的全部内容,希望文章能够帮你解决verilog中task的用法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部