#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. Ну, я считаю, что только для этой части нет проблем использовать цикл, но когда код становится длиннее, трудно контролировать цикл. Слишком большой цикл приведет к сбою синтеза. Я не рекомендую это и предпочитаю вводить вручную.