仿真和verilog综合之间的差异总是阻塞

时间:2017-02-22 10:38:35

标签: verilog fpga

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

input sig;
reg [3:0] cnt;
always @(sig) begin
    if(sig) 
        cnt = cnt + 1;
end

使用Modelsim进行模拟可以正常工作。当sig为高时,我在fpga(Spartan 6 by ise 14.7)上实现了代码,计数器连续计数!!! 抱歉我的英语不好。

1 个答案:

答案 0 :(得分:3)

你说模型上的模拟“工作正常”,但没有说明你如何定义“正确”。我模拟它并没有任何有趣的事情发生:cnt仍然在4'bx,因为你没有机制来初始化它。我想你希望cntsig的每个上升沿递增cnt。如果您初始化cnt(请参阅注释掉的代码),则会发生这种情况:

https://www.edaplayground.com/x/4zXf

然而,虽然这个代码可以合成,但这不是同步设计,因此它合成了无意义(加法器和四个锁存器)。假设您需要sigalways @(posedge sig) cnt <= cnt + 1; 的每个上升沿递增,您需要同步递增此设计

4'bx

这将合成加法器和四个D型触发器。

重置计数器是正常的,因为否则在实际硬件中计数器将具有未知值(因此模拟中的cnt)。您可以在FPGA中初始化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;

但您可能需要考虑重置信号:

sig

我对clk的命名感到不安;大多数人会称之为clock$(document).ready(function () { $('<img src="/wp-content/uploads/2017/01/MachineLearning_hoverx2.png">'); $('<img src="/wp-content/uploads/2017/01/MachineLearningx2.png">'); }); 或类似的东西。这个名字表明你可能不熟悉同步设计。如果是这样,您应该了解相关信息,并且还应该阅读此答案here