task test_task;//task的定义,以task关键字开始,紧接后面是task的id,名字
input [1:0] a; //task的输入输出定义,用来和外面的变量进行交换,是通向外面的接口
output [1:0] b;
begin
b = ~a;
end
endtask
reg [1:0] task_a;
reg [1:0] task_b; //因为task必须在过程语句中调用,所以其实参必须为reg类型的
initial
begin
task_a = 2'b0;
test_task (task_a,task_b);//task的调用,直接调用,没有什么像module一样例化的东西
#10 task_a = 2'b10;
end
initial
begin
#20 task_a = 2'b11;
test_task (task_a,task_b);//同样可以改变task内部的值,和module不同,这是同一个task
#10 task_a = 2'b10;
end
reg [1:0] task1_a;
reg [1:0] task1_b;
task test_task1;
output [1:0] b;
assign b = ~task1_a;//可以使用全局变量,不一定是task内部的变量
endtask
initial
begin
task1_a = 2'd0;
#1 test_task1(task1_b);
#10 task1_a = 2'd1;
#1 test_task1(task1_b);
#10 task1_a = 2'd2;
#1 test_task1(task1_b);
#10 task1_a = 2'd3;
#1 test_task1(task1_b);
end
task和module有点类似,都可以通过输入输出来和外面发生关系,这个时候module可以例化多次,这样就是不同的单元,和task
还是有区别的。
1,task只能定义在module内部,不能单独在一个文件中,不能定义在module外面。
2,在task调用的是必须在过程性语句内部使用,initial,begin ... end
3,task可以没有参数,直接使用全局变量来实现功能。
4,可以使用延时控制,可以调用其他task和函数。
函数:可以调用函数,不能调用任务,不可有时序控制。
function [1:0] invert; //只有一个返回值,invert,寄存器类型的
//input [1:0] a; //可以有一个输入,或者多个,或者没有输入
//begin
invert = 2'd3;
//end
endfunction
reg [1:0] fun_a;
reg [1:0] fun_out;
initial
begin
fun_a = 2'd2;
fun_out = invert();//(fun_a);//调用函数,函数返回一个值,必须在过程性语句中调用。
#50 fun_a = 2'd1;
fun_out = invert();//(fun_a);
#50 fun_a = 2'd0;
fun_out = invert();//(fun_a);
#50 fun_a = 2'd3;
fun_out = invert();//(fun_a);
end
task test_task1; //任务调用函数
output [1:0] b;
b = ~add(task1_a);
endtask
function [1:0] invert;//函数调用函数
input [1:0] a;
invert = ~add(a);
endfunction
//显示和文件操作
integer i;
initial
begin
a1 = 0;
for(i=0;i<100;i=i+1)
begin
if(a1 == 8'd50)
begin
$write("a1 is %d",a1); //显示
$write("\n\n\n\n\n\n");
$fwrite(f_id,"a1 is %d",a1);//写入文件
$fwrite(f_id,"\n\n\n\n\n\n");
end
else if(a1 == 8'd70)
begin
$display("a1 is %d\n\n",a1);//显示
$fdisplay(f_id,"a1 is %d\n\n",a1);//写入文件
end
else if (a1 == 8'd90)
begin
$fclose(f_id);
end
#2 a1 = a1 +1;
end
end
initial
begin
$monitor("test %d\n",a1);//变量变化就会显示
end
integer f_id;
initial
begin
f_id = $fopen("./test.txt");//打开一个文件
end
initial
begin
$strobe("tes1t %d\n",a1); //在时间步0结束的时候显示这一句
end
integer cool;
initial
begin
cool = 4; //这是时间步0要执行的,
$strobe ("strobe cool1 is %d at time %t\n",cool,$time);//这是时间步0要执行的,在时间步的最后显示
$display("cool1 is %d at time %t\n",cool,$time); //这是时间步0要执行的,
#4 cool = 8; //这是时间步4要执行的,
$strobe ("strobe2 cool1 is %d at time %t\n",cool,$time);//这是时间步4要执行的,
$display("cool2 is %d at time %t\n",cool,$time); //这是时间步4要执行的,
end
文章评论(0条评论)
登录后参与讨论