首先来讲解一下task、function说明语句的使用。
task和function说明语句分别用来定义任务和函数,利用任务和函数可以把一个很大的程序模块分解成许多较小的任务和函数便于理解和调试。
task和function说明语句的不同点:
(1)函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。
(2)函数不能启动任务,而任务能启动其他任务和函数。
(3)函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。
(4)函数返回一个值,而任务则不返回值。
函数(function)的目的是通过返回一个值来响应输入信号的值。而任务(task)能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出。
注意:task和function说明语句是可以被综合的。
task说明语句:
task主要用来实现一些简单的功能,方便多次调用,只负责处理而不带任何连线的功能。
(一)任务的定义
task<任务名>;
<端口及数据类型声明语句>
<语句1>
<语句2>
.........
<语句n>
endtask
(二)任务的调用
<任务名>(端口1,端口2,端口3,........,端口n)
(三)任务的使用例子
// task 任务编写
task light; //延迟tics个时钟将信号灯关闭
output color;
input [31:0] tics;
begin
repeat(tics) //等待tics个时钟的上升沿
@(posedge clock);
clock = off;
end
endtask
// task 任务调用
always
begin
red = on;
light(red,red_tics);
green = on;
light(green,green_tics);
amber = on;
light(amber,amber_tics);
end
function说明语句
函数的目的是返回一个用于表达式的值。
函数的使用规则
(1)函数的定义不能包含有任何的时间控制语句,即任何用#,@或wait来标识的语句
(2)函数不能启动任务
(3)定义函数时至少要有一个输入变量
(4)在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该内部变量具有和函数名相同的名字
(一)函数的定义
function<返回值的类型或范围>(函数名); <返回值的类型或范围>是可选项,如默认则返回值为一位寄存器类型数据。函数名也即输出结果的变量名。
<端口说明语句>
<变量类型说明语句>
begin
<语句>
........
end
endfunction
(二)函数的调用
//函数的调用是通过将函数作为表达式中的操作数来实现的,调用格式如下:
<函数名>(<表达式>,......<表达式>)
(三)函数的使用例子
function [31:0] factorial; //实现n的阶乘
input[3:0] operand;
reg[3:0]index;
begin
factorial = 1;
for(index=2;index<=operand;index=index+1)
factorial = index * factorial;
end
endfunction
//函数调用
result = n * factorial(n);
generate生成块语句
生成语句可以动态的生成Verilog代码。当对矢量中的多个位进行重复操作,或者多个模块的实例化引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候,可以使用生成语句来大大简化程序的编写过程。
generate的主要功能是对module,net,reg,parameter,assign,always,task,function进行复制。
生成实例可以是以下的一个或多种类型:
(1)模块;
(2)用户定义原语;
(3)门级原语;
(4)连续赋值语句;
(5)initial和always块。
Verilog语言允许在生成范围内声明下列数据类型:
(1)net(线网),reg(寄存器);
(2)integer(整型数)、real(实型数)、time(时间型)、realtime(实数时间型);
(3)event(事件)。
不允许出现在生成范围之中的模块项声明包括:
(1)参数、局部参数
(2)输入、输出和输入/输出声明
(3)指定块
在Verilog中有3种创建生成语句的方法:
(1)循环生成
(2)条件生成
(3)case生成
(一)循环生成语句
reg [N-1:0] out;
genvar j ; //用于声明生成变量,只能用在生成块中,在确立后的仿真模块中,生成变量是不存在的
generate
for(j = 0; j < N; j = j + 1)
begin: bit //begin后面接循环生成语句的名字,用于层次化引用
always@(*)
out[j] = i0[j]^i1[j];
end
endgenerate
(二)条件生成语句
module max(
input a,b,sel,
output c
assign c = sel ? a:b;
);
module min(
input a,b,sel,
output c
assign c = sel ? b:a;
);
module main(
input a,b,sel,choose,
output out
);
generate
if(choose)
begin:u1
max max_in(
.a(a),
.b(b),
.sel(sel),
.c(out)
);
else
begin:u2
min min_in(
.a(a),
.b(b),
.sel(sel),
.c(out)
);
endgenerate
endmodule
(三)case生成语句
case生成语句类似条件生成语句模板,使用多选一case构造,有条件的调用Verilog结构。