Являются ли директивы Verilog обязательными, например, в масштабе времени?

#verilog #directive

Вопрос:

Является timescale ли директива или любая другая директива обязательной в Verilog (2001) или ее использование является вопросом соглашения или стиля? Например, я обычно использую default_nettype none для обеспечения выполнения явных сетевых деклараций на протяжении всей моей реализации. Однако Verilog не требует, чтобы я это делал.

Когда дело доходит до timescale этого , я, очевидно, помещаю его в верхнюю часть своего тестового стенда HDL. Но зачем использовать его в каждом отдельном модуле IP? В случае непоследовательных определений, может ли это привести к большему количеству проблем, а не предотвратить их?

Ответ №1:

Вообще говоря, директивы компилятора Verilog не являются обязательными.

Для timescale этого обратитесь к IEEE Std 1800-2017, раздел 22.7 `Шкала времени:

Если шкала времени не указана или она была сброшена директивой «resetall», единица измерения времени и точность по умолчанию зависят от конкретного инструмента.

Директивы являются глобальными по области действия, что означает, что, когда компилятор встречает одну из них, она остается в силе для всего следующего скомпилированного кода (до тех пор, пока не будет обнаружен другой). Таким образом, нет необходимости добавлять timescale директивы во весь ваш код.

Однако на практике я видел, как компиляторы генерируют ошибки, если 1-й модуль (или модули), скомпилированный, не имеет timescale директивы, но последующие модули имеют. Эти симуляторы также предлагают опцию командной строки для установки шкалы времени по умолчанию, чтобы избежать этой ошибки.

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

1. «[ … ] он остается в силе для всего следующего кода, который компилируется (до тех пор, пока не будет обнаружен другой код) » — timescale Для большей ясности следует избегать звуков во всех модулях, кроме верхних.

2. Директивы компилятора @fuesika не понимают иерархии Verilog, только порядок компиляции.

3. @dave_59 Как бы я узнал порядок компиляции? Подразумеваете ли вы, что следует включить (одну и ту же) директиву во все исходные файлы или использовать параметр командной строки компилятора, чтобы обеспечить согласованную шкалу времени?

4. @fuesika Если вы пишете сценарий/команду компиляции, то вы знаете (или должны знать) порядок компиляции. И вам нужно знать взаимодействие между директивами шкалы времени и параметрами командной строки. Кстати, SystemVerilog удаляет некоторые из этих зависимостей порядка компилятора с timeunit помощью конструкции.

5. «IEEE LRM 1800-2009, раздел 3.14.2.3, гласит, что это ОШИБКА, если для некоторых модулей указана шкала времени, а для других-нет». Это не делает определение в исходных файлах наиболее привлекательным для меня. Скорее, шкала времени/единица времени будет установлена в качестве параметра командной строки.