当前位置:
文档之家› 第五讲 任务、函数和编译预处理
第五讲 任务、函数和编译预处理
verilog2008--TJU. ASIC Center---Arnold Shi
第二种解答
module sort4(clk,reset,ra,rb,rc,rd,a); output [7:0] ra,rb,rc,rd; input [7:0] a; input clk,reset; reg [7:0] ra,rb,rc,rd; reg [7:0] va,vb,vc,vd; always @ (posedge clk) begin if(!reset) begin va<=0; vb<=0; vc<=0; vd<=0; end else va<=a; end ... .....
verilog2008--TJU. ASIC Center---Arnold Shi
目 录
1 2 3 4
任务(task) 任务(task) 函数(function) 函数(function) 系统任务和系统函数 编译预处理
verilog2008--TJU. ASIC Center---Arnold Shi
verilog2008--TJU. ASIC Center---Arnold Shi
任务调用举例(用全局变量传递数据) 任务调用举例(用全局变量传递数据)
module Global_Var; reg [0:7] RamQ[0:63]; integer Index; reg CheckBit; task GetParity; input Address; output ParityBit; ParityBit = ^ RamQ [Address]; endtask initial for(Index=0; Index<=63; Index=Index+1) begin GetParity(Index,CheckBit); $display("Parity bit of memory word %d is %b.", Index, CheckBit); end endmodule
交通灯例子( 交通灯例子(续)
//定义交通灯开启时间的任务 task light; output color; input [31:0] tics; begin repeat(tics) @(posedge clock); //等待tics个时钟的上升沿 color=off;//关灯 endmodule end endtask //产生时钟脉冲的always块 always begin #100 clock=0; #100 clock=1; end
verilog2008--TJU. ASIC Center---Arnold Shi
任务定义举例
moduleHas_Task; parameterMAXBITS = 8; task Reverse_Bits; input [MAXBITS-1:0]Din; output [MAXBITS-1:0]Dout; integer K; begin for (K=0;K<MAXBITS;K=K+1) Dout [MAXBITS-K] = Din[K]; end endtask ... endmodule
for (Mac3=1; Mac3<=Rotate_By; Mac3=Mac3+1) begin Fill_Value = In_Arr[Stop_Bit]; for (Mac1=Stop_Bit; Mac1>=Start_Bit+1; Mac1 = Mac1-1) In_Arr [Mac1] = In_Arr[Mac1-1]; In_Arr [Start_Bit] = Fill_Value; end end endtask
verilog2008--TJU. ASIC Center---Arnold Shi
任务的调用
一个任务由任务调用语句调用。任务调用语句给出传入任 务的参数值和接收结果的变量值,一个任务调用能够修改 被其他任务调用读取的局部变量的值. 任务调用语句是过程性语句,可以在always 语句或 initial 语句中使用。形式如下: task_id [(expr1, expr2 ,...,exprN )] ; 任务调用语句中参数列表必须与任务定义中的输入、 任务调用语句中参数列表必须与任务定义中的输入、输出 和输入输出参数说明的顺序匹配。参数要按值传递,不能 和输入输出参数说明的顺序匹配 按地址传递。 因为任务调用语句是过程性语句,所以任务调用中的输出 和输入输出参数必须是寄存器类型 寄存器类型的 寄存器类型
function说明语句
函数可以在模块不同位置执行共同代码。函数与任务的不同之处是函 数只能返回一个值,它不能包含任何时延或时序控制 不能包含任何时延或时序控制(必须立即执 不能包含任何时延或时序控制 行),并且它不能调用其它的任务 不能调用其它的任务。此外,函数必须带有至少一个输 不能调用其它的任务 入,在函数中允许没有输出或输入输出说明。函数可以调用其它的函 数。 函数的目的是返回一个用于表达式的值 返回一个用于表达式的值。 返回一个用于表达式的值 定义函数的语法: function <返回值的类型或范围> (函数名); <端口说明语句> <变量类型说明语句> begin <语句> ........ end endfunction 请注意<返回值的类型或范围>这一项是可选项,如缺省则返回值为一 位寄存器类型数据。
TJIC
第五讲 任务、函数和编译预处理 任务、
天津大学电子科学与技术系 史再峰 shizaifeng@
verilog2008--TJU. ASIC Center---Arnold Shi
sk) 任务(task) 函数(function) 函数(function) 系统任务和系统函数 编译预处理
verilog2008--TJU. ASIC Center---Arnold Shi
red=on; //开红灯 light(red,red_tics);//调用等待任务 green=on; //开绿灯 light(green,green_tics);//等待 amber=on; //开黄灯 light(amber,amber_tics); //等待 end
verilog2008--TJU. ASIC Center---Arnold Shi
函数实例
module Function_Example ..... parameter MAXBITS=8; function [MAXBITS-1:0] Reverse_Bits; input [MAXBITS-1:0] Din; integer K; begin for(K=0; K<MAXBITS; K=K+1) Reverse_Bits [MAXBITS-K] = Din[K]; end endfunction ... endmodule
verilog2008--TJU. ASIC Center---Arnold Shi
练习题解答
module sort4 (ra,rb,rc,rd,a,b,c,d); output [7:0] ra,rb,rc,rd; input [7:0] a,b,c,d; reg [7:0] ra,rb,rc,rd; reg [7:0] va,vb,vc,vd; task change; //make comparing inout[7:0] x,y; reg[7:0] tmp; if(x>y) begin tmp=x; x=y; y=tmp; end endtask always @ (a or b or c or d) begin {va,vb,vc,vd}={a,b,c,d}; change(va,vb); change(vb,vc); change(vc,vd); change(va,vb); change(vb,vc); change(va,vb); {ra,rb,rc,rd}={va,vb,vc,vd}; end endmodule
verilog2008--TJU. ASIC Center---Arnold Shi
任务使用举例2 任务使用举例2
任务的输入和输出在任务开 始处声明。这些输入和输 出的顺序决定了它们在任 务调用中的顺序 task Rotate_Left; inout [1:16] In_Arr; input [0:3] Start_Bit, Stop_Bit, Rotate_By; reg Fill_Value; integer Mac1, Mac3; begin
verilog2008--TJU. ASIC Center---Arnold Shi
任务调用举例(带有时序控制) 任务调用举例(带有时序控制)
任务可以带有时序控制, 或等待特定事件的发生。 但是,输出参数的值直到 任务退出时才传递给调用 参数
module TaskWait; reg NoClock; task GenerateWaveform; output ClockQ; begin ClockQ=1; #2 ClockQ=0; #2 ClockQ=1; #2 ClockQ=0; end endtask initial GenarateWaveform (NoClock); endmodule 任务GenerateWaveform ClockQ的 GenerateWaveform对 任务GenerateWaveform对ClockQ的 赋值不出现在NoClock NoClock上 赋值不出现在NoClock上,只有对 ClockQ的最终赋值 的最终赋值0 ClockQ的最终赋值0在任务返回后 出现在NoClock NoClock上 出现在NoClock上。为避免这一情 形出现,最好将ClockQ ClockQ声明为全 形出现,最好将ClockQ声明为全 局寄存器类型, 局寄存器类型,即在任务之外声 明它。 明它。
这个例子描述了一个简单 的交通灯的时序控制,并 且该交通灯有它自己的时 钟产生器。