Введение в UVM Connect
Включение IP и повторное использование VIP

Итак, какие новые возможности появляются при использовании данной библиотеки? UVM Connect включает следующие полезные модели, разработанные для обеспечения максимальной степени повторного использования IP:

  • Усовершенствование абстракции — используйте архитектурную модель на SystemC, в качестве ссылочной модели при UVM верификации. Используйте генератор входных воздействий на SystemVerilog для верификации моделей на SystemC
  • Расширение VIP реестра — при создании нового VIP язык написания не обязательно должен совпадать с языками, на которых написаны используемые готовые VIP, что расширяет диапазон использования готовых реализаций. При этом увеличивается степень повторного использования IP! При тщательной верификации больших проектов систем на кристалле, в средах верификации возникает больше проблем интеграционного характера, чем проблем проектирования
  • Использование преимуществ языка — каждый язык имеет свои преимущества. Можно использовать мощное устройство расчета на SystemVerilog и UVM последовательности для обеспечения генерации случайных входных воздействий для вашей архитектурной модели на SystemC. Можно изменять скорость системы на кристалле и способность верифицировать несинхронизированные или свободно синхронизированные среды системного уровня
  • Доступ к SystemVerilog UVM из SystemC — API команд UVM предоставляет мост между SystemC и UVM-симуляцией в SystemVerilog. С помощью этого API вы можете ожидать и управлять UVM фазами передач, устанавливать и получать конфигурацию, получать сообщения UVM стиля, устанавливать тип производителя и инстанцировать перезапись, и т.д.

Ключевые особенности

Библиотека UVM Connect соединяет TLM-модели на SystemC и UVM на SystemVerilog, что является относительно простым процессом. В этом разделе описываются некоторые ключевые особенности библиотеки UVM Connect.

  • Простота — передача данных, основанная на объектах, требует очень незначительных подготовительных действий от пользователя
  • Опциональность — библиотека UVMC предоставляется как отдельный, опциональный пакет к UVM. Нет необходимость импортировать пакет, если ваша среда не требует межъязыковых TLM соединений или доступа к API команд UVM
  • Работа со стандартом UVM — UVMC работает с Accellera UVM 1.1a и более поздними версиями. UVMC может также работать с более ранними версиями UVM, но с незначительными изменениями
  • Поддержка базовой методологии моделирования — UVMC не навязывает незнакомых методологий и не требует, чтобы ваши модели или операции наследовались от базового класса. Ваша TLM-модель может полностью использовать особенности языка, на котором она написана
  • Поддержка существующих моделей — ваша существующая TLM-модель на обоих языках SystemVerilog и SystemC может быть повторно использована в контексте нескольких языков без модификаций
  • Поддержка стандартов TLM-моделирования — UVMC поддерживает принципы и цели стандартного TLM-интерфейса проектирования независимых моделей, которые не связаны друг с другом прямыми ссылками. Такие модели становятся очень гибкими. Они могут быть интегрированы как в среду родного языка, так и в среду смешанных языков без каких-либо модификаций
Создание UVMC соединений

Для реализации соединения верифицируемые компоненты должны быть синхронизированы по данным, которыми они обмениваются, и должны использовать одинаковые интерфейсы для обмена. TLM соединения, параметризованные по типу объекта (транзакции), помогают компонентам соответствовать данным требованиям и таким образом преодолевать проблему интеграции и увеличить гибкость. Для реализации таких соединений между языками SystemC и SystemVerilog, UVMC предоставляет функции connect и connect_hier.

SystemVerilog TLM2:
uvmc_tlm #(trans)::connect(port_handle, “lookup”);
uvmc_tlm #(trans)::connect_hier(port_handle, “lookup”);
SystemC TLM2
uvmc_connect(port_ref, “lookup”);
uvmc_connect_hier(port_ref, “lookup”);
trans — определяет тип транзакции для однонаправленных TLM1 портов, экспорта и импорта. Необходим только при использовании SystemVerilog.
port_handle или ref — указатель или ссылка на порт, экспорт, импорт, интерфейс или экземпляр сокета, с которым выполняется соединение.
lookup — необязательная строка-идентификатор для регистрации порта.

UVMC регистрирует иерархическое имя порта и строковый идентификатор (если таковой имеется) для дальнейшего сравнения с другими регистрируемыми портами как на SystemVerilog, так и на SystemC. Если строки каких-либо двух зарегистрированных портов совпадают, эти порты считаются соединенными независимо от того, написаны ли они на одном языке, либо на разных.

Рассмотрим использование функции соединения на примере. Диаграмма ниже показывает как компонент-источник на SystemVerilog и компонент-приемник на SystemC соединяются с помощью TLM сокета.

Соединение с помощью TLM сокета

Следующий код создает тест и UVMC соединение на обоих языках. Приведенный код является полным и пригодным к использованию. Это все, что необходимо выполнить для передачи операции tlm_generic_payload между компонентами на SystemC и SystemVerilog.

Код для передачи операции tlm_generic_payload между компонентами на SystemC и SystemVerilog

В главном модуле sv_main реализован пример на SystemVerilog. Здесь создается экземпляр компонента-источника, после чего регистрируется его выходной сокет в UVMC, используя строковый идентификатор «foo». Далее начинается UVM тестирование посредством вызова run_test().

Функция sc_main реализует пример на SystemC. В ней создается экземпляр приемника sc_module, далее регистрируется его входной сокет в UVMC, используя строковый идентификатор «foo». После этого начинается симуляция посредством вызова sc_start.

В процессе работы UVMC соединит сокеты источника и приемника, так как они зарегистрированы с одинаковым строковым идентификатором.

(Примечание: Порт в SystemVerilog в действительности будет создан в connect_phase UVM. Этот факт опущен для упрощения примера.)

Операция преобразования

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

UVMC обеспечивает встроенную поддержку средства TLM Generic Payload (TLM GP). При использовании TLM GP нет необходимости делать какие-либо манипуляции, связанные с операциями преобразования. Использование TLM GP также предоставляет наилучшие условия для взаимодействия независимо разработанных компонентов от различных поставщиков IP. Таким образом, имеется огромный стимул к использованию Generic Payload, если это возможно.

Однако, если вы не используете TLM GP, задача создания преобразователя в SystemC и SystemVerilog достаточно проста.

Допустим, имеется операция с командой, адресом и данными переменной длины. Базовые определения в SystemC и SystemVerilog могут выглядеть следующим образом:

Базовые определения в SystemC и SystemVerilog

UVMC использует отдельные классы преобразователей для выполнения операций упаковки и распаковки. Это позволяет определить преобразователи независимо от операций, с которыми они имеют дело. По умолчанию UVMC определяет реализацию преобразователя, которая соответствует преобладающей методологии в каждом из языков. UVMC также может размещать практически любое приложение, как например, использование объекта SystemVerilog, который не расширяет uvm_object.

Преобразование на SystemVerilog

По умолчанию стандартный преобразователь UVMC в SystemVerilog поручает преобразование методам pack и unpack. Если присутствует класса операции, то реализуется собственное преобразование с помощью UVMC.

Собственное преобразование с помощью UVMC

Операции преобразования UVM обычно реализуются в методах do_pack и do_unpack, либо с помощью макроса `uvm_field. Способ с использованием методов do_pack и do_unpack лучше с точки зрения производительности и обеспечивает большую гибкость, удобство отладки и поддержку типов, чем способ с макросом `uvm_field. Он требует больше времени для реализации этих методов, но это компенсируется высокой производительностью и преимуществами при отладке. Рекомендуемый способ для реализации методов do_pack/unpack включает использование макросов `uvm_pack и `uvm_unpack, которые являются частью UVM стандарта. Эти макросы находятся среди рекомендуемых к использованию. Они меньше и более эффективны, чем макрос uvm_field и API uvm_packer.

Следующее определение транзакции показывает рекомендуемый способ описания методов do_pack/unpack:

Рекомендуемый способ описания методов do_pack/unpack
Преобразование на SystemC

Классы преобразований в SystemC обычно не расширяют базовый класс, поэтому преобразование выполняется в отдельном классе конвертера.

Преобразование в SystemC

Конвертер в SystemC является шаблоном конвертера по умолчанию, umvc_converter<T>. Шаблонная специализация позволяет перегружать стандартную реализацию параметризированного класса классом, исключительным для определенного ряда значений параметров, например, uvmc_converter<packet>. Это операция уровня компилятора, поэтому любой код, использующий uvmc_converter, автоматически получает специализированную реализацию.

Следующий код создает класс преобразователя для класса пакетных операций:

Класс преобразователя для класса пакетных операций

Переменная упаковщика — это экземпляр uvmc_packer, аналог uvm_packer на SystemVerilog. Для передачи транзакций можно использовать потоковые операции встроенного упаковщика. Для упаковки используется оператор <<, для распаковки >>.

Многие классы преобразователей соответствуют структуре указанного шаблона, за исключением актуальных имен полей, переданных в поток. Поэтому для удобства UVMC обеспечивает макрос, который может генерировать полный класс uvmc_converter и предоставить потоковые операции для транзакций вызовом единого макроса UVMC_UTILS. В отличие от макроса `uvm_field, эти макросы разворачиваются в сжатый, читабельный код (приведенный выше).

Используя опцию макроса, определение специализированного класса преобразователя пакета уменьшается до одной строки:

Определение специализированного класса преобразователя пакета

Числовой суффикс в имени макроса определяет число полей транзакции, которые преобразуются. Далее просто перечисляются поля в порядке, в котором их необходимо поместить в поток. Следует обратить внимание на то, чтобы порядок был одинаков при упаковке и распаковке на стороне SystemVerilog. Данный макрос UVMC поддерживает до 20 полей.