Указание диапазона переменных в Verilog с использованием цикла for - PullRequest
6 голосов
/ 27 июля 2011

Я пытаюсь написать этот код:

 for (i = 0; i <= CONST - 1'b1; i = i + 1'b1)
                    begin : loop_inst

                        if (i < 3)
                        begin
                            if (changed[i] & !done_q[i])
                            begin
                                writedata[3-i] = en[i];
                                writedata[2-i:0] = readdata[2-i:0];
                                writedata[15:4-i] = readdata[15:4-i];
                            end
                        end
                        else
                        ...

По сути, расположение бита, на который я пытаюсь записать (en), меняется в зависимости от того, по какому адресу я говорю, в зависимости отi.Этот код не может быть синтезирован, потому что i не является константой.

Есть ли какой-нибудь другой способ обойти это?Единственный обходной путь, который я знаю, - это написание этих трех утверждений в CONST раз.Я надеюсь, что мне не нужно делать это в конце.Есть ли другое решение?

1 Ответ

4 голосов
/ 27 июля 2011

Похоже, что вы пытаетесь все время копировать readdata в writedata, но заполните LSB en, если выполняются определенные особые условия. Я также собираюсь предположить, что ваш цикл for находится в блоке always, и что вы намереваетесь создать комбо-логику.

Цикл for, как вы его написали, не имеет большого смысла для меня с точки зрения аппаратного обеспечения. Цикл for используется для построения массивов логики, и, как вы написано, что у вас будет как минимум 3 логических конуса, пытающихся установить значения на всей шине writedata. (Если он вообще что-то сгенерирует, это будет странная структура приоритетов).

Тем не менее, это, вероятно, диапазон выбора, на который жалуется ваш компилятор, то есть writedata[2-i:0], а не writedata[3-i] = en[i]; (что-либо с : в части выбора). Если вы хотите сделать что-то в том же духе, вы можете использовать «индексированные выборки деталей» (+: или -:), но в этом случае есть лучшие решения.

Я бы переписал его следующим образом - при условии, что я правильно предположил:)

always @( /*whatever*/ ) begin

    // default assignment
    writedata = readdata;

    // overwrite some bits in writedata for special cases
    for(i=0; i<3; i++) begin
        if( changed[i] & !done_q[i] )
             writedata[3-i] = en[i];
    end
end

В этом коде я устанавливаю writedata на readdata, а затем настраиваю результирующее значение writedata, если особые случаи находятся в игре. Цикл for строит 3 логических конуса, по одному на каждый из битов в writedata[3:1]. Я бы дважды проверил, является ли битовое отображение тем, что вы намереваетесь, т.е. сопоставить en[2:0] с writedata[1:3].

...