Verilog: неполный выбор или индексированный частичный выбор не могут быть применены к памяти

#verilog

#verilog

Вопрос:

В Verilog:

Однако для массива reg queue[3:0] = 4'b1010; , который я могу сделать queue <= {queue[0], queue[3:1]}; , когда дело доходит до 2d-массива reg [1:0] queue [3:0]; , сообщается об ошибке, когда я делаю с ним то же самое queue <= {queue[0], queue[3:1]}; . «частичный или индексированный частичный выбор не может быть применен к памяти»

Поэтому я делаю это только глупо:

 queue[0] <= queue[1];
queue[1] <= queue[2];
queue[2] <= queue[3];
queue[3] <= queue[0];
 

Есть ли лучший способ сделать это, например, только одно предложение.

Спасибо!

Комментарии:

1. Вы пытаетесь переместить каждый элемент массива в другой индекс или пытаетесь выполнить битовый сдвиг для каждого элемента? Если вы пытаетесь переместить каждый элемент в массив, это, вероятно, плохая идея, было бы невозможно сделать с массивом на основе оперативной памяти за один цикл.

2. @Tim Я пытаюсь сделать поворот вправо с битовым сдвигом. Но на самом деле это сдвиг массива на 1d для 2d-массива.

Ответ №1:

Вы всегда можете использовать for loop для этого:

 queue[3] = queue[0];
for(i = 2; i >= 0; i = i - 1) begin
  queue[i] = queue[i 1];
end
 

Комментарии:

1. означает ли это, что я должен определить другой reg «i», я не уверен, можно ли его синтезировать как дополнительный триггер. Раньше я избегал зацикливания.

2. Цикл разворачивается во время синтеза. Аппаратное обеспечение не создано для i . Я бы объявил i как integer (фактически идентично reg signed [31:0] ).

3. @CliffordVienna Круто! Спасибо.

4. Ну, я считаю, что только для этой части нет проблем использовать цикл, но когда код становится длиннее, трудно контролировать цикл. Слишком большой цикл приведет к сбою синтеза. Я не рекомендую это и предпочитаю вводить вручную.