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

modH = vpi_handle(vpiModule, netH);
где netH — дескриптор сети. В качестве другого примера, чтобы получить доступ к объекту «named event(именованное событие)», используйте тип vpiNamedEvent.
3.1. Доступ к связям и свойств объектов
vpiHandle net;
net = vpi_handle_by_name("top.m1.w1", NULL);
Этот вызов примера извлекает связь сети для top.m1.w1 и присваивает его переменной vpiHandle net. Второй аргумент NULL направляет программу на поиск имени на верхнем уровне проекта.
vpiHandle net, mod;
net = vpi_handle_by_name("top.m1.w1", NULL);
mod = vpi_handle(vpiModule, net);
Вызов vpi_handle() в приведенном выше примере должен вернуть дескриптор к модулю top.m1.
Иногда необходимо получить доступ к классу объектов, у которого нет имени или имя которого неоднозначно по отношению к другому классу объектов, доступ к которому можно получить из дескриптора ссылок. В этой ситуации используются теги, как показано на рисунке 26-2.

vpi_handle(vpiExpr, part_select_handle)
будет недопустимым, если дескриптор ссылки (part_select_handle) является дескриптором part-select, потому что part-select может ссылаться на два выражения, левый диапазон и правый диапазон.
PLI_BYTE8 *name = vpi_get_str(vpiFullName, mod);
В приведенном выше примере имя указателя теперь должно указывать на строку «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. Свойства объекта
-> 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. Свойства объекта, которые не зашифрованы
-> IsProtected
bool: vpiIsProtected
Использование vpi_get(vpiIsProtected, object_handle) возвращает булеву константу, которая указывает, представляет ли объект код, содержащийся в зашифровке. Свойство vpiIsProtected должно быть TRUE, если object_handle представляет не зашифрованном коде; в противном случае оно должно быть FALSE. Если не указано иное, доступ к связям и свойствам защищенного объекта будет ошибкой. Ограничения на доступ к сложным свойствам указаны в описаниях ссылок на функции для соответствующих функций VPI. Доступ к свойству vpiType и свойству vpiIsProtected защищенного объекта разрешен для всех объектов.