首页 > 解决方案 > Verilog 设计问题

问题描述

如何修复以下代码中的多个驱动程序默认值组合循环问题?

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

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

标签: verilogsystem-veriloghdlregister-transfer-level

解决方案


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

  1. myregister在 2 个不同的 always 街区内行驶。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 和非阻塞分配的翻牌不会处于循环中。


推荐阅读