Неявное объявление типа сети и `default-nettype - PullRequest
2 голосов
/ 22 октября 2019

У меня вопрос к директиве default_nettype от SystemVerilog.

По умолчанию следующий код в порядке.

module m1 (
   input logic i1,
   output logic o1
   );
   logic l1;
   assign l1 = i1;
   assign o1 = l1;
endmodule

Однако, когда я изменяю тип сети по умолчанию на none:

`default_nettype none

только i1 вызывает ошибку:

ERROR: [VRFC 10-1103] net type must be explicitly specified for i1 when default_nettype is none ...

У меня вопрос, почему только input logic i1 вызывает ошибку и требует явного wire, но output logic o1 и logic l1 нет.

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

В Verilog слишком много неявных правил, чтобы приспособиться к ленивым программистам (то есть людям, которые были заинтересованы в разработке аппаратного обеспечения, а не в написании программного обеспечения)

Эта ошибка объяснена в разделе 23.2.2.3 Правила определения типа порта, тип данных и направление

Для первого порта в списке портов в стиле ANSI:

  • Если тип порта опущен:
    • Для портов input и inout порт должен по умолчанию использовать сеть типа сети по умолчанию. Тип сети по умолчанию может быть изменен с помощью директивы компилятора `default_nettype

Это неявное правило 'net' port противоположно тому, которое используется при объявлении выходных портови все остальные объявления вне портов. Причиной этого является то, что входные порты - это подавляющее большинство портов, используемых в модуле, а сохранение соединений портов в качестве проводов позволяет сворачивать порты, что более эффективно для моделирования.

2 голосов
/ 22 октября 2019

Это запутанная часть SystemVerilog. Ваш код работает на моем симуляторе, который выводит предупреждение вместо ошибки.

Если вы достаточно погрузитесь в сообщения справки, вы получите, что «тип» идентификатора (как в «net» против «var», напротив «datatype»)«Это логика или что-то еще) является контекстно-зависимым, и конкретно входные порты являются сетями по умолчанию, в то время как выходные порты являются переменными по умолчанию. Это означает, что с параметром «default_nettype none» все ваши входные порты не полностью описаны, поскольку компилятор не знает функцию разрешения для сети (например, вам может понадобиться палочка). Ваши выходные порты, будучи переменными, не нуждаются в функции разрешения, и поэтому там не выдается никакой ошибки.

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

Насколько я понимаю, "default_nettype none" в основном используется, чтобы гарантировать, что у вас нетнеобъявленные идентификаторы (приводящие к несоответствию ширины из-за однобитового вывода) и порт объявляются, так что вы можете проверить, есть ли у вашего инструмента опция вывода провода для портов в любом случае (опять же, мой симулятор выдает предупреждение и делает это по умолчанию,и синтезатор не жалуется)модуль.

РефОтношение к неявному объявлению сети - это раздел 6.10 в IEEE 1800-2017, хотя следование упомянутым выше разделам, похоже, указывает только на объявления не-ANSI ... вам может потребоваться более глубокое погружение, чтобы полностью понять суть вопроса.

...