- 13.1 Введение
- 13.1.1 Объявление библиотек
- 13.1.2 Основные элементы конфигурации
- 13.2 Библиотеки
- 13.2.1 Объявление библиотек - файл карты библиотек
- 13.2.1.1 Переход пути к файлу
- 13.2.2 Использование нескольких файлов карт библиотек
- 13.2.3 Сопоставление исходных файлов с библиотеками
- 13.3 Конфигурации
- 13.3.1 Основной синтаксис конфигурации
- 13.3.1.1 Пункт design
- 13.3.1.2 Пункт default
- 13.3.1.3 Пункт instance
- 13.3.1.4 Пункт cell
- 13.3.1.5 Пункт liblist
- 13.3.1.6 Пункт use
- 13.3.2 Иерархические конфигурации
13.1 Введение
Для облегчения обмена проектами Verilog между разработчиками и/или проектными группами, а также для обеспечения повторяемости точного содержания заданного сеанса моделирования (или другого инструмента), в языке Verilog используется концепция конфигураций. Конфигурация — это просто явный набор правил для указания точного описания источника, который будет использоваться для представления каждого экземпляра в проекте. Операция выбора исходного представления для экземпляра называется привязкой экземпляра.
// file top.v
module top();
adder a1(...);
adder a2(...);
endmodule
// file adder.v
module adder(...);
// сумматор RTL
// описание
...
endmodule
// file adder.vg
module adder(...);
// сумматор на уровни вентилей
// описание
endmodule
Рассмотрим использование описания RTL сумматора в adder.v для экземпляра a1 в модуле top и описания сумматора на уровне вентилей в adder.vg для экземпляра a2. Чтобы указать этот конкретный набор привязок экземпляров и избежать необходимости изменять исходное описание для указания нового набора, можно использовать конфигурацию.
config cfg1; // задаем rtl сумматор для top.a1, сумматор на уровне вентилей для top.a2
design rtlLib.top;
default liblist rtlLib;
instance top.a2 liblist gateLib;
endconfig
Описание конструкции Verilog начинается с модуля (или модулей) верхнего уровня (см. 12.1.1. Из исходного описания этого модуля находятся экземпляры модули (или дочерние модули), затем находятся исходные описания для определений модулей этих подмодулей, и так далее, пока каждый экземпляр в конструкции не будет сопоставлен с исходным описанием.
13.1.1 Объявление библиотек
Для сопоставления экземпляра Verilog с исходным описанием можно использовать концепцию символьной библиотеки, которая представляет собой просто логическую коллекцию элементов проектирования (таких как модули, примитивы или конфигурации). Эти элементы проектирования могут называться ячейками. Имя ячейки должно совпадать с именем обрабатываемого модуля/примитива/конфигурации. Синтаксис 13-1 определяет ячейку из данной библиотеки.
library_cell ::=
[library_identifier.]cell_identifier[:config]
Эта нотация дает символический метод ссылки на описания источников. Метод отображения описаний источников в библиотеки более подробно показан в 13.2.1. Необязательное расширение :config должно использоваться явно для ссылки на конфигурацию в случае, когда конфигурация имеет то же имя, что и модуль/примитив.
Для целей данного примера предположим, что файлы top.v и adder.v (т.е. описания RTL) были отображены в библиотеку rtlLib, а файл adder.vg (т.е. описание сумматора на уровне вентилей) — в библиотеку gateLib. Фактический механизм сопоставления исходных описаний с библиотеками подробно описан в разделе 13.2.
13.1.2 Основные элементы конфигурации
Оператор design в config cfg1 первого примера из раздела 13.1 определяет модуль верхнего уровня в проекте и то, какое описание источника должно быть использовано. В этом примере обозначение rtlLib.top указывает, что описание модуля верхнего уровня должно быть взято из rtlLib. Поскольку top.v и adder.v были сопоставлены с этой библиотекой, известно, что фактическое описание модуля берется из top.v.
Объявление default в сочетании с пунктом liblist указывает, что по умолчанию все подэкземпляры top (т.е. top.a1 и top.a2) должны быть взяты из rtlLib, что означает, что будут использоваться описания в top.v и adder.v, которые были отображены на эту библиотеку. Для базовой конструкции, которая может быть полностью rtl, этого может быть достаточно, чтобы полностью указать привязку для всей конструкции. Однако в данном случае необходимо привязать экземпляр top.a2 adder к описанию на уровне вентилей.
Объявление instance указывает, что для конкретного экземпляра top.a2 описание источника должно быть взято из gateLib. Объявление instance отменяет правило по умолчанию для этого конкретного экземпляра. Поскольку adder.vg был сопоставлен с gateLib, это объявление предписывает использовать для экземпляра top.a2 описание уровня вентилей в adder.vg.
13.2 Библиотеки
Как упоминалось в предыдущем подпункте, библиотека — это логическая коллекция ячеек, которые сопоставлены с определенными файлами описания исходных текстов. Символьная нотация lib.cell[:config] поддерживает раздельную компиляцию исходных файлов, предоставляя независимое от файловой системы имя для ссылки на исходные описания при связывании экземпляров в проекте. Это также позволяет нескольким инструментам, которые могут иметь различные модели использования вызовов, совместно использовать одну и ту же конфигурацию.
13.2.1 Объявление библиотек — файл карты библиотек
При разборе файла (или файлов) с описанием исходного текста синтаксический анализатор должен сначала прочитать информацию о сопоставлении библиотек из предопределенного файла, прежде чем читать любые исходные файлы. Имя этого файла и механизм его чтения зависят от конкретного инструмента, но все совместимые инструменты должны предоставлять механизм для указания одного или нескольких файлов сопоставления библиотек, которые будут использоваться для конкретного вызова инструмента. Если указано несколько файловых карт, то они должны быть прочитаны в том порядке, в котором они указаны.
Для целей данного обсуждения предположим существование файла с именем lib.map в текущем рабочем каталоге, который автоматически считывается синтаксическим анализатором перед разбором любых исходных файлов, указанных в командной строке. Синтаксис для объявления библиотеки в файле library map показан в Синтаксисе 13-2.
library_text ::=
{ library_description }
library_description ::=
library_declaration
| include_statement
| config_declaration
library_declaration ::=
library library_identifier file_path_spec [ { , file_path_spec } ]
[ -incdir file_path_spec { , file_path_spec } ] ;
include_statement ::=
include file_path_spec ;
Детали файла карты библиотеки
- file_path_spec использует специфические для файловой системы обозначения для указания абсолютного или относительного пути к определенному файлу или набору файлов. Могут быть использованы следующие сокращения:
- ? односимвольный подстановочный знак (соответствует любому одиночному символу)
- * многосимвольный подстановочный знак (соответствует любому количеству символов в имени каталога/файла)
- … иерархический подстановочный знак (соответствует любому количеству иерархических каталогов)
- .. указывает родительский каталог
- . указывает каталог, содержащий lib.map
- Пути, заканчивающиеся на /, включают все файлы в указанном каталоге. Идентично /*.
- Пути, не начинающиеся с /, являются относительными к директории, в которой находится текущий файл lib.map.
2. Пути ./*.v и *.v идентичны, и оба указывают все файлы с суффиксом .v в текущем каталоге.
Любой файл, встреченный компилятором, который не соответствует спецификации file_path_spec какой-либо библиотеки, по умолчанию будет скомпилирован в библиотеку с именем work.
Чтобы выполнить сопоставление библиотек, рассмотренное в примере в разделе 13.1, используйте следующие определения библиотек в файле lib.map:
library rtlLib *.v; // соответствует всем файлам в текущем каталоге с суффиксом .v
library gateLib ./*.vg; // сопоставляет все файлы в текущем каталоге с суффиксом .vg
13.2.1.1 Переход пути к файлу
Если имя файла потенциально соответствует нескольким спецификациям пути к файлу, спецификации пути должны быть перейти в следующем порядке:
- Спецификации путей к файлам, которые заканчиваются явным именем файла
- Спецификации путей к файлам, которые заканчиваются именем файла с подстановочным знаком
- Спецификации путей к файлам, которые заканчиваются каталогом
Если имя файла совпадает со спецификацией пути в нескольких определениях библиотеки (после применения вышеуказанных правил разрешения), это будет ошибкой.
Используя эти правила с определениями библиотек в файле lib.map, все исходные файлы, с которыми сталкивается синтаксический анализатор/компилятор, могут быть сопоставлены с уникальной библиотекой. После сопоставления исходных описаний с библиотеками, ячейки, определенные в этих библиотеках, становятся доступными для связывания.
Разработчики инструментов могут посчитать удобным предоставить аргумент командной строки для явного указания библиотеки, в которую должен быть отображен разбираемый файл, который будет переопределять любые определения библиотек в файле lib.map. Если эти библиотеки не существуют в файле lib.map, доступ к ним можно получить только через явную конфигурацию.
Перевод Официального Стандарта Verilog HDL
Если несколько ячеек с одинаковым именем отображаются на одну и ту же библиотеку, то в библиотеку записывается последняя встреченная ячейка. Это делается для поддержки модели использования «отдельной компиляции» (см. 13.4.3), где предполагается, что встреча с ячейкой после того, как она была ранее скомпилирована, является перекомпиляцией ячейки. В случае, когда несколько модулей с одинаковыми именами сопоставлены с одной библиотекой в одном вызове компилятора, должно быть выдано предупреждающее сообщение.
13.2.2 Использование нескольких файлов карт библиотек
Помимо указания информации о сопоставлении библиотек, файл lib.map может включать ссылки на другие файлы lib.map. Команда include используется для вставки всего содержимого файла карты библиотеки в другой файл во время разбора. В результате содержимое включенного файла карты появляется на месте команды include.
Синтаксис файла lib.map ограничен спецификациями библиотек, операторами include и стандартным синтаксисом комментариев Verilog. Синтаксис 13-3 показывает синтаксис команды include.
include_statement ::=
include file_path_spec ;
Если спецификация пути к файлу, в операторе include или библиотеке, описывает относительный путь, он должен быть относительным к местоположению файла, который содержит путь к файлу. Адреса библиотек должны включать локальный файл карты библиотеки в дополнение к исходному содержимому библиотеки. Отдельные пользователи могут просто включить файл карты библиотеки поставщика в свой собственный файл карты, чтобы получить доступ к содержимому предоставленной библиотеки.
13.2.3 Сопоставление исходных файлов с библиотеками
Для каждого определения ячейки, встречающегося во время разбора/компиляции, имя разбираемого исходного файла сравнивается со спецификацией пути к файлу в объявлениях библиотек во всех используемых файлах карты библиотек. Ячейка отображается в ту библиотеку, спецификация пути к файлу которой совпадает с именем исходного файла.
13.3 Конфигурации
Как упоминалось во введении этого пункта, конфигурация — это просто набор правил, применяемых при поиске ячеек библиотеки, к которым можно привязать экземпляры. Синтаксис конфигураций показан в пункте 13.3.1.
13.3.1 Основной синтаксис конфигурации
Синтаксис конфигурации показан в Синтаксис 13-4.
Перевод Официального Стандарта Verilog HDL
13.3.1.1 Пункт design
В объявлении design называется библиотека и ячейка модуля или модулей верхнего уровня в иерархии проектирования, заданной конфигурацией. Должно быть одно и только одно объявление конструкции, но в объявлении конструкции может быть перечислено несколько модулей верхнего уровня. Идентифицированная ячейка или ячейки сами не могут быть конфигурациями. Однако, возможно, что именнованые конструкции могут иметь те же имена, что и конфигурации.
Объявление design должно появляться перед любыми объявлением правил конфигурации в config.
config_declaration ::=
config config_identifier ;
design_statement
{config_rule_statement}
endconfig
design_statement ::=
design { [library_identifier.]cell_identifier } ;
config_rule_statement ::=
default_clause liblist_clause ;
| inst_clause liblist_clause ;
| inst_clause use_clause ;
| cell_clause liblist_clause ;
| cell_clause use_clause ;
Если идентификатор библиотеки опущен, то для поиска ячейки будет использоваться библиотека, содержащая конфигурацию.
13.3.1.2 Пункт default
Синтаксис для пункта default указан в Синтаксис 13-5.
default_clause ::=
default
Пункт default выбирает все экземпляры, которые не соответствуют более конкретной пункту выбора. Пункт расширения use (см. 13.3.1.6) не может быть использован с пунктом выбора default. Для других пунктов расширения не может быть более одного пункта default, определяющего пункт расширения.
Для простых конфигураций может оказаться достаточным указать список библиотек через default (см. 13.3.1.5).
13.3.1.3 Пункт instance
Пункт instance используется для объявления конкретного экземпляра, к которому применяется пункт расширения. Синтаксис пункта instance указан в Синтаксис 13-6.
inst_clause ::=
instance inst_name
inst_name ::=
topmodule_identifier{.instance_identifier}
Имя экземпляра, связанное с ключевым словом instance, является иерархическим именем Verilog, начиная с модуля верхнего уровня конфигурации (т.е. имя ячейки в операторе design).
13.3.1.4 Пункт cell
Пункт выбора cell называется ячейкой, к которой она применяется. Синтаксис пункта выбора cell указан в Синтаксисе 13-7.
cell_clause ::=
cell [ library_identifier.]cell_identifier
Если указано необязательное имя библиотеки, то правило выбора применяется к любому экземпляру, который связан или рассматривается для привязки к выбранной библиотеке и ячейке. Ошибкой будет, если имя библиотеки включено в условие выбора cell, а соответствующее условие расширения является условием расширения списка библиотек.
13.3.1.5 Пункт liblist
Пункт liblist задает упорядоченный набор библиотек, в которых будет выполняться поиск текущего экземпляра. Синтаксис для предложения liblist указан в[Синтаксис 13-8.
Перевод Официального Стандарта Verilog HDL
liblist_clause ::=
liblist { library_identifier }
Синтаксис 13-8 — Синтаксис для пункта liblist
liblist наследуются иерархически вниз по мере связывания экземпляров. При поиске ячейки для связывания с текущим несвязанным экземпляром и при отсутствии применимого условия расширения связывания, объявленный список библиотек перебирается в порядке объявления.
Текущий список библиотек выбирается с помощью пункта выбора. Если не выбран ни один пункт списка библиотек или если выбранный список библиотек пуст, то список библиотек содержит единственное имя, которое является библиотекой, в которой находится ячейка, содержащая несвязанный экземпляр (т.е. библиотека родительской ячейки).
13.3.1.6 Пункт use
Пункт use задает конкретную привязку для выбранной ячейки. Синтаксис пункта use указан в Синтаксис 13-9.
use_clause ::=
use [library_identifier.]cell_identifier[:config]
Пункт use может использоваться только в сочетании с пунктом выбора instance или cell. Оно определяет точную библиотеку и ячейку, с которой связана выбранная ячейка или экземпляр.
Пункт use не влияет на текущее значение списка библиотек. На практике часто бывает необходимо указать несколько утверждений правил config, одно из которых определяет привязку, а другое — список библиотек.
Если lib.cell, на которую ссылается пункт use, является конфигурацией, которая имеет то же имя, что и модуль/примитив в той же библиотеке, то к lib.cell можно добавить необязательный суффикс :config для явного указания конфигурации.
Если имя библиотеки опущено, библиотека наследуется от родительской ячейки.
Оператор use может создавать ситуации, когда имя модуля несвязанного экземпляра и имя ячейки, с которой он связан, отличаются.
Перевод Официального Стандарта Verilog HDL
13.3.2 Иерархические конфигурации
instance top.a1.foo use lib1.foo:config;
// привязка к конфигурации foo в библиотеке lib1
указывает, что экземпляр top.a1.foo должен быть заменен иерархией проектирования, указанной в конфигурации lib1.foo:config. Объявление design в lib1.foo:config определяет фактическую привязку для экземпляра top.a1.foo, а правила, указанные в конфигурации, определяют конфигурацию всех других подэкземпляров под top.a1.foo.
config bot;
design lib1.bot;
default liblist lib1 lib2;
instance bot.a1 liblist lib3;
endconfig
config top;
design lib1.top;
default liblist lib2 lib1;
instance top.bot use lib1.bot:config;
instance top.bot.a1 liblist lib4;
// ОШИБКА - невозможно установить liblist для top.bot.a1 из этой конфигурации
endconfig