2016-11-11

Verilog一段错误代码分析

[code]
reg [3:0] Count_EN;
localparam PWen=4'd12;
always@(posedge CLK or negedge RST)
begin
if(!RST)
Count_EN<=0;
else if(Count_EN==PWen)
Count_EN<=0;
else
Count_EN<=Count_EN+1'b1;
end
[/code]

此电路存在一个问题即:

Count_EN没有初始化值。

也就是说:当RST从一开始的时候就是1的话,即不满足条件一,Count_EN<=0不执行。那么Count_EN将一直处于不定态。于是else语句的加1操作相当于在一个不定态加1,得出的结果自然还是不定态。所以电路最终不能实现计数功能!

从仿真结果看:

counter_en_x



RST从一开始就是1,所以该电路不存在计数功能。

如果一开始RST为0,那么Count_EN将被初始化为0,电路的计数功能也自然能够工作。

counter_en_x1

解决办法:

解决办法就是初始化寄存器:reg [3:0] Count_EN=0;

http://stackoverflow.com/questions/10005411/assign-a-synthesizable-initial-value-to-a-reg-in-verilog

仿真结果如下:

counter_en

4 条评论:

  1. 做技术就是不断发现bug,改bug,发现bug,改bug的过程、。。。。

    回复删除
  2. 说的很对~谢谢支持哈~

    回复删除
  3. 哈哈,谢谢。其实我不知道要写什么,就随便写了的。O(∩_∩)O

    回复删除

谢谢您的留言^_^

Ubuntu SSR setting

使用electron-ssr客户端 https://github.com/shadowsocksrr/electron-ssr 设置proxy