在 Verilog HDL 语言中,任务(task)和函数(function)可以把一个大的程序模块分解成许多小的任务和函数,以方便调试,使写出的程序结构更清晰。

任务(task)定义格式如下:

task <任务名>;                     //注意无端口列表

端口及数据类型声明;

其他语句;

endtask

函数(function)定义格式如下:

function <返回值位宽或类型说明> 函数名;

端口及数据类型声明;

其他语句;

endfunction

<返回值位宽或类型说明> 是一个可选项,如果缺省,则返回一个一位寄存器类型的数据。

任务与函数的区别

比较项目 任务(task) 函数(function)
输入与输出 可有任意个各种类型的参数 至少有一个输入,不能将inout类型作为输出
调用 任务只可在过程语句中调用,而不能在连续赋值语句中调用assign 函数可作为表达式中的一个操作数来调用,在过程赋值和连续赋值语句中均可调用
定时和事件控制(#,@和wait) 任务可以包含定时和事件控制语句 函数不能包含这些语句
调用其他任务和函数 任务可以调用其他任务和函数 函数可调用其他函数,但不可以调用其他任务
返回值 任务不向表达式返回值 函数向调用它的表达式返回一个值

下面通过一个例子来说明任务和函数如何使用。

module task_function(in1,in2,in3,in4,out1,out2);input [7:0] in1,in2,in3,in4;
output reg [8:0] out1,out2;//任务
task add1;                                      //注意无端口列表input [7:0] a,b;                           //输入端口和数据类型声明output reg [8:0] out1;                 //输出端口和数据类型声明out1 = a + b;                                //a,b,out1名称的作用范围仅为task任务内部
endtask//调用任务
always@(in1 or in2) beginadd1(in1,in2,out1);                       //调用任务,注意端口列表的顺序要和任务中定义的一致
end//函数
function [8:0] add2;                            //函数定义  函数会自动生成一个和函数名同名的内部变量,作为函数返回值所用的寄存器。input [7:0] c,d;                          //输入端口声明  函数只有输入端口,输出端口为函数名本身。add2 = c + d;                                //返回输出值  输出寄存器为和函数同名的内部寄存器
endfunction
//调用函数
always @(in3 or in4) beginout2 = add2(in3,in4);                   //调用函数,注意端口列表的顺序要和函数中定义的一致
endendmodule

分别在任务和函数中实现两个数相加的操作,在调用任务时,需要向任务中传递输入输出端口。在调用函数的时候,只需要传递输入信号,函数的返回值作为输出信号。

下面编写测试代码

`timescale 1ns/1ns
module task_function_tb;reg [7:0] in1,in2,in3,in4;wire [8:0] out1,out2;task_function task_function(.in1 (in1),.in2  (in2),.in3  (in3),.in4  (in4),.out1 (out1),.out2    (out2));integer i;initial beginfor(i = 0;i < 100;i = i + 1) beginin1 = i;in2 = i;#5;end endinteger j;initial beginfor(j = 100;j < 200;j = j + 1) beginin3 = j;in4 = j;#5;end#100;$stop;endinitial $monitor($time,,,"in1=%d in2=%d ou1=%d   in3=%d in4=%d out2=%d",in1,in2,out1,in3,in4,out2);endmodule

in1和in2的值从0增加到100,in3和in4的值从100增加到200。并将输入值和输出值打印出来。

打印结果如下

输出波形如下:

通过上面例子可以看出,任务和函数在使用的时候方法基本相同。唯一差别就是输出端口输出方式不一样,可以根据情况选择适合的方式。

FPGA学习笔记---任务(task) 和函数 (function)相关推荐

  1. Vue学习笔记进阶篇——Render函数

    本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编 ...

  2. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  3. 没有varselect这个函数_JavaScript学习笔记(四)-- 函数基础

    函数基础 我们代码里面所说的函数和我们上学的时候学习的什么三角函数.二次函数之类的不是一个东西 函数的概念 对于 js 来说,函数就是把任意一段代码放在一个 盒子 里面 在我想要让这段代码执行的时候, ...

  4. FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  5. FPGA学习笔记(十二)IP核之FIFO的学习总结

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  6. 小梅哥FPGA学习笔记

    小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...

  7. 【Python学习笔记】第八章 函数

    [Python学习笔记]第八章 函数 文章目录 [Python学习笔记]第八章 函数 前言 8.1 定义函数 8.2 调用函数 8.2.1 使用位置参数调用函数 8.2.2 使用关键字参数调用函数 8 ...

  8. FPGA学习笔记(六)Modelsim单独仿真和Quartus联合仿真及signaltap使用

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  9. FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

最新文章

  1. Windows10下OpenCV_contrib安装配置
  2. Message Loop 原理及应用
  3. hdu1816 + POJ 2723开锁(二分+2sat)
  4. boost::core模块实现np地址
  5. 多线程-Thread、Runnable、Callbale、Future
  6. html从入门到卖电脑(三)
  7. java部署平台_开源Java自动化部署平台JDeploy
  8. 洛谷 P1736 创意吃鱼法(多维DP)
  9. 利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...
  10. 使用Arquillian(远程)测试OpenLiberty
  11. 深入学习Oracle分区表及分区索引
  12. 线上Go项目的Docker镜像应该怎么构建?
  13. 数据采集与清洗基础习题(四)Pandas初体验,头歌参考答案
  14. go技术文章精选(2019)
  15. 《网络是怎样连接的》了解网络连接的全貌
  16. linux下安装php+apache+mysql集成环境
  17. linux中MIB与MB单位的区别
  18. worldpress怎么增加登录注册按钮
  19. YOLOv3网络结构细致解析
  20. FFmpeg的HEVC解码器源代码简单分析 解析器(Parser)部分

热门文章

  1. 批量创建Linux用户账号
  2. ICSharpCode.SharpZipLib 压缩、解压文件 附源码
  3. EasyPlayer Android RTSP播放器延迟再优化策略
  4. mysql安装、配置、连接
  5. C盘空间越来越小怎么办,教你27招
  6. 【Hadoop】MapReduce的配置 ---配置历史服务器
  7. 栈实现队列(队列实现栈)
  8. 6.Springcloud的Ribbon的负载均衡算法解析及配置方式
  9. VMware 克隆多个centos 7 操作系统
  10. 使用inetaddress测试目标可达性_纯java手写打造方法级白盒测试框架