Этот пример использует uvmbuild
функция для генерации испытательного стенда универсальной методологии верификации (UVM), который включает драйвер UVM и монитор от конструкторского и испытательного стенда Simulink ®.
Переход от основанного на кадрах поведенческого моделирования к скаляру моделированию в Simulink требует блоков преобразования для преобразования шагов расчета и размеров сигнала. Блоки преобразования делят испытательный стенд Simulink в этих двух областях.
Основанная на кадрах область: Часть испытательного стенда, которая манипулирует и работает с данными как системы координат.
Основанная на скаляре область: Часть испытательного стенда, которая манипулирует и действует на данных как скаляры.
Среда UVM использует моделирование уровня транзакции для обработки транзакций из последовательности (генератор стимула) и для проверки полученных транзакций в табло (чекер).
При переводе испытательного стенда Simulink в испытательный стенд UVM важно сохранять эти домены раздельными. Разделение области позволяет улучшить компонентность и повторное использование компонентов испытательного стенда.
Напишите алгоритм на основе скаляров и добавьте вокруг него испытательного стенда, которая разделяет основанные на кадрах области и скалярные области с помощью подсистем преобразования (для примера, буфера и небуфера, перехода скорости или комбинации этих блоков). Модель состоит из подсистемы генерации стимула, тестируемого проекта на основе скаляра (DUT) и подсистемы проверки отклика. Дополнительные подсистемы преобразования вводятся между генерацией стимула и DUT для преобразования данных из систем координат в скаляры и между DUT и проверкой отклика для преобразования данных из скаляров в системы координат.
Пример использует Simulink, чтобы спроектировать и протестировать конвейерный алгоритм деления ядра и определить максимальный порог ошибок для заданного количества этапов трубопровода. В данном проекте испытываются семь этапов трубопровода.
Проект содержит два шага расчета в Simulink.
Медленный шаг расчета (зеленый) работает с точки зрения высокоуровневых транзакций, агностика алгоритма нижнего уровня, тестируемого в DUT. В этом примере транзакции состоят из трех векторов: числителя, знаменателя и результатов деления от сердечного алгоритма.
Быстрый шаг расчета (красный) работает в терминах скаляров. Конвейерный DUT отбирает два скаляра в красном шаге расчета, и результат сердечного деления выходит после семи попаданий красного шага расчета, когда утверждается действительный выходной сигнал.
Подсистема VectorGenerator генерирует различные числительные и знаменательные векторные последовательности. Размер и область значений векторов определены в InitFcn
коллбэк в Simulink model explorer .
Подсистема VectorToScalar переводит транзакции высокого уровня (векторы) в скалярную последовательность, которую может понять DUT.
Подсистема ScalarToVector собирает полученный вектор из скалярной последовательности, полученной от DUT.
Подсистема DivideChecker проверяет, что полученный вектор содержит правильный результат деления в пределах определенного порога ошибок. Если ошибка больше порога, то симуляция выводит предупреждение. В сложение подсистемы DivideChecker выходов три файла MAT, которые можно построить, чтобы визуализировать результаты.
Модель показана ниже:
Откройте и симулируйте модель. Поскольку утверждения не инициированы, нарушений порога ошибок не существует.
open_system('drv_and_mon_uvmtb'); r=sim('drv_and_mon_uvmtb');
Симуляция записывает три файла MAT на диск: num.mat
, den.mat
, и result_cordic.mat
. Файлы содержат знаменатели, числители и результаты сердечного деления соответственно.
Функция MATLAB предназначена для генерации 3-D точечного графика из файлов MAT. Получившийся график помогает визуализировать ошибку и далее подтверждает, что ошибка меньше порога.
plot_cordic_results('num.mat','den.mat','result_cordic.mat');
Используйте uvmbuild
функция для экспорта проекта в окружение UVM и определения подсистем Simulink, которые необходимо сопоставить с драйвером UVM, монитором или тем и другим.
Драйвер и монитор UVM позволяют вам разделяться между основанными на кадрах и основанными на скалярах областями. При переводе в среду UVM основанная на кадрах область сопоставляется с транзакциями UVM, а основанная на скаляре область сопоставляется с компонентами UVM с учетом времени (драйвер, dut и монитор). Стандартные определения компонентов разделяют части окружения по их роли в симуляции. Для этого примера:
Подсистема VectorGenerator сопоставлена с последовательностью UVM.
Подсистема VectorToScalar сопоставлена с драйвером UVM.
Pipelined_Cordic_Divide подсистема сопоставлена с модулем DPI DUT SystemVerilog.
Подсистема ScalarToVector сопоставлена с монитором UVM.
Подсистема DivideChecker сопоставлена с табло UVM.
Чтобы сгенерировать испытательный стенд UVM из проекта Simulink, выполните этот код.
sequence = 'drv_and_mon_uvmtb/VectorGenerator'; driver = 'drv_and_mon_uvmtb/VectorToScalar'; dpi_dut = 'drv_and_mon_uvmtb/Pipelined_Cordic_Divide'; moninor = 'drv_and_mon_uvmtb/ScalarToVector'; scoreboard = 'drv_and_mon_uvmtb/DivideChecker'; uvmbuild(dpi_dut,sequence,scoreboard,'Driver',driver,'Monitor',moninor);
### Starting DPI subsystem generation for UVM test bench ### Starting build procedure for model: Pipelined_Cordic_Divide ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.h ### Generating DPI C Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.c ### Generating UVM module package /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi_pkg.sv ### Generating SystemVerilog module /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.sv ### Generating makefiles for: Pipelined_Cordic_Divide_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: Pipelined_Cordic_Divide Build Summary Top model targets built: Model Action Rebuild Reason ======================================================================================================== Pipelined_Cordic_Divide Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 24.259s ### Starting build procedure for model: VectorGenerator ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.h ### Generating DPI C Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.c ### Generating UVM module package /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi_pkg.sv ### Generating SystemVerilog module /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.sv ### Generating makefiles for: VectorGenerator_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: VectorGenerator Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================ VectorGenerator Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.8212s ### Starting build procedure for model: VectorToScalar ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.h ### Generating DPI C Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.c ### Generating UVM module package /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi_pkg.sv ### Generating SystemVerilog module /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.sv ### Generating makefiles for: VectorToScalar_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: VectorToScalar Build Summary Top model targets built: Model Action Rebuild Reason =============================================================================================== VectorToScalar Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 7.5294s ### Starting build procedure for model: ScalarToVector ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.h ### Generating DPI C Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.c ### Generating UVM module package /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi_pkg.sv ### Generating SystemVerilog module /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.sv ### Generating makefiles for: ScalarToVector_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: ScalarToVector Build Summary Top model targets built: Model Action Rebuild Reason =============================================================================================== ScalarToVector Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.6012s ### Starting build procedure for model: DivideChecker ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.h ### Generating DPI C Wrapper /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.c ### Generating UVM module package /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi_pkg.sv ### Generating SystemVerilog module /tmp/BR2021ad_1657350_5204/mlx_to_docbook1/tp7bf1d09a/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.sv ### Generating makefiles for: DivideChecker_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: DivideChecker Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================== DivideChecker Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.196s ### Starting UVM test bench generation for model: drv_and_mon_uvmtb ### Generating UVM transaction object ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/scoreboard/mw_Pipelined_Cordic_Divide_scoreboard_trans.sv ### Generating UVM interface ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_if.sv ### Generating UVM sequence ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/sequence/mw_Pipelined_Cordic_Divide_sequence.sv ### Generating UVM sequence transaction ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/sequence/mw_Pipelined_Cordic_Divide_sequence_trans.sv ### Generating UVM driver ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/driver/mw_Pipelined_Cordic_Divide_driver.sv ### Generating UVM monitor ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/monitor/mw_Pipelined_Cordic_Divide_monitor.sv ### Generating UVM input monitor ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_monitor_input.sv ### Generating UVM agent ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_agent.sv ### Generating UVM scoreboard ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/scoreboard/mw_Pipelined_Cordic_Divide_scoreboard.sv ### Generating UVM scoreboard configuration object ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/scoreboard/mw_Pipelined_Cordic_Divide_scoreboard_cfg_obj.sv ### Generating UVM environment ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_environment.sv ### Generating UVM test ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_test.sv ### Generating UVM top ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/mw_Pipelined_Cordic_Divide_top.sv ### Generating UVM test package ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/drv_and_mon_uvmtb_pkg.sv ### Generating UVM test bench simulation script for Mentor Graphics QuestaSim/Modelsim ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_mq.do ### Generating UVM test bench simulation script for Cadence Incisive ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_incisive.sh ### Generating UVM test bench simulation script for Cadence Xcelium ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_xcelium.sh ### Generating UVM test bench simulation script for Synopsys VCS ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_vcs.sh
Драйвер и монитор UVM генерируются в отдельных директориях, как показано на этом рисунке.
Сгенерированный тестовый стенд UVM может быть выполнен путем перехода в каталог верхнего модуля UVM drv_and_mon_uvmtb_uvmbuild\uvm_testbench\top
и выполнение одного из сгенерированных HDL скриптов симулятора HDL. В этом примере используется ModelSim/QuestaSim ®. Команды, которые необходимо выполнить, показаны на этом рисунке.
Чтобы подтвердить, что симуляция UVM соответствует испытательному стенду Simulink, проверьте эти требования.
Нарушений порога ошибок не выдается. Это проверяется путем просмотра журнала симуляции UVM и проверки отсутствия ошибок UVM. Журнал симуляции UVM показан на этом рисунке.
Табло UVM выводит три файла MAT (num.mat
, den.mat
, и result_cordic.mat
) в конце симуляции UVM. Визуально 3-D рассеянный график, сгенерированный из проекта Simulink, должен совпадать с графиком из симуляции UVM. График из файлов MAT симуляции UVM может быть сгенерирован с помощью этой команды:
Результат симуляции 3-D точечного графика UVM показан на этом рисунке. График соответствует проекту Simulink, показанному в предыдущих разделах.
Сохранение основанного на кадрах и скалярного поведенческого моделирования отдельно в среде Simulink и UVM приводит к этим преимуществам.
Разделение области позволяет моделировать транзакционную обработку на основе фрейма на более высоком уровне абстракций, не вводя преобразования более низкого уровня, которые зависят от разрабатываемого алгоритма.
Подсистемы VectorGenerator и DivideChecker могут повторно использоваться для различных проектов Simulink или UVM, которые имеют другой алгоритм, но требуют одной и той же генерации транзакций высокого уровня и проверки.
Разделение области позволяет алгоритму DUT быть многократным.
Разделение области позволяет транзакции высокого уровня работать в различные типы данных, чем DUT. В этом примере DUT имеет типы данных портов ufx10_en5
, но подсистемы VectorGenerator и DivideChecker имеют double
тип данных.
Если у вас есть Simulink Test ®, можно опционально сопоставить блоки преобразования в Simulink Test Harness с драйвером и монитором UVM. Разделение области включает более оптимизированный рабочий процесс генерации испытательного стенда UVM.
The uvmbuild
функция позволяет вам разделить основанные на кадрах и скалярные области путем предоставления дополнительных необязательных пар "имя-значение" для задания подсистем Simulink, которые сопоставлены с драйвером UVM, монитором или тем и другим.