Короткий ответ: потому что при запуске 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' в конце.