有关testbench的一些问题

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

永不止步步 发表于07-10 11:11 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363791个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号