В этом примере показано, как перейти от простого поведенческого интерфейса 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. Следующий шаг в рабочем процессе верификации интегрирует фактическую реализацию HDL, которая использует основанные на AXI протоколы в те же сгенерированные испытательные стенды UVM.
Для использования RTL DUT необходимо заменить части испытательного стенда UVM, как показано синим цветом:
Для этого RTL DUT, coeff
порт сопоставлен с интерфейсом процессора, AXI4-Lite, data_in
порт сопоставлен с AXI4-Stream ведомым интерфейсом, и data_out
порт сопоставлен с основным интерфейсом AXI4-Stream, как показано ниже.
Вы можете вручную написать этот RTL или использовать рабочий процесс генерации IP-ядра HDL Coder, чтобы создать его. Эта модель имеет алгоритм варианта, который может сгенерировать HDL-ядро IP с помощью продукта 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 Coder, можно настроить путь инструмента и сгенерировать RTL для этого варианта. Например, чтобы создать совместимый с Xilinx Vivado IP, подключите путь инструмента и выполните следующее:
% 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 не требуется.
Файлы для замены исходного 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. Поскольку последовательность параметризована входным портом ОСШ, ее значение по умолчанию будет 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. The uvmbuild
команда автоматизирует генерацию, компиляцию и интегрирование ключевых компонентов в среду UVM.
Инженеры по верификации HDL-кода могут подтвердить общее покрытие от Simulink и расширить покрытие собственной библиотекой собственных последовательностей UVM.
Они также могут заменить поведенческий проект от Simulink проектом RTL, который упакован в аппаратные протоколы, такие как AXI4 без изменений исходного генератора последовательности и шашек отклика.