Похоже, что вы пытаетесь все время копировать 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]
.