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

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

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

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

Можно вручную записать этот RTL или использовать рабочий процесс генерации ядра IP HDL Coder, чтобы создать его. Эта модель имеет различный алгоритм, который может сгенерировать ядро IP HDL использование продукта 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, можно настроить инструмент 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

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

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