Verilog中任务task的使用_verilog task-程序员宅基地

技术标签: FPGA  Verilog  开发语言  

任务

任务类似于一段程序,可以使设计者从设计描述的不同位置执行共同的代码段。用任务定义可以将这个共同的代码段编写成任务,从而能够在设计描述的不同位置通过任务名调用该任务。任务可以包含时序控制即延时,而且任务也可以调用其他任务和函数

1.1任务的定义 

定义任务的格式如下:

tast [automatic] task_id;
  [declarations]...
  statements...
endtask

务可以没有参变量或者有一个或多个参变量。通过参变量可以将值传入和传出任务。除输入参变量外(任务接收到的值),任务还能有输出参变量(任务的返回值)和输入/输出(inout)参变量。任务的定义在模块声明部分编写,下面举例说明:

task rotate_left;
 inout[15:0] input_array;
 input [3:0] start_bit,stop_bit,rotate_by;
 reg fill_value;
 integer mac1,mac3;
 
 begin
   for(mac3=1;mac3<rotate_by;mac3++)
      begin
	     fill_value = input_array[stop_bit];
		 
		 for(mac1=stop_bit;mac1>start_bit+1;mac1--)
		     input_array[mac1]=input_array[mac1-1];
		 
		 input_array[start_bit]=fill_value;
	  end
 end
endtask

fill_value是一个局部变量,只有在任务中才直接可见。除任务参变量外,任务还能够引用任务定义所在模块中声明的任何变量。 

任务可以被声明为automatic类型。这样在任务中,任务内部声明的所有局部变量在每次任务调用时都进行动态分配,即在任务调用中的局部变量不会对两个单独或者并发的任务调用产生影响。而在静态(非automatic)任务中,在每次任务调用中的局部变量都使用同一个存储空间。借助关键字automatic就可以把任务指定为automatic类型。 

task automatic task_id(
            input.....
            output....
            inout....
            );
   reg...;
   wire...;
   ...
endtask

1.2任务的调用 

任务调用语句是一个过程性语句,可以出现在always或initial语句中,其格式如下:

task_id (expr1,expr2...exprN);

任务调用语句中,参变量列表必须与任务定义中的参变量列表顺序相匹配。此外,参变量是通过值进行传递的,而不是通过标记进行传递的。注意,由于任务能够包含时序控制,所以任务可能要在被调用后再经过一定延时才能返回值。此外,任务调用中的输出和输入/输出参变量必须是变量。如下例所示:

module global_var;
 reg [7:0] qram [63:0];
 integer index;
 reg check_bit;
 
 task get_parity;
   input [7:0] address;
   output parity_bit;
   parity_bit=^qram[address];//qram是模块内部的变量,任务中并没有声明;任务可以引用定义模块内的任何变量
 endtask
 
 initial begin
            for(index=0;index<63;index++)
               begin
                  get_parity(index,check_bit);
                  $display("Parity bit of memory word %d is %b.",index,check_bit);
               end
         end
endmodule

任务可以带有时序控制或者等待某些特定的事件发生。然而,直到任务退出时,赋给输出变量的值才传递给调用的参变量。看下例:

module task_wait;
 reg clk_ssp;
 
 task generate_waveform;
   output qclock;
   begin
      qclock=1;
	  #2 qclock=0;
	  #2 qclock=1;
	  #2 qclock=0;
   end
 endtask
 
 initial begin
            generate_waveform(clk_ssp);
         end
endmodule

任务和函数的共同点

1.任务函数必须在模块内定义,其作用范围仅适用于该模块,可以在模块内多次调用。
2.任务和函数可以声明局部变量,如寄存器,时间,整数,实数和事件,但是不能声明线网类型的变量
3.任务和函数只能使用行为级语句,但是不能包含always和initial块,设计者可以在always和initial块中调用任务和函数。

任务和函数的不同点
函数调用另一个函数,但是不能调用任务;

任务可以调用另一个任务,也可以调用函数
函数总是在仿真时刻0开始执行 

任务可以在非零时刻开始执行
函数一定不能包含任何延迟,事件或者时序控制声明语句

任务可以包含延迟,事件或者时序控制声明语句
函数至少要有一个输入变量,也可以有多个输入变量

任务可以没有或者有多个输入,输出,输入输出变量
函数只能返回一个值,函数不能有输出或者双向变量

任务不返回任何值,或者返回多个输出或双向变量值

由上述的特点决定:函数用于替代纯组合逻辑的verilog代码,而任务可以代替verilog的任何代码

任务

自动(可重入)任务:verilog任务中所有声明的变量地址空间都是静态分配的,因此如果在一个模块中多次调用任务时,可能会造成地址空间的冲突,为了避免这个问题,verilog通过在task关键字后面添加automatic使任务称为可重入的,这时在调用任务时,会自动给任务声明变量分配动态地址空间,这样有效避免了地址空间的冲突。

函数

函数使用关键字function和endfunction定义,对于子程序,如果满足下述所有条件则可以用函数来完成:

跟任务调用一样,在模块中如果调用多次函数,也会碰到地址冲突的问题,因此也引入automatic关键字来对函数可重用性声明。没有进行可重用性声明的函数不可以多次或者递归调用,进行了可重用性声明的函数可以递归调用。

常量函数和带符号函数(函数声明时加signed关键字说明)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Royonen/article/details/125493266

智能推荐

class和struct的区别-程序员宅基地

文章浏览阅读101次。4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始。2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量。1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。2.class允许继承、被继承,struct不允许,只能继承接⼝。3.Struct有性能优势,Class有⾯向对象的扩展优势。3.class可以初始化变量,struct不可以。1.class是引⽤类型,struct是值类型。

android使用json后闪退,应用闪退问题:从json信息的解析开始就会闪退-程序员宅基地

文章浏览阅读586次。想实现的功能是点击顶部按钮之后按关键字进行搜索,已经可以从服务器收到反馈的json信息,但从json信息的解析开始就会闪退,加载listview也不知道行不行public abstract class loadlistview{public ListView plv;public String js;public int listlength;public int listvisit;public..._rton转json为什么会闪退

如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet-程序员宅基地

文章浏览阅读219次。如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet

系统项目报表导出功能开发_积木报表 多线程-程序员宅基地

文章浏览阅读521次。系统项目报表导出 导出任务队列表 + 定时扫描 + 多线程_积木报表 多线程

ajax 如何从服务器上获取数据?_ajax 获取http数据-程序员宅基地

文章浏览阅读1.1k次,点赞9次,收藏9次。使用AJAX技术的好处之一是它能够提供更好的用户体验,因为它允许在不重新加载整个页面的情况下更新网页的某一部分。另外,AJAX还使得开发人员能够创建更复杂、更动态的Web应用程序,因为它们可以在后台与服务器进行通信,而不需要打断用户的浏览体验。在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的响应和更好的用户体验。_ajax 获取http数据

Linux图形终端与字符终端-程序员宅基地

文章浏览阅读2.8k次。登录退出、修改密码、关机重启_字符终端

随便推点

Python与Arduino绘制超声波雷达扫描_超声波扫描建模 python库-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏51次。前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!我先写了一个测试程序试了一下,OK!搞定_超声波扫描建模 python库

凯撒加密方法介绍及实例说明-程序员宅基地

文章浏览阅读4.2k次。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。2.使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。_凯撒加密

工控协议--cip--协议解析基本记录_cip协议embedded_service_error-程序员宅基地

文章浏览阅读5.7k次。CIP报文解析常用到的几个字段:普通类型服务类型:[0x00], CIP对象:[0x02 Message Router], ioi segments:[XX]PCCC(带cmd和func)服务类型:[0x00], CIP对象:[0x02 Message Router], cmd:[0x101], fnc:[0x101]..._cip协议embedded_service_error

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类_vs添加mfc库-程序员宅基地

文章浏览阅读2.4k次,点赞9次,收藏13次。有时候我们在MFC项目开发过程中,需要用到一些微软已经提供的功能,如VC++使用EXCEL功能,这时候我们就能直接通过VS2019到如EXCEL.EXE方式,生成对应的OLE头文件,然后直接使用功能,那么,我们上篇文章中介绍了vs2017及以前的版本如何来添加。但由于微软某些方面考虑,这种方式已被放弃。从上图中可以看出,这一功能,在从vs2017版本15.9开始,后续版本已经删除了此功能。那么我们如果仍需要此功能,我们如何在新版本中添加呢。_vs添加mfc库

frame_size (1536) was not respected for a non-last frame_frame_size (1024) was not respected for a non-last-程序员宅基地

文章浏览阅读785次。用ac3编码,执行编码函数时报错入如下:[ac3 @ 0x7fed7800f200] frame_size (1536) was not respected for anon-last frame (avcodec_encode_audio2)用ac3编码时每次送入编码器的音频采样数应该是1536个采样,不然就会报上述错误。这个数字并非刻意固定,而是跟ac3内部的编码算法原理相关。全网找不到,国内音视频之路还有很长的路,音视频人一起加油吧~......_frame_size (1024) was not respected for a non-last frame

Android移动应用开发入门_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量-程序员宅基地

文章浏览阅读230次,点赞2次,收藏2次。创建Android应用程序一个项目里面可以有很多模块,而每一个模块就对应了一个应用程序。项目结构介绍_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量

推荐文章

热门文章

相关标签