赞
踩
initial块可以理解为一个初始化块,在initial的起始位置的语句在0时刻即开始执行,之后如果遇到延时,则延时之后执行接下来的语句。
注意:代码可以有任意个initial块,每个initial块之间是并行的,不管在代码任何地方。
任务和函数最大的区别是。任务可以消耗时间,函数无延时。任务可以调用函数。函数在verilog语法中无法调用任务,但是在sv语法中可以调用无延时的任务。当然我们的环境中是支持verilog2001和systemverilog语法标准的。
task是verilog语法中非常重要的子程序之一。task的设计语法和module类似。我们都知道设计module的时候有两种端口申明方式。
一种是传统的也是我们常用的verilog1995标准的写法:
module modulename(portlist);
input xxx;
output xxx;
endmodule
另一种具有强烈的C语言风格verilog2001和systemverilgo均支持:
module modulename(input xxx1, input xxx2, output xxx);
...
endmodule
所以task也有两种不通的设计风格;
一种比较传统(相较于1995标准2001标准取消的子程序之间的begin和end):
task taskname_xxx;
input xxx;
output yyy;
reg yyy;
...
endtask
另外一种:
task taskname_xxx(input xxx,output reg yyy);
...
endtask
关于task的输入输出时序可以看下边的例子:
task使用实例
首先我们定义一个任务;
task a_plus_b; input [1:0] a; input [1:0] b; output reg [1:0] c; c = a+b; #100; endtask initial begin a_in=0; b_in=0; c_out=0; #100; a_in=2’b01; b_in=2’b10; c_out= a_plus_b(.a(a_in),.b(b_in),c(c_out)); #100; end
注意:task的output会被task块阻塞,output的变量值会在整个task执行完才会跳变。
所以上述c_out会在第200ns后跳变为a_in和b_in的和。
若想实时得到output输出的而不是等到task结束的话,可以将output定义为ref参考类型:
task a_plus_b;
input [1:0] a;
input [1:0] b;
ref reg [1:0]c;
c = a+b;
#100;
endtask
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。