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. ubuntu14.0安装arm-linux-gcc交叉编译环境

    1.下载文件: 安装包:arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz 下载地址  http://pan.baidu.com/s/1pJwQ6Sj 2.开始安装(建议大 ...

  2. 【读书笔记】iOS-GCD-Dispatch Source

    一,Dispatch Source是BSD系内核惯有功能kqueue的包装. 参考资料:<Objective-C高级编程 iOS与OS X多线程和内存管理>

  3. 【读书笔记】iOS-NSDictionary与NSArray的比较

    有时候为什么不用数组存储然后在数组里查询数值呢?字典(也称为散列表或关联数组)使用的是键查询的优化存储方式.它可以立即找出要查询的数据,而不需要遍历整个数组进行查找.对于频繁的查询和大型的数据集来说, ...

  4. 卸载openfire

    首先,确保你已经关掉了openfire打开终端 (在应用程序-->实用工具-->)输入以下命令sudo rm -rf /Library/PreferencePanes/Openfire.p ...

  5. JAVA----编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符

    package com.pb.demo.packclass.demo1; import java.util.HashSet; /** * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符 ...

  6. php操作memcache的使用【转】

    1.简介 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力.它可以应对任意多个连接, ...

  7. Effective Java 37 Use marker interfaces to define types

    Marker interface is an interface that contains no method declarations, but merely designates (or &qu ...

  8. 如何在WIN7下进行LINUX虚拟机搭建

    Linux是一套免费使用和自由传播的类Unix操作系统,非常适用于搭建网络服务器等,我本人日常工作时,是使用的LINUX和WIN7双操作系统,但每次更换系统总要关机重启很不方便,所以也在WIN7下搭建 ...

  9. java charset detector

    https://code.google.com/p/juniversalchardet/downloads/list java移植mozilla的编码自动检测库(源码为c++),准确率高. 通过svn ...

  10. [转]jQuery UI Dialog Modal Popup Yes No Confirm example in ASP.Net

    本文转自:http://www.aspsnippets.com/Articles/jQuery-UI-Dialog-Modal-Popup-Yes-No-Confirm-example-in-ASPN ...