Ошибка синтеза в операторе CASE в Verilog

Я новичок в 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 .. но также получил ту же ошибку.

Заранее спасибо!


person marsia    schedule 11.08.2014    source источник


Ответы (2)


Я не понимаю, как i может быть -1, но возможно, что оно больше 31, что выходит за пределы допустимого диапазона. Есть пара проблем с синтезом:

  1. i=32 уже вне зоны действия X[31:0]. Его старший бит равен 31.
  2. i выйдет за пределы диапазона, когда width > 31. width — это 16-битное значение без знака, то есть его максимальное значение равно 65535 (т. е. 216-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 или i за пределами всегда блока. В противном случае возникают дополнительные ошибки.

person Greg    schedule 11.08.2014
comment
Я не думаю, что for (i=width; i>=0; i=i-1) можно развернуть статически, что, как я полагал, также вызывает проблемы с синтезом. - person Morgan; 11.08.2014
comment
Спасибо за вклад! Первая ошибка была моей, когда я переделывал код. Я также думал, что верхний предел должен быть проблемой, но сообщение об ошибке вводило в заблуждение. - person marsia; 12.08.2014

Точно неясно, почему вы нажимаете условие -1, но похоже, что вы пытаетесь создать маску ширины «ширина», которую было бы легче выполнить следующим образом:

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

Редактировать: добавлен спецификатор ширины для сдвига, это может уменьшить область синтеза.

person Guy    schedule 11.08.2014
comment
Большое спасибо! Я тоже думал об этом, но он синтезировался в монстра вместе с остальной частью дизайна... даже хуже, чем X=2**width-1. Я просто пытаюсь изучить возможности оптимизации моего дизайна с точки зрения площади. - person marsia; 12.08.2014