В этом примере показано, как переместиться от простого поведенческого интерфейса DUT до интерфейса RTL DUT, который использует Облегченные и Потоковые протоколы шины AXI AXI. Несколько из компонентов 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-облегченным, data_in
порт сопоставлен с AXI4-потоковым ведомым интерфейсом и data_out
порт сопоставлен с AXI4-потоковым ведущим интерфейсом как показано ниже.
Можно вручную записать этот 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 Coder, можно настроить инструмент path и сгенерировать RTL для этого варианта. Например, чтобы создать Xilinx Vivado совместимый IP, вы включаете свой инструмент path и выполняете следующее:
% 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: Инстанцируйте RTL AXI DUT и включайте основные пакеты UVM. Сравните с исходным главным определением.
Выполните испытательный стенд с новым RTL DUT, чтобы проверить, что выполнение UVM совпадает с выполнением Simulink. Поскольку последовательность параметрируется с входным портом ОСШ, его значение по умолчанию будет 0.0 в UVM. Для того, чтобы правильно сравнить запуски симуляции, мы должны изменить ее значение по умолчанию в 2,0 (который имеет немного значения 0b10_000000), чтобы совпадать с Simulink; это может быть сделано через plusarg, который мы передаем скрипту через переменную окружения.
У нас есть много новых файлов 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 обнаруженных импульсов. Однако также заметьте, что формы волны показывают различную синхронизацию для того, чтобы осуществить проект. Вместо непрекращающегося потока всегда допустимых данных, для каждой системы координат 5 000 выборок сигнала, эти 64 коэффициента сначала запрограммированы через интерфейс процессора, затем эти 5 000 выборок передаются потоком.
Этот пример показал, как проект и испытательный стенд, разработанный в Simulink, могут использоваться, чтобы сгенерировать полностью исполняемый испытательный стенд UVM. uvmbuild
команда автоматизирует генерацию, компиляцию и интегрирование ключевых компонентов в среду UVM.
Инженеры верификации HDL-кода могут подтвердить полное покрытие от Simulink и увеличить покрытие с их собственной библиотекой нативных последовательностей UVM.
Они могут также заменить поведенческим проектом от Simulink с проектом RTL, который перенесен в аппаратные протоколы, такие как AXI4 без изменений в исходном генераторе последовательности и средствах проверки ответа.