虚拟机:VMware-workstation-full-14.0.0.24051
环 境:ubuntu 18.04.1
应用工具:VCS(verilog compiled simulator,编译型代码仿真器)
一、学习内容
二、task和function
task和function语句分别用来由用户定义任务和函数;任务和函数往往是大的程序模块中在不同地点多次用到的
相同的程序段;利用任务和函数可将一个很大的程序模块分解为许多较小的任务和函数,便于理解和调试;输入、输出和总线信号的值可以传入、传出任务和函数。
(1)task语句
//任务定义 task <任务名>;
端口及数据类型声明语句;
其他语句;
endtask
//任务调用 <任务名>(端口1,端口2,...)
- 注1:任务的定义与调用必须在一个module模块内;
- 注2:任务被调用时,需列出端口名列表,且必须与任务定义中的I/O变量一一对应;
- 注3:一个任务可以调用其他任务和函数。
【例 1】
//任务定义
task my_task;
input a,b;
inout c;
output d,e;
...
<语句> //执行任务工作相应的语句
...
c = foo1;
d = foo2; //对任务的输出变量赋值
e = foo3;
endtask
//任务调用
my_task(v,w,x,y,z);
当任务启动时,由v、w和x传入的变量赋给了a、b和c;当任务完成后,输出通过c、d和e赋给了x、y和z 。
(2)function
函数的目的是通过返回一个用于某表达式的值,来响应输入信号。适于对不同变量采取同一运算的操作。函数在模块内部定义,通常在本模块中调用,也能根据按模块层次分级命名的函数名从其他模块调用。而任务只能在同一模块内定义与调用。
//函数定义 function <返回值位宽或类型说明> 函数名;
端口声明;
局部变量定义;
其他语句;
endfunction
//函数调用 <函数名>(<表达式> <表达式>)
function[7:0] gefun; //函数的定义
input [7:0] x;
...
<语句> //进行运算
gefun = count; //赋值语句
endfunction
assign number = gefun(rega); //对函数的调用
//注1:函数的调用是通过将函数作为调用函数的表达式中的操作数来实现的
//注2:函数在综合时,被理解成具有独立运算功能的电路,每调用一次函数,相当于改变此电路的输入,以此得到相应的计算结果
注意
- 函数的定义不能包含任何时间控制语句——用延迟#、事件控制@或等待wait标识的语句。
- 函数不能启动(即调用)任务!
- 定义函数时至少要有一个输入参量!且不能有任何输出或输入/输出双向变量。
- 在函数的定义中必须有一条赋值语句,给函数中的一个内部寄存器赋以函数的结果值,该内部寄存器与函数同名
【例2】 利用函数对一个8位二进制数中为0的位进行计数
**【例 3】**阶乘运算函数
(3)任务和函数的区别
三、思考和小结
(1)思考
- 边沿触发的always块和电平触发的always块分别表示什么类型的逻辑电路?
- 用always块实现一个占空比为50%的8分频时钟分频
- 通过任务调用完成4个4位二进制输入数据的从大到小排列的冒泡排序
- 通过任务调用完成4个4位二进制输入数据的从大到小排列的冒泡排序
(2)小结
作者:xlinxdu
版权:本文版权归作者所有
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。