【问题标题】:Verilog Design ProblemsVerilog 设计问题
【发布时间】:2020-05-14 23:53:44
【问题描述】:

如何解决以下代码中的多驱动默认值组合循环问题?

always @(posedge clk)
  myregister <= #1 myregisterNxt;

always @* begin
  if(reset)
    myregisterNxt = myregisterNxt +1;
  else if(flag == 1)
    myregister = myregister +2;
end

【问题讨论】:

    标签: verilog system-verilog hdl register-transfer-level


    【解决方案1】:

    您的代码中至少有 3 个问题:

    1. 您在 2 个不同的 always 街区内驾驶 myregister。 Synthesis 将在那里找到多个驱动程序。模拟结果将是不可预测的。规则:您必须在一个 always 块内驱动信号。

    2. 您在myregisterNxt = myregisterNxt +1 上进行了零延迟循环。由于您在那里使用的是无翻牌,因此它是模拟和硬件中的真实循环。你需要用触发器打破这样的循环

    3. #1延迟不可合成,这里根本不需要。

    您没有描述您要构建的内容,并且很难从我们的代码示例中弄清楚。一般情况下,reset 用于设置初始值。因此,以下内容可能是您的模板。

    always @(posedge clk) begin
        if (reset)
           myregister <= 0;
        else 
           myregister <= myregister + increment;
    end
    
    always @*  begin
       if (flag == 1) 
          increment = 1;
       else 
          increment = 2;
    end
    

    有 posedge clk 和非阻塞赋值的 flop 不会处于循环中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 2011-11-09
      相关资源
      最近更新 更多