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. Android接口回调机制

    开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...

  2. UITableView删除添加和移动

    #import "RootTableViewController.h" @interface RootTableViewController () @property (nonat ...

  3. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  4. 全球最低功耗蓝牙单芯片DA14580的软件体系 -层次架构和BLE消息事件处理过程

    在作者之前发表的<全球最低功耗蓝牙单芯片DA14580的系统架构和应用开发框架分析>.<全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗>.<全球最低功耗蓝牙单芯片 ...

  5. Web应用程序系统的多用户权限控制设计及实现-栏目模块【8】

    前五章均是从整体上讲述了Web应用程序的多用户权限控制实现流程,本章讲述Web权限管理系统的基本模块-栏目模块.栏目模块涉及到的数据表为目录表. 1.1栏目域 为了更规范和方便后期系统的二次开发和维护 ...

  6. Retrofit源码设计模式解析(下)

    本文将接着<Retrofit源码设计模式解析(上)>,继续分享以下设计模式在Retrofit中的应用: 适配器模式 策略模式 观察者模式 单例模式 原型模式 享元模式 一.适配器模式 在上 ...

  7. linux命令之 用户和群组

    一.保存用户信息的文件 1 /etc/passwd root:x:::root:/root:/bin/bash pwftp:x::::/alidata/www/wwwroot/:/sbin/nolog ...

  8. 从1.5k到18k, 一个程序员的5年成长之路

    昨天收到了心仪企业的口头offer, 回首当初什么都不会开始学编程, 到现在恰好五年. 整天在社区晃悠, 看了不少的总结, 在这个时间点, 我也写一份自己的总结吧. 我一直在社区分享, 所以, 这篇总 ...

  9. HTTPAnalyzer截获SoapUI发送的接口报文

      一.截获过程 1. 开启HTTPAnalyzer报文截获工具. 2. 通过SoapUI工具发送报文. 3. HTTPAnalyzer报文截获工具自动截获. 二.SoapUI报文准备 准备工作是:打 ...

  10. 人机交互—对win10自带输入法的评价

    在我的电脑换成win10系统后我就用他自带的输入法,它可以中英文切换,用起来很方便,就用了它,就没有下载别的输入法. 用户界面:这个输入法的界面非常简单,没有像搜狗,百度之类的皮肤一说,看起来很简单, ...