背景
关于函数和任务,是我这几天一直想写的内容,原因在于我上篇博文:Verilog HDL 使用规范(一),最后提到的问题,关于代码书写的规范中,要求:用一个函数(function)来代替表达式的多次重复,经常使用的一组描述可以写到一个任务中。
当时我还不是太明白,今天就会为此而准备的,为了写出清晰规范的代码,决定细化自己对Verilog HDL语言的学习。
本文内容参考:《从算法设计到硬件逻辑的实现》
任务
1)任务的定义
这些声明语句的语法与模块定义中的对应声明语句的语法是一致的。
2) 任务的调用及变量的传递
下面的例子说明怎样定义任务和调用任务:
任务调用变量(v,w,x,y,z)和任务定义的I/O变量(a,b,c,d,e)之间是一一对应的。当任务启动时,由v,w,和x.传入的变量赋给了a,b,和c,而当任务完成后的输出又通过c,d和e赋给了x,y和z。
下面的示例用来说明如何定义任务,调用任务。(仅仅为了说明语法的使用)
这个例子描述了一个简单的交通灯的时序控制,并且该交通灯有它自己的时钟产生器。
module traffic_lights;
reg clock,red,amber,green;
parameter on=1,off=0,red_tics=350,amber_tics=30, green_tics=200;
//initialization
initial red=off;
initial amber=off;
initial green=off;
//clk control
always
begin
red=on; //red light on
light(red,red_tics); //transfer hold mission
green=on; //green light on
light(green,green_tics); //wait for 200 time unit
amber=on; //yellow light on
light(amber,amber_tics); //wait for 30 time unit
end
//define traffic light on mission
task light(color,tics);
output color;
input[31:0] tics;
begin
repeat(tics)@(posedge clock); //use repeat sentence to wait for posedge clock
color=off; //turn off the light
end
endtask
//generate clock
always
begin
#100 clock=0;
#100 clock=1;
end
endmodule
函数(function)
函数的目的是返回一个用于表达式的值。
1)函数的定义
2)函数的返回值
函数的定义蕴含声明了与函数同名的、函数内部的寄存器。如在函数的声明语句中<返回值的类型或范围>为缺省,则这个寄存器是一位的,否则是与函数定义中<返回值的类型或范围>一致的寄存器。函数的定义把函数返回值所赋值寄存器的名称初始化为与函数同名的内部变量。下面的例子说明了这个概念:getbyte被赋予的值就是函数的返回值。
3)函数的调用
函数的调用是通过将函数作为表达式中的操作数来实现的。
下面的例子中通过对两次调用函数getbyte的结果值进行位拼接运算来生成一个字。
4)函数的使用规则
仅供参考吧,这玩意我是用的真的少的不能行。
实践后补充。