Замените поведенческий DUT на RTL на основе AXI в UVM Испытательного стенда

В этом примере показано, как перейти от простого поведенческого интерфейса 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, как показано синим цветом:

Отображение портов с интерфейсами AXI

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

Вы можете вручную написать этот RTL или использовать рабочий процесс генерации IP-ядра HDL Coder, чтобы создать его. Эта модель имеет алгоритм варианта, который может сгенерировать HDL-ядро IP с помощью продукта HDL Coder.

Симуляция варианта HDL в Simulink

Для симуляции с этим вариантом выполните следующее:

% 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

Если у вас есть 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 не требуется.

Переопределение необходимых компонентов UVM

Файлы для замены исходного DUT расположены в overrides_AXIDUT. Нет необходимости изменять какие-либо сгенерированные файлы из исходного uvmbuild вызов.

Симуляция 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 без изменений исходного генератора последовательности и шашек отклика.