【问题标题】:Synthesis error on a CASE statement in VerilogVerilog 中 CASE 语句的综合错误
【发布时间】:2014-08-14 00:29:48
【问题描述】:

我是 Verilog 的新手,我想知道您对我在尝试合成下面引用的代码部分时遇到的错误的看法:

input [31:0] A;
reg [31:0] X,Y;
reg [15:0] width;
input action;       

always@*
begin

  width= A [31:16]; 
  if (action==1)    
  begin    
    case (width) 
      16'b0: X=0;
        default: 
          begin
            for (i=32; i>=width+1 ; i=i-1)
              X[i]=0;
            for (i=width; i>=0; i=i-1)
              X[i]=1;
          end 
    endcase 
    Y=X >> 1;
  end
end

我正在使用 Cadence 综合工具,我得到的错误是在我的这部分代码中说:

索引“X[-1]”不在声明的有效范围内 [31:0]

我不明白,因为即使width=0 我有一个不应该涉及 for 循环的特殊情况。我还尝试将限制增加到 width +2,width +1 然后 shift the quantity X by 2 ..但也得到了同样的错误。

提前谢谢你!

【问题讨论】:

    标签: verilog synthesis case-statement register-transfer-level cadence


    【解决方案1】:

    我看不出i 怎么可能是-1,但它有可能大于超出范围的31。有几个综合问题:

    1. i=32 已经超出 X[31:0] 的范围。它的 MSB 为 31。
    2. width > 31 时,i 将超出范围。 width 是一个 16 位无符号值,表示其最大值为 65535(即 216-1),最小值为 0。
    3. 合成需要循环才能静态展开。这意味着循环的数量必须是恒定的。 width 等变量不能在循环条件中。

    可合成的 for 循环如下所示:

    for (i=31; i>=0; i=i-1)
      X[i] = (width>=i);
    

    我假设 always 块上方的 width= A [31:16]; 是复制过去的错字,因为它是非法语法。我还假设在 always 块之外的 widthXYi 上没有其他分配。否则会有额外的错误。

    【讨论】:

    • 我不认为for (i=width; i>=0; i=i-1) 可以静态展开,我认为这也会导致合成问题。
    • 感谢您的贡献!第一个错误是我在修改代码时犯的。我也在想应该是一个问题的上限,但错误消息具有误导性。
    【解决方案2】:

    目前还不清楚您究竟为什么要达到 -1 条件,但看起来您正在尝试创建一个宽度为“width”的掩码,这更容易实现:

    always @*
      begin
        X = ((1 << width[4:0]) - 1)
      end
    

    编辑:为移位添加了宽度说明符,这可能会减少合成区域

    【讨论】:

    • 非常感谢!我也想过这一点,但它与设计的其余部分一起合成了一个“怪物”......甚至比 X=2**width-1 更糟糕。我只是试图探索优化我的设计的可能性地区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多