task 和 function 说明语句分别用来定义任务和函数,利用任务和函数可以把函数模块分成许多小的任务和函数便于理解和调试。任务和函数往往还是大的程序模块在不同地点多次用到的相同的程序段。输入、输出和总线信号的数据可以传入、传出任务和函数。

task 和 function 的不同:

1)函数只能与主模块共用同一个仿真的时间单位,而任务可以自己定义自己的仿真时间单位。

2)函数不能启动任务,但是可以调用其它函数,但是任务可以调用其他函数和任务;

3)函数至少要有一个输入变量,而任务可以没有或者有多个任何类型的变量。

4)函数返回一个值,而任务不返回任何值。

函数的目的值通过一个返回值对输入的信号进行响应。而任务可以支持多种目的,能计算多个结果值,这些值只能通过任务的输出端口或者总线端口输出。

A) task说明语句

如果传给任务的变量和任务完成后接受结果的变量已经定义,就可以用一条语句启动任务,任务完成以后控制就传回启动过程。如果任务内部有定时设置,则启动的时间可以与控制返回的时间不同。

1)任务的定义;

task <任务名>;

<端口及数据类型声明语句>

<语句1>

...

<语句n>

endtask

2)任务的调用以及变量的传递:

任务定义;

task  my_task;

input a,b;

inout c;

output  d,e;

....                                 //执行任务的相应语句

c=foo1;                         //对任务的变量赋初始值

b=foo2;

e=foo3;

endtask

任务的调用: my_task(v,w,x,y,z)

任务调用变量(v,w,x,y,z)和任务定义的I/O变量(a,b,c,d,e)是一一对应的。任务启动时,v,w和x的值给了a b c,结束时c,d,e的值返回给x,y,z。

B)function说明语句

函数的目的是返回一个用于表达式的值。定义函数的语法:

function <返回值的类型或范围>函数名;

<端口说明语句>

<变量类型说明语句>

begin

<语句>

...

end

endfunction

在这里,<返回值的类型或范围>可以不定义,如果默认则代表一位寄存器类型数据。

1)函数返回的值:函数的定义蕴含声明了一个与函数同名的,函数内部的寄存器,其位数与定义的相同;

2)函数的调用:函数的调用是通过将函数作为表达式中的操作数来实现的。例:word=control ? {getbyte(msbyte),getbyte(lsbyte)} : 0;

3)函数的使用规则:

a)函数的定义不能包含任何的时间控制语句,及任何用# ,@,或wait来标识的语句。

b)函数不能启动任务,定义函数至少输入一个输入参量;

c)函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的值,该内部变量具有和函数名一样的名字。

d)函数的输入变脸不能像模块的端口那样列在函数名后面的括弧内,在声明输入时把这些输入端口列出即可。函数不能被禁用。

 module parity;
reg [:]sddr;
reg parity;
initial
begin
addr='b3456_789a;
# addr='bc4c6_78ff;
# addr='bff56_ff9a;
# addr='b3faa_aaaa;
end
//每当地址未发生变化,重新计算偶校验位
always @(addr)
begin
parity=cal_parity(addr);
$display("parity calculated = %b",cal_paraty(addr));
end
//定义偶检验函数
function cal_parity;
input [:]address;
begin
cal_parity=^address;
end
endfunction
endmodule

偶校验位函数

在上例中,函数的定义也可以采用C语言的风格定义,如:function cal_paruty(input [31:0] address);

Verilog中的函数是不能进行递归调用的。在设计模块中如果某个函数在两个不同位置同时并发被调用,由于这两个调用同时对同一地址进行操作,那么计算结果将是不定值。但是可以在函数声明时使用automatic关键字,那么在调用时,仿真器将为函数分配不同的地址。每个函数调用各自的地址。因此:自动函数中声明的局部变量不能通过层次名进行访问,而自动函数本身可以通过层次名进行调用。

例:factorial=factorial(n-1)*n;

关于函数和任务的小结:

1)任务和函数都是用来对设计中多处使用的公共代码进行定义,使用任务和函数增强模块的可读性和可维护性。

2)可重入任务用关键词automatic定义,他的每一次调用都对不同的地址进行操作。因此可以多次并发调用时,也可得到正确的结果。

3)函数只能返回一个值,并且至少需要一个输入变量;在函数中不能使用延迟、事件和时序控制结构,但是可以调用其他函数,不能调用任务。

4)任务可以具有任意个输入、输入输出/输出、输出变量,在任务中可以使用延时、事件和时序控制结构,可以自定义时钟,可以调用其他函数和任务。

5)递归函数必须使用automatic关键词进行定义,递归函数的每一次调用都调用不同的地址空间,因此这种函数的递归调用和并发调用可以得到正确结果。

Verilog学习笔记基本语法篇(九)········ 任务和函数的更多相关文章

  1. Verilog学习笔记基本语法篇(十二)········ 编译预处理

    h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...

  2. Verilog学习笔记基本语法篇(十一)········ 常用系统函数

    1)系统任务:$monitor   格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...

  3. Verilog学习笔记基本语法篇(十三)...............Gate门

    Verilog中已有一些建立好的逻辑门和开关的模型.在所涉及的模块中,可通过实例引用这些门与开关模型,从而对模块进行结构化的描述. 逻辑门: and (output,input,...) nand ( ...

  4. Verilog学习笔记基本语法篇(十)········ 常用系统函数

    $display 和 $write 任务 格式: $display (p1,p2,...,pn); $write (p1,p2,..,pn); 这两个函数和系统的任务作用是用来输出信息,即将参数p2到 ...

  5. Verilog学习笔记基本语法篇(七)········ 生成块

    生成块可以动态的生成Verilog代码.可以用于对矢量中的多个位进行重复操作.多个模块的实例引用的重复操作.根据参数确定程序中是否包含某段代码.生成语句可以控制变量的声明.任务和函数的调用.还能对实例 ...

  6. Verilog学习笔记基本语法篇(八)········ 结构说明语句

    Verilog中的任何过程都可以属于以下四种结构的说明语句; 1) initial;  2) always;  3) task;   4) function; 1) initial说明语句: 一个程序 ...

  7. Verilog学习笔记基本语法篇(六)········ 循环语句

    在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数. 1)forever语句: 连续执行的语句. 2)repeat语句:  连续执行n次的语句. 3)while语句:    执行语 ...

  8. Verilog学习笔记基本语法篇(四)·········块语句

    块语句是指将两条或者两条以上的语句组合在一起,使其在格式上更像一条语句.块语句分为两种: 1)用begin_end语句,通常用来标识顺序执行的语句,用它标识的块称作顺序块: 2)用fork_join语 ...

  9. Verilog学习笔记基本语法篇(三)·········赋值语句(待补充)

    在Verilog HDL语言中,信号有两种赋值方式. A)非阻塞赋值(Non-Blocking)方式(如:b<=a;) (1)在语句块中,上面语句所赋值的变量不能立即为下面的语句所用: (2)块 ...

随机推荐

  1. iOS 视频播放 - YVideoPlayer - UIView

    这是一个使用简便的视频播放框架,它基于UIView,它可以是一个小窗口,也可以是一个全屏的窗口 简单的方式加载Video框架: 一行代码加载! 一行代码更新! 下载链接 : https://githu ...

  2. GCD中的dispatch_set_target_queue的用法及作用

    (一),使用dispatch_set_target_queue更改Dispatch Queue的执行优先级 dispatch_queue_create函数生成的DisPatch Queue不管是Ser ...

  3. iOS开发之网络数据解析--GDataXML解析框架的使用

      前言:GDataXML是google基于C语言libxml2写的第三方框架,该源码文件就一个类,看其源码,基本使用了C语言的底层的很多lib编译库代码,所以刚导入使用,会报错提示需要设置导入需要的 ...

  4. Cocos2d-x 基础元素

    看过本章,然后实践之后,应该会掌握以下的认识: 1.Cocos2d-x引擎的基本运转过程 2.Cocos2d-x引擎的一些初始设置 3.对导演及图层及现实对象的认识 4.如何定义自己的显示对象 *:f ...

  5. 深入理解CSS中的层叠上下文和层叠顺序

    零.世间的道理都是想通的 在这个世界上,凡事都有个先后顺序,凡物都有个论资排辈.比方说食堂排队打饭,对吧,讲求先到先得,总不可能一拥而上.再比如说话语权,老婆的话永远是对的,领导的话永远是对的. 在C ...

  6. Linux与Windows共享文件夹之samba的安装与使用(Ubuntu为例)

    1.写在前面     当你在Windows上安装了一台Linux的虚拟机,你想访问Linux中的文件夹,将虚拟机中的文件复制到Windows主机上,你会怎么做呢?如果这台Linux主机不是虚拟机,而是 ...

  7. Java小方法

    /** * 计算百分比. * @param dividend 被除数 * @param divisor 除数 * @return 结果 */ private String getPercent(lon ...

  8. mongodb--与spring整合

    一.spring-data-mongodb Spring Data是Spring专门用来数据处理的一个子项目,Spring Data除了spring-data-mongodb之外还包括spring-d ...

  9. 设计模式C#实现(四)——迭代器模式

    迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. UML类图: 煎饼屋和餐厅合并了!但是有个小问题,虽然两家都同意实现相同的菜单项MenuItem,但是煎饼屋想使用A ...

  10. 令人哭笑不得的org.hibernate.MappingException: Unknown entity

    今天处理的任务是从一套系统中分离出微信易信功能代码添加到另一套系统中..本来是一个很简单的任务,但是分离移植过去后,一运行报了个错: nested exception is org.hibernate ...