сгенерировать инструкцию: verilog

#for-loop #verilog

#для-цикла #верилог #для цикла #verilog

Вопрос:

Мне нужно объявить регистр внутри инструкции генерации для хранения некоторых временных значений,

для использования в инстанциациях.

у меня есть

 generate

for(i=0; i< N; i=i 1)
begin: i_loop
    Inst_file u(S1(i),P1(i),S(i),P(i)); 
    /* S1 and P1 have N bits and 
       S = S1 ^ P1; 
       P = S1 amp; P1 
     */
end //i_loop
  

S1 и P1 — это простая комбинационная логика, и я использовал их в качестве проводов для первого

итерация. Но после каждой итерации i мне нужно назначить выходные данные S и P в качестве входных данных

(т.е. заменить S1 и P1 на S и P).

Я понимаю, что я должен сделать это с помощью реестра, а не проводного (я прав?)

В таком случае мне нужны S1 и P1 в качестве reg. Я попытался использовать оператор always внутри

сгенерировать. Выдает ошибку.

Можете ли вы, пожалуйста, предложить выход..

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

1. Пожалуйста, отформатируйте свой код, см. meta.stackexchange.com/questions/22186 /… . Возможно, вы захотите сначала написать код без generate , пока у вас не появится больше интуиции относительно того, как все должно выглядеть в verilog. generate позволяет использовать стенографию, но не является существенной особенностью языка.

2. @Andy: Хорошо, Энди, в дальнейшем я позабочусь о форматировании 🙂 Спасибо за ссылку.

Ответ №1:

Вы должны использовать шину шириной N 1 бит и выводить всю инициализацию за пределы блока генерации. Я считаю, что что-то вроде этого подойдет:

 wire [N:0]Sarray;
wire [N:0]Parray;

// initialize Sarray[0] and Parray[0] here using continuous assignment

generate
for(i=0; i< N; i=i 1)
begin: i_loop

    Inst_file u(Sarray[i],Parray[i],Sarray[i 1],Parray[i 1]);

end //i_loop
  

Sarray[0] и Parray[0] должны быть инициализированы для использования на первой итерации; Sarray [N] и Parray [N] будут конечным выходным значением цепочки модулей.

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

1. Спасибо, что ты виртуальный 🙂 Я попробую это.