В этом примере показано, как перейти от простого поведенческого интерфейса DUT к интерфейсу RTL DUT, использующему протоколы шины AXI Lite и AXI Stream. Несколько компонентов UVM должны быть изменены, например, драйвер и монитор, но исходная структура стенда и компоненты последовательности и табло могут быть использованы повторно без изменений.
См. пример Generate Parameterized UVM Test Bench from Simulink описание конструкции и предыстории создания испытательного стенда UVM. Для создания тестового стенда по умолчанию для этого примера выполните следующее:
% Generate a UVM test bench design = 'prm_uvmtb/PulseDetector' sequence = 'prm_uvmtb/GenPulse' scoreboard = 'prm_uvmtb/CheckDetection' uvmbuild(design, sequence, scoreboard)
DUT в Simulink представляет собой функциональное поведение детектора импульсов и не использует аппаратные интерфейсы протоколов, типичные для IP-ядер HDL. Испытательный стенд UVM использует конструкцию Simulink в качестве стойки для фактической реализации HDL. На следующем этапе процесса проверки выполняется интеграция фактической реализации ЛПВП, которая использует протоколы на основе AXI, в один и тот же созданный стенд тестирования UVM.
Для использования RTL DUT необходимо заменить части тестового стенда UVM, как показано синим цветом:

Для этого RTL DUT, coeff порт сопоставлен с интерфейсом процессора, AXI4-Lite, data_in порт сопоставлен с AXI4-Stream подчиненным интерфейсом, и data_out порт отображается на главный интерфейс AXI4-Stream, как показано ниже.

Можно вручную написать этот RTL или использовать рабочий процесс генерации ядра IP-кода HDL Coder для его создания. Эта модель имеет вариант алгоритма, который может генерировать ядро IP HDL с использованием продукта HDL Coder.
Для моделирования с помощью этого варианта выполните следующее:
% Simulate the RTL generatable algorithm variant set_param('prm_uvmtb/PulseDetector','LabelModeActiveChoice','HDL') set_param('prm_uvmtb/CheckDetection/ExpectsDelay','LabelModeActiveChoice','Frame delay') sim('prm_uvmtb')

[FrameNum= 0] No peak found in Ref or Impl. [FrameNum= 1] Peak location=2163.000000, mag-squared=0.280 using global max [FrameNum= 1] Peak detected from impl=2170 error(abs)=7 [FrameNum= 1] Peak mag-squared from impl=0.280, error(abs)=0.000 error(pct)=0.017 [FrameNum= 2] Peak location=2163.000000, mag-squared=0.200 using global max [FrameNum= 2] Peak detected from impl=2170 error(abs)=7 [FrameNum= 2] Peak mag-squared from impl=0.199, error(abs)=0.000 error(pct)=0.190 [FrameNum= 3] Peak location=2163.000000, mag-squared=0.224 using global max [FrameNum= 3] Peak detected from impl=2170 error(abs)=7 [FrameNum= 3] Peak mag-squared from impl=0.223, error(abs)=0.000 error(pct)=0.183 [FrameNum= 4] Peak location=2163.000000, mag-squared=0.200 using global max [FrameNum= 4] Peak detected from impl=2170 error(abs)=7 [FrameNum= 4] Peak mag-squared from impl=0.200, error(abs)=0.000 error(pct)=0.043 [FrameNum= 5] Peak location=2163.000000, mag-squared=0.255 using global max [FrameNum= 5] Peak detected from impl=2170 error(abs)=7 [FrameNum= 5] Peak mag-squared from impl=0.255, error(abs)=0.000 error(pct)=0.031 [FrameNum= 6] Peak location=2163.000000, mag-squared=0.241 using global max [FrameNum= 6] Peak detected from impl=2170 error(abs)=7 [FrameNum= 6] Peak mag-squared from impl=0.241, error(abs)=0.000 error(pct)=0.187 [FrameNum= 7] Peak location=2163.000000, mag-squared=0.241 using global max [FrameNum= 7] Peak detected from impl=2170 error(abs)=7 [FrameNum= 7] Peak mag-squared from impl=0.241, error(abs)=0.000 error(pct)=0.019 [FrameNum= 8] Peak location=2163.000000, mag-squared=0.225 using global max [FrameNum= 8] Peak detected from impl=2170 error(abs)=7 [FrameNum= 8] Peak mag-squared from impl=0.225, error(abs)=0.000 error(pct)=0.032 [FrameNum= 9] Peak location=2163.000000, mag-squared=0.239 using global max [FrameNum= 9] Peak detected from impl=2170 error(abs)=7 [FrameNum= 9] Peak mag-squared from impl=0.239, error(abs)=0.001 error(pct)=0.241 [FrameNum= 10] Peak location=2163.000000, mag-squared=0.225 using global max [FrameNum= 10] Peak detected from impl=2170 error(abs)=7 [FrameNum= 10] Peak mag-squared from impl=0.225, error(abs)=0.000 error(pct)=0.146

При наличии кодера HDL можно настроить траекторию инструмента и создать RTL для этого варианта. Например, чтобы создать совместимый IP-адрес Xilinx Vivado, подключите траекторию инструмента и выполните следующее:
% Generate the AXI-based RTL HDL IP (HDL Coder required) hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', '/tools/Vivado/2018.3/bin/vivado') prm_uvmtb_hdlworkflow
Полученные IP-файлы HDL будут помещены в hdl_prj/hdlsrc/prm_uvmtb. Однако реализация RTL была включена в эту демонстрацию, расположенную в overrides_AXIDUT/AXIIPSource, и поэтому лицензия HDL Coder не требуется.
Файлы UVM для замены исходного DUT находятся в overrides_AXIDUT. Нет необходимости изменять ни один из созданных файлов из оригинала uvmbuild вызов.
mw_PulseDetector_AXIRTL_if.sv: Переопределяет основной класс интерфейса DUT. Сравните с исходным определением интерфейса.
mw_PulseDetector_AXIRTL_driver.sv: Управляет входными транзакциями в соответствии с протоколами AXI интерфейса DUT. Сравните с исходным драйвером.
mw_PulseDetector_AXIRTL_monitor/monitor_input.sv: Получает потоковые данные AXI и преобразует их в те же типы транзакций, что и раньше. Сравните с исходным определением монитора.
mw_PulseDetector_AXIRTL_top.sv: Создайте экземпляр AXI RTL DUT и включите основные пакеты UVM. Сравните с исходным верхним определением.
Выполните тестовый стенд с новым RTL DUT для проверки соответствия выполнения UVM выполнению Simulink. Поскольку последовательность параметризована входным портом SNR, ее значение по умолчанию будет равно 0,0 в UVM. Для правильного сравнения прогонов моделирования необходимо изменить его значение по умолчанию на 2.0 (которое имеет битовое значение 0b10_000000), чтобы соответствовать Simulink; это может быть сделано через плюсарг, который мы передаем в скрипт через переменную среды.
У нас есть много новых RTL файлов для компиляции и мы должны переопределить верхний уровень конструкторской единицы. Эти обновления передаются в сценарий через переменные среды.
% Clear environment variables that influence the UVM simulation setenv EXTRA_UVM_SIM_ARGS; setenv EXTRA_UVM_COMP_ARGS; setenv UVM_TOP_MODULE; % Simulate the UVM test bench using the AXI RTL DUT cd prm_uvmtb_uvmbuild/uvm_testbench/top setenv EXTRA_UVM_COMP_ARGS '-f ../../../overrides_AXIDUT/extra_comp_args.f' setenv EXTRA_UVM_SIM_ARGS '+SNR_default_inp_val=10000000 +UVM_TESTNAME=mw_PulseDetector_AXIRTL_test' setenv UVM_TOP_MODULE mw_PulseDetector_AXIRTL_top ! vsim -do run_tb_mq.do % ModelSim/QuestaSim (gui) ! vsim -c -do run_tb_mq.do % ModelSim/QuestaSim (console) ! ./run_tb_incisive.sh % Incisive (console) ! ./run_tb_xcelium.sh % Xcelium (console) ! ./run_tb_vcs.sh % VCS (console) cd ../../..
Ниже показаны журнал моделирования и фрагмент сигнала. Обратите внимание, что в журнале отображаются те же результаты, что и ранее, 5 обнаруженных импульсов. Однако также обратите внимание, что формы сигналов показывают различное время для реализации конструкции. Вместо постоянного потока всегда действительных данных для каждого кадра из 5000 выборок сигнала 64 коэффициента сначала программируются через интерфейс процессора, затем 5000 выборок передаются в поток.


В этом примере показано, как стенд проектирования и тестирования, разработанный в Simulink, может быть использован для создания полностью исполняемого стенда UVM-тестирования. uvmbuild автоматизирует генерацию, компиляцию и интеграцию ключевых компонентов в структуру UVM.
Инженеры по проверке HDL могут подтвердить общий охват от Simulink и дополнить его собственной библиотекой собственных UVM-последовательностей.
Они также могут заменить поведенческий дизайн от Simulink конструкцией RTL, которая заключена в аппаратные протоколы, такие как AXI4 без изменений в исходном генераторе последовательности и проверках ответа.