Поведение autoreginput verilog_mode при использовании назначения - PullRequest
0 голосов
/ 11 декабря 2018

Интересно, возможен ли следующий случай.
У меня есть:

module a(
input [2:0] a_i
);
endmodule

module b ();

 /*AUTOREGINPUTS*/

 a u_a(/*AUTOINST*/)
endmodule

Расширяется до:

 module b ();

 /*AUTOREGINPUTS*/
 reg [2:0] a_i;
 a u_a(/*AUTOINST*/
       .a_i(a_i))
endmodule

Но если я изменю добавление строки assign a_i = '0;, тогда он не расширяется AUTOREGINPUTS больше.Есть ли способ расширить его, даже если я выполняю задание?

1 Ответ

0 голосов
/ 12 декабря 2018

Короткий ответ: потому что при запуске verilog-auto для заполнения /*AUTOREGINPUT*/ будет исключен любой сигнал, который уже объявлен, и, добавив assign a_i = '0;, вы объявите a_i.

В Verilog,явные объявления переменных не требуются, и при определенных обстоятельствах примут необязательный тип сети, если не будут объявлены.Итак, если бы у меня было следующее:

module x;
  assign myVar = '0;
endmodule

myVar будет неявно объявлено как сеть с сетевым типом по умолчанию (который по умолчанию равен wire).Вы можете прочитать больше в System-Verilog LRM (IEEE1800-2009 Раздел 6.10).Одна из рекомендаций, чтобы избежать опечаток, генерирующих неявно объявленные переменные, состоит в том, чтобы изменить тип сети по умолчанию с макросом `default_nettype на none (то есть `default_nettype none в верхней части каждого файла);это заставляет все переменные быть явно объявленными, иначе компилятор / синтезатор выдаст ошибку. Режим

verilog-mode в emacs знает о неявном объявлении и, как таковой, не будет автоматически генерировать ничего объявленного.Таким образом, когда вы добавляете оператор assign, вы объявляете a_i, и поэтому автогенератор не будет «переопределять» a_i.

Чтобы избежать этого, я могу порекомендовать запустить генератор только перед тем, как назначитьлюбая из переменных, которые будут сгенерированы автоматически.Я не уверен, правильно ли он обрабатывает `default_nettype none, но я бы предположил, что нет.

Также обратите внимание, это должно быть /*AUTOREGINPUT*/, а не /*AUTOREGINPUTS*/, нет 's' в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...