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. nutch简介

    1.什么是 nutch Nutch 是一个开源的. Java 实现的搜索引擎.它提供了我们运行自己的搜 索引擎所需的全部工具.2.研究 nutch 的原因(1) 透明度: nutch 是开放源代码的, ...

  2. 递归练习(C语言)

    本文地址:http://www.cnblogs.com/archimedes/p/recursive-practice.html,转载请注明源地址. 1.炮弹一样的球状物体,能够堆积成一个金字塔,在顶 ...

  3. swift基础二

    import Foundation // MARK: - ?和!的区别 // ?代表可选类型,实质上是枚举类型,里面有None和Some两种类型,其实nil相当于OPtional.None,如果非ni ...

  4. 在iOS 8中使用UIAlertController

    iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸 ...

  5. ReSharper 卸载后 VS2012 没有提示问题

    虽然ReSharper非常强大,但由于公司电脑配置太差,被迫卸载了.但发现卸载后,VS2012自带的提示都没有了. 网上找了下相关的解决方法.摘抄下来,作为自己笔记. 解决方法原文出处:http:// ...

  6. [eclipse]“Syntax error, insert "}" to complete”报错的解决方案

    背景:本人在网上学习java时,看到一段样例代码比较好,因此复制粘贴到eclipse中看看编译结果.结果eclipse报"Syntax error, insert "}" ...

  7. 每日Scrum--No.4

    Yesterday:学习迪杰斯特拉算法并进行简单的编写代码 Today:继续编写代码 Problem:变量名的定义出错,造成调用的时候出错,不过改过来就好了.算法的编写不全面,漏掉个别语句,如在调试的 ...

  8. OOD沉思录 --- 类和对象的关系 --- 包含关系2

    4.6 尽量让类中定义的每个方法尽可能多地使用包含的对象(即数据成员) 这其实就是高内聚的翻版强调.如果每个类的情况并非如此,那很可能是这一个类表示了两个或更多的概念,记住一个类只应该表示一个概念. ...

  9. Java锁(一)之内存模型

    想要了解Java锁机制.引发的线程安全问题以及数据一致性问题,有必要了解内存模型,机理机制了解清楚了,这些问题也就应声而解了. 一.主内存和工作内存 Java内存模型分为主内存和工作内存,所有的变量都 ...

  10. Busybox下mdev配置说明

    [TOC] mdev说明 mdev是busybox自带的一个简化版的udev,适合嵌入式应用场合.其具有使用简单的特点.它的作用就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需要的节点 ...