verilog always块模拟与合成的差异

verilog always块模拟与合成的差异,verilog,fpga,Verilog,Fpga,我设计了一个简单的计数器。 下面是代码 input sig; reg [3:0] cnt; always @(sig) begin if(sig) cnt = cnt + 1; end 使用Modelsim进行的仿真工作正常。我在fpga上实现了这段代码(ISE14.7的Spartan6),当sig很高时,计数器会连续计数!!!? 很抱歉我的英语不好。您说Modelsim上的模拟“工作正常”,但没有说明如何定义“正确”。我模拟了它,但没有发生任何有趣的事情:cnt保持

我设计了一个简单的计数器。 下面是代码

input sig;
reg [3:0] cnt;
always @(sig) begin
    if(sig) 
        cnt = cnt + 1;
end
使用Modelsim进行的仿真工作正常。我在fpga上实现了这段代码(ISE14.7的Spartan6),当sig很高时,计数器会连续计数!!!?
很抱歉我的英语不好。

您说Modelsim上的模拟“工作正常”,但没有说明如何定义“正确”。我模拟了它,但没有发生任何有趣的事情:
cnt
保持在
4'bx
位置,因为您没有初始化它的机制。我可以想象,您打算
cnt
sig
的每个上升沿上递增。如果您初始化了
cnt
(请参阅注释掉的代码),则会发生这种情况:

然而,虽然此代码可以合成,但这不是同步设计,因此它合成为无意义(一个加法器和四个锁存器)。假设您确实需要
cnt
sig
的每个上升沿上递增,您需要同步递增此设计:

<>但你可能需要考虑复位信号:

always @(posedge sig, posedge reset)
  if(reset) 
    cnt <= 4'b0;  // or some other reset value
  else
      cnt <= cnt + 1;
始终@(posedge信号,posedge重置)
如果(重置)
碳纳米管
reg [3:0] cnt = 4'b0;
always @(posedge sig, posedge reset)
  if(reset) 
    cnt <= 4'b0;  // or some other reset value
  else
      cnt <= cnt + 1;