目录
1、task和function的区别
2、task说明语句
3、function说明语句
参考《Verilog 数字系统设计》
1、task和function的区别
task和function说明语句分别用来定义任务和函数,利用任务和函数可以把一个很大的程序模块分解成许多较小的任务和函数,便于理解和调试。输入、输出和总线信号的值可以传入、传出任务和函数。学会使用task和function语句可以简化程序的结构,使程序明白易懂,是编写较大型模块的基本功。
function和task的不同在于:
(1)function只能与主模块共有同一个仿真时间单位,而task可以定义自己的仿真时间单位。
(2)function不能启动task,而task可以启动其他task和function。
(3)function至少要有一个输入变量,而task可以没有或有多个任何类型的变量。
(4)function返回一个值,而task不返回值。
function的目的是铜鼓返回一个值来响应输入信号的值。task能够支持多种目的,能够计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出。
举例:
定义一个任务或函数,对一个16位的字进行操作,让高字节与低字节互换,把它变成另一个字(假定这个任务或函数的名为switch_bytes)。
task返回的新字,是通过输出端口的变量,因此16位字节互换任务的调用源码是:
switch_bytes(old_word,new_word);
任务switch_bytes把输入old_word的高低字节互换,放入new_word端口输出。
function返回的新字,是通过函数本身的返回值,因此,互换函数调用的源码是:
new_word=switch_bytes(old_word) ;
2、task说明语句
(1)任务定义格式
(2)任务的调用以及变量的传递
任务的调用:<任务名>(端口1,端口2,...,端口n)
(3)任务(task)使用举例
module test ;
reg clk, rstn ;
//1、产生时钟---------------------------
initial begin
rstn = 0 ;
#8 rstn = 1 ;
forever begin
clk = 0 ; # 5;
clk = 1 ; # 5;
end
end
//2、task调用-------------------------
reg [3:0] a, b;
initial begin
a = 0 ;
b = 0 ;
sig_input(4'b1111, 4'b1001, a, b);
end
//3、task定义---------------------------
task sig_input ;
input [3:0] a ;
input [3:0] b ;
output [3:0] ao ;
output [3:0] bo ;
@(posedge clk) ;
ao = a ;
bo = b ;
endtask ; // sig_input
initial begin
forever begin
#100;
if ($time >= 1000) $finish ;
end
end
endmodule // test
3、function说明语句
下图为函数定义的举例,定义的函数为getbyte,将 “ 说明语句 ” 的执行结果,最后再赋值给getbyte,作为返回字节。
实践举例: