0

我是 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 +2width +1然后shift the quantity X by 2..但也遇到了同样的错误。

先感谢您!

4

2 回答 2

1

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

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

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

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

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

于 2014-08-11T16:19:45.763 回答
0

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

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

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

于 2014-08-11T21:25:35.857 回答