FPGA学习笔记---任务(task) 和函数 (function)
在 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)相关推荐
- Vue学习笔记进阶篇——Render函数
本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编 ...
- 《Go语言圣经》学习笔记 第五章函数
<Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...
- 没有varselect这个函数_JavaScript学习笔记(四)-- 函数基础
函数基础 我们代码里面所说的函数和我们上学的时候学习的什么三角函数.二次函数之类的不是一个东西 函数的概念 对于 js 来说,函数就是把任意一段代码放在一个 盒子 里面 在我想要让这段代码执行的时候, ...
- FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析
系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...
- FPGA学习笔记(十二)IP核之FIFO的学习总结
系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...
- 小梅哥FPGA学习笔记
小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...
- 【Python学习笔记】第八章 函数
[Python学习笔记]第八章 函数 文章目录 [Python学习笔记]第八章 函数 前言 8.1 定义函数 8.2 调用函数 8.2.1 使用位置参数调用函数 8.2.2 使用关键字参数调用函数 8 ...
- FPGA学习笔记(六)Modelsim单独仿真和Quartus联合仿真及signaltap使用
系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...
- FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真
系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...
最新文章
- Windows10下OpenCV_contrib安装配置
- Message Loop 原理及应用
- hdu1816 + POJ 2723开锁(二分+2sat)
- boost::core模块实现np地址
- 多线程-Thread、Runnable、Callbale、Future
- html从入门到卖电脑(三)
- java部署平台_开源Java自动化部署平台JDeploy
- 洛谷 P1736 创意吃鱼法(多维DP)
- 利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...
- 使用Arquillian(远程)测试OpenLiberty
- 深入学习Oracle分区表及分区索引
- 线上Go项目的Docker镜像应该怎么构建?
- 数据采集与清洗基础习题(四)Pandas初体验,头歌参考答案
- go技术文章精选(2019)
- 《网络是怎样连接的》了解网络连接的全貌
- linux下安装php+apache+mysql集成环境
- linux中MIB与MB单位的区别
- worldpress怎么增加登录注册按钮
- YOLOv3网络结构细致解析
- FFmpeg的HEVC解码器源代码简单分析 解析器(Parser)部分