首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

verilog testbench 测试输出 问题求解

verilog testbench 测试输出 问题求解

//下面我简单代码
module dec2x4(a,b,enable,out);//it is 2-4解码器实例
input a,b,enable;
output [3:0]out;
reg [3:0]out_o;
assign out = out_o;
always @(a or b or enable)
       if(!enable)
           out_o <= 4'b1111;
        else if(enable)
           begin
               case ({a,b})     
                     2'b00 : out_o <= 4'b1110;
                     2'b01 : out_o <= 4'b1101;
                     2'b10 : out_o <= 4'b1011;
                     2'b11 : out_o <= 4'b0111;
               endcase
           end
endmodule
//////编译通过后,我写了测试脚本
`timescale 1 ns/ 1 ps
module dec2x4_vlg_tst();
reg a;
reg b;
reg enable;                                          
wire [3:0] out;
integer fp;
reg [3:0]out_t;预先定义的输出,用于与实际的输出相比较,检测数据                       
dec2x4 i1 (
.a(a),
.b(b),
.enable(enable),
.out(out)
);
initial  begin
fp = $fopen("log.txt");//创建一个文件,获取文件指针
enable = 0;
a = 0;
b = 0;
#10 enable = 1;
#10 b = 1;
#10 a = 1;
#10 force out = 4'b0000;//强制转换输出,用于验证测试
#10 release out;
#10 b = 0;
#10 a = 0;
repeat (5)  begin  //增加随机测试,循环5次
       #10  a <= { $random };
                   b <= { $random };
                   enable <= { $random };   
    end
#10 $stop;                 
$fclose(fp);
end                                                   
always @ (a or b or enable )
  if(!enable)
           out_t <= 4'b1111;
        else if(enable)
           begin
               case ({a,b})     
                     2'b00 : out_t <= 4'b1110;
                     2'b01 : out_t <= 4'b1101;
                     2'b10 : out_t <= 4'b1011;
                     2'b11 : out_t <= 4'b0111;
               endcase
           end

always @ ( out  or  b or  enable or a )
      if(out_t == out)                  
          $fwrite (fp,"At time %6t ,input a==%b,b==%b,enable==%b,output==%b; true\n",$time,a,b,enable,out);   
      else
          $fwrite (fp,"At time %6t ,input a==%b,b==%b,enable==%b,output==%b; error\n",$time,a,b,enable,out);
endmodule
//////////然后打开文本,看到如下结果
At time      0 ,input a==0,b==0,enable==0,output==xxxx; error
At time      0 ,input a==0,b==0,enable==0,output==1111; true
At time  10000 ,input a==0,b==0,enable==1,output==1111; true
At time  10000 ,input a==0,b==0,enable==1,output==1110; true
At time  20000 ,input a==0,b==1,enable==1,output==1110; true
At time  20000 ,input a==0,b==1,enable==1,output==1101; true
At time  30000 ,input a==1,b==1,enable==1,output==1101; true
At time  30000 ,input a==1,b==1,enable==1,output==0111; true
At time  40000 ,input a==1,b==1,enable==1,output==0000; error
At time  50000 ,input a==1,b==1,enable==1,output==0111; true
At time  60000 ,input a==1,b==0,enable==1,output==0111; true
At time  60000 ,input a==1,b==0,enable==1,output==1011; true
At time  70000 ,input a==0,b==0,enable==1,output==1011; true
At time  70000 ,input a==0,b==0,enable==1,output==1110; true
At time  80000 ,input a==0,b==1,enable==1,output==1110; true
At time  80000 ,input a==0,b==1,enable==1,output==1101; true
At time  90000 ,input a==1,b==1,enable==1,output==1101; true
At time  90000 ,input a==1,b==1,enable==1,output==0111; true
At time 100000 ,input a==1,b==0,enable==1,output==0111; true
At time 100000 ,input a==1,b==0,enable==1,output==1011; true
////////////////////////////////////////////
我想请问的是,如何编写代码,使得上面的文本输出不会在同一个时间节点重复输出。
看到上述结果,发现在always语句中,在同一个时间节点,若两个或以上的参数变化,它要执行多次么,真的是这样的么???????
哪位大神可以帮个忙啊。。。。
返回列表