关于Vivado仿真时,时钟信号初值设置方法导致仿真结果不一致的问题分析

本文以余3码加法计数器的设计为例,说明仿真激励过程中遇到的问题,解决方法及分析。

加法器电路的实现代码如下:

module m10counterGU(clk,state);
    input clk;
    output reg [3:0]state;
    //Excess-3 code
    parameter S0=4'b0011,S1=4'b0100,
               S2=4'b0101,S3=4'b0110,
               S4=4'b0111,S5=4'b1000,
               S6=4'b1001,S7=4'b1010,
               S8=4'b1011,S9=4'b1100;
   always @(negedge clk)
         case (state)
            S0:state<=S1;
            S1:state<=S2;
            S2:state<=S3;
            S3:state<=S4;
            S4:state<=S5;
            S5:state<=S6;
            S6:state<=S7;
            S7:state<=S8;
            S8:state<=S9;
            S9:state<=S0;
            default:state<=S0;
        endcase

endmodule

仿真激励文件1的代码如下:

module sim_m10counterGU(   );
    reg clk;
    wire [3:0]state;
    
    m10counterGU uu(clk,state);
    
    initial begin clk = 1; end
    
    always begin #10;clk = ~clk;  end
endmodule

仿真结果如下图所示:

 这里,clk信号的初值设为1,得到的仿真结果,说明了,在clk的下降沿状态会发生转移。在前10ns,由于未出现下降沿,则状态值是不确定的。

如果,在仿真激励文件中,将clk信号的初值设为0,见下面这个仿真激励文件2,则得到的结果如下:

module sim_m10counterGU(   );
    reg clk;
    wire [3:0]state;
    m10counterGU uu(clk,state);
    initial begin clk = 0; end
    always begin #10;clk = ~clk;  end
endmodule

 得到这个结果,说明,在vivado里仿真时,clk的低电平状态也会触发always语句块描述的电路去动作。此时,低电平状态跟下降沿的作用是相同的。因此,上图红色框标出的地方,在计数器从初值开始计数。

问题讨论:

     由于这个现象的存在,在进行仿真测试的时候,建议采用方法1进行测试。因为,采用方法2,会隐藏计数器初值设置功能必要性的问题。会造成这样的误解:就是不需要设置初值,计数器会自动开始从初值开始计数。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ntGrace

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值