本文以余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,会隐藏计数器初值设置功能必要性的问题。会造成这样的误解:就是不需要设置初值,计数器会自动开始从初值开始计数。