3. Классификации объектов VPI

Содержание

Объекты VPI классифицируются с помощью диаграмм модели данных. Эти диаграммы обеспечивают графическое представление тех объектов в проекте Verilog, к которым процедуры VPI должны предоставлять доступ. Диаграммы должны показывать связь между объектами и свойства каждого объекта. Объекты с достаточной общностью помещаются в группы. Групповые связи и свойства применяются ко всем объектам в группе.

В качестве примера, упрощенная диаграмма на рисунке 26-1 показывает, что существует связь «один ко многим» между объектами типа module и объектами типа net и связь «один к одному» между объектами типа net и объектами типа module. Объекты типа net имеют свойства vpiName, vpiVector и vpiSize с типами данных string, boolean и integer соответственно.

Диаграммы модели данных VPI представлены в 6.

Пример диаграммы объектных связей VPI
Рисунок 26-1. Пример диаграммы объектных связей
Для объектных отношений (если на диаграмме не показан специальный тег) тип, используемый для доступа, определяется добавлением «vpi» к началу наименования, причем первая буква каждого наименования должна быть заглавной. Используя приведенный выше пример, если приложение имеет дескриптор сети и хочет перейти к экземпляру модуля, в котором определена сеть, вызов будет выглядеть следующим образом:
modH = vpi_handle(vpiModule, netH);

где netH — дескриптор сети. В качестве другого примера, чтобы получить доступ к объекту «named event(именованное событие)», используйте тип vpiNamedEvent.

3.1. Доступ к связям и свойств объектов

VPI определяет тип данных С vpiHandle. Все объекты управляются через переменную vpiHandle. Доступ к дескрипторам объектов может осуществляться через связь с другим объектом или через иерархическое имя, как показано в следующем примере:
vpiHandle net; net = vpi_handle_by_name("top.m1.w1", NULL);

Этот вызов примера извлекает связь сети для top.m1.w1 и присваивает его переменной vpiHandle net. Второй аргумент NULL направляет программу на поиск имени на верхнем уровне проекта.

VPI предоставляет общие функции для таких задач, как обхода связей и определение значений свойств. Обход связей «один к одному» обходятся с помощью функции vpi_handle(). В следующем примере модуль, содержащий net, является производным от дескриптора к этому сети(net):
vpiHandle net, mod; net = vpi_handle_by_name("top.m1.w1", NULL); mod = vpi_handle(vpiModule, net);

Вызов vpi_handle() в приведенном выше примере должен вернуть дескриптор к модулю top.m1.

Иногда необходимо получить доступ к классу объектов, у которого нет имени или имя которого неоднозначно по отношению к другому классу объектов, доступ к которому можно получить из дескриптора ссылок. В этой ситуации используются теги, как показано на рисунке 26-2.

Получение доступа к классу объектов с помощью тега VPI
Рисунок 26-2. Получение доступа к классу объектов с помощью тега
В этом примере теги vpiLeftRange и vpiRightRange используются для доступа к выражениям, составляющим диапазон частичного выбора. Эти теги используются вместо vpiExpr для доступа к выражениям. Без этих тегов VPI не знал бы, к какому выражению следует обращаться. Например:
vpi_handle(vpiExpr, part_select_handle)

будет недопустимым, если дескриптор ссылки (part_select_handle) является дескриптором part-select, потому что part-select может ссылаться на два выражения, левый диапазон и правый диапазон.

Свойства объектов должны быть получены с помощью процедур семейства vpi_get. Подпрограмма vpi_get() возвращает целочисленные и булевы свойства. Целочисленные и булевы свойства должны быть определены как тип PLI_INT32. Для булевых свойств значение 1 означает TRUE, а значение 0 — FALSE. Процедура vpi_get_str() обеспечивает доступ к строковым свойствам. Свойства строки должны быть определены как тип PLI_BYTE8 *. Например, чтобы получить указатель на полное иерархическое имя объекта, на который ссылается дескриптор mod, необходимо выполнить следующий вызов:
PLI_BYTE8 *name = vpi_get_str(vpiFullName, mod);

В приведенном выше примере имя указателя теперь должно указывать на строку «top.m1».

Связь «один ко многим» обходятся с помощью механизма итерации. Процедура vpi_iterate() создает объект типа vpiIterator, который затем передается в процедуру vpi_scan() для обхода нужных объектов. В следующем примере отображается каждая сеть в модуле top.m1:
vpiHandle itr; itr = vpi_iterate(vpiNet,mod); while (net = vpi_scan(itr) ) vpi_printf("\t%s\n", vpi_get_str(vpiFullName, net) );

Как видно из приведенных выше примеров, соглашение об именовании процедур включает префикс ‘vpi’ с разделителями слов ‘_’ (за исключением определенных значений, связанных с обратным вызовом, которые используют префикс ‘cb’). Определяемые макросами типы и свойства имеют префикс ‘vpi’, и в них используется заглавная буква для разделителей слов.

Процедуры для обхода структур Verilog HDL и доступа к объектам описаны в пункте 27.

3.2. Свойства объекта

Все объекты имеют свойство vpiType, которое не отображается на диаграммах модели данных.
-> type int: vpiType

Использование vpi_get(vpiType, \) возвращает целочисленную константу, которая представляет тип объекта.

Использование vpi_get_str(vpiType, \) возвращает указатель на строку, содержащую имя константы типа. Имя константы типа выводится из имени объекта, как оно показано на диаграмме модели данных (см. 3 для описания того, как имена констант типа выводятся из имен объектов).

Некоторые объекты имеют дополнительные свойства типа, которые показаны на диаграммах модели данных: vpiDelayType, vpiNetType, vpiOpType, vpiPrimType, vpiResolvedNetType и vpiTchkType. Использование vpi_get(\<тип_свойства>, \<дескриптор_объекта>) возвращает целочисленную константу, которая представляет дополнительный тип объекта. Типы, которые могут быть возвращены для этих дополнительных свойств типа, см. в файле vpi_user.h. Имена констант типов, возвращаемых для этих дополнительных свойств типа, можно получить с помощью vpi_get_str().

3.3. Свойства `line и объекты файлов

Большинство объектов имеют два свойства местоположения, которые не показаны на диаграммах модели данных:
-> location int: vpiLineNo str: vpiFile

На свойства vpiLineNo и vpiFile может влиять директива `line compiler`. Более подробно о директиве `line compiler` см. раздел 19.7. Эти свойства применимы к каждому объекту, который соответствует какому-либо объекту в HDL. Исключение составляют объекты следующих типов:

  • vpiCallback
  • vpiDelayTerm
  • vpiDelayDevice
  • vpiInterModPath
  • vpiIterator
  • vpiTimeQueue
  • vpiGenScopeArray
  • vpiGenScope

3.4. Задержки и значения

Большинство свойств имеют тип integer, boolean или string. Свойства задержки и логического значения, однако, более сложны и требуют специализированных процедур и соответствующих структур. Подпрограммы vpi_get_delays() и vpi_put_delays() используют указатели на структуры, где структура содержит соответствующую информацию о задержках. Аналогично, значения симуляции также обрабатываются с помощью процедур vpi_get_value() и vpi_put_value(), вместе с соответствующим набором структур.

Подпрограммы, структуры языка C и некоторые примеры для работы с задержками и логическими значениями представлены в пункте 27. См. 27.14 для vpi_get_value(), 27.32 для vpi_put_value(), 27.9 для vpi_get_delays() и 27.30 для vpi_put_delays().

Сети, примитивы, пути модулей, проверки синхронизации и непрерывные назначения могут иметь задержки, указанные в HDL. Могут существовать дополнительные задержки, такие как задержки входных портов модулей или задержки межмодульных путей, которые не отображаются в HDL. Чтобы получить доступ к выражениям задержки, заданным в HDL, используйте метод vpiDelay. Эти выражения должны быть либо выражением, которое оценивается в константу, если указана только одна задержка, либо операцией, если указано более одной задержки. Если указано несколько задержек, то vpiOpType операции должен быть vpiListOp. Чтобы получить доступ к фактическим задержкам, используемым инструментом, используйте процедуру vpi_get_delays() для любого из объектов.

3.5. Свойства объекта, которые не зашифрованы

Все объекты имеют свойство vpiIsProtected, которое не отображается на диаграммах модели данных.
-> IsProtected bool: vpiIsProtected

Использование vpi_get(vpiIsProtected, object_handle) возвращает булеву константу, которая указывает, представляет ли объект код, содержащийся в зашифровке. Свойство vpiIsProtected должно быть TRUE, если object_handle представляет не зашифрованном коде; в противном случае оно должно быть FALSE. Если не указано иное, доступ к связям и свойствам защищенного объекта будет ошибкой. Ограничения на доступ к сложным свойствам указаны в описаниях ссылок на функции для соответствующих функций VPI. Доступ к свойству vpiType и свойству vpiIsProtected защищенного объекта разрешен для всех объектов.