В этом примере показано, как добавить ограниченную случайную проверку в тестовый стенд универсальной методики проверки (UVM), созданный на основе Simulink ®. Как параметры Simulink, так и входные порты для генерации стимула приводят к случайным элементам данных класса последовательности в тестовом стенде UVM. Используя стандартное наследование класса UVM и заводские переопределения, инженер по проверке конструкции может добавлять новые и ценные ограниченные случайные тестовые оболочки в свой набор тестов UVM.
Этот пример расширяет испытательный стенд 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)

В модели генерация стимула параметризируется с использованием диалогового параметра для местоположения импульса и входного порта для отношения сигнал/шум (SNR). В сгенерированном UVM эти параметры являются элементами данных mw_PulseDetector_sequence с ограничениями, отражающими информацию из модели.
Смотрите mw_PulseDetector_sequence.sv.
pPulseLocation: Этот параметр диалогового окна GenPulse подсистема указывает начальное местоположение импульса 64 выборки в кадре более 5000 выборок. Для сохранения в SystemVerilog используйте Simulink.Parameter. В этом параметре значением по умолчанию является 2100, а допустимым диапазоном является [0, 4936]. (Импульс должен быть полностью в пределах кадра 5000 выборок.)

В сгенерированном UVM-коде на элементе последовательности местоположения импульса наложены два ограничения для значения по умолчанию и минимального максимального диапазона, как показано в этом фрагменте кода:

Порт SNR: Этот входной порт в подсистему генерации указывает отношение общей величины генерируемого импульса к генерируемому шуму. Его типом данных является ufix8_En6 номер фиксированной точки с собственным диапазоном [0, 3.984375]. Самому порту присвоен более ограниченный диапазон [0, 2,984375], который соответствует фиксированным битовым значениям 0b00_000000, 0b10_111111.

Поскольку это входной порт, в Simulink отсутствует понятие значения по умолчанию. В сгенерированном UVM-коде на элемент последовательности накладываются два ограничения на минимальный, максимальный диапазон, а также значение по умолчанию, соответствующее минимальному значению. Код также добавляется для поддержки переопределения значения по умолчанию командной строки с помощью «плюс арг». Пример кода:

Генерация последовательности по умолчанию body() следует обычной схеме получения гранта, рандомизации элемента последовательности, отправки его в секвенсор, затем ожидания его завершения.

Из-за ограничений значений по умолчанию при выполнении теста по умолчанию для параметров будут использоваться фиксированные значения. Для этой модели это означает расположение начала импульса 2100 и SNR 0,0. SNR 0,0 приведет к отсутствию обнаруживаемых импульсов, поэтому plusarg задает более интересное значение по умолчанию. Битовое значение с фиксированной точкой 8 'b10000000 является плавающим значением 2,0.
% 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 plusarg override cd uvm_build/prm_uvmtb_uvm_testbench/top setenv EXTRA_UVM_SIM_ARGS +SNR_default_inp_val=10000000 ! 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 ../../..

Вы можете использовать стандартные методы UVM, чтобы добавить рандомизированное поведение к генерации стимула. В этом примере план тестирования требует использования значений SNR между 0,75 и 1,00 для определения того, насколько алгоритм надежен при обнаружении импульсов в этом диапазоне. В этом случае местоположение импульса не имеет значения и фиксируется в конце 5000 кадров выборки.
Смотрите mw_PulseDetector_SEQCRT_param_overrides.sv.
Для достижения этой цели testplan создается производный класс последовательности. Имеет следующие дополнительные варианты поведения:
в pre_body() override, использование ограничений значений по умолчанию отключено
в post_randomize() override, рандомизированное значение распечатывается так, чтобы значения SNR могли быть связаны с обнаружением импульсов или нет. fixed2real чтобы дать дружественную ценность.
в randomize_params() переопределение, линейное ограничение «рандомизировать с» ограничивает значения SNR в диапазоне от 0,75 до 1,0. (Эти битовые значения можно получить из MATLAB с помощью переменной fi и метода bin.)

Создается новый тест, который сообщает заводу использовать новый класс последовательности при построении тестового стенда.

Для выполнения моделирования UVM с использованием этих новых классов можно использовать исходные сценарии с дополнительными аргументами, заданными с помощью переменных среды.
% Simulate the UVM test bench using inlined constraint overrides cd uvm_build/prm_uvmtb_uvm_testbench/top setenv EXTRA_UVM_COMP_ARGS '-f ../../../overrides_SEQCRT/extra_comp_args.f' setenv EXTRA_UVM_SIM_ARGS +UVM_TESTNAME=mw_PulseDetector_test_inlineCRT ! 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 ../../..

Проверьте выходной сигнал и убедитесь, что генерируемое SNR всегда находится в диапазоне [0,75, 1,00], а начальное положение импульса всегда равно 4936. При таком диапазоне SNR наблюдайте, что иногда обнаруживается импульс, а иногда - нет.
Встроенные ограничения хороши для хонинга в определенных тестовых условиях. Для случайного тестирования с зависимостями fancier можно создать новые блоки операторов ограничений в производном классе последовательностей. В данном случае план тестирования требует, чтобы местоположение импульса изменялось по кадру с использованием конкретных «ковшей» интересных местоположений в начале, середине и конце кадра. Специальное расположение 0 гарантирует, что когда импульс не создается, импульс не обнаруживается. Аналогично, для SNR определяются несколько категорий интересных диапазонов SNR, таких как SNR_never_detected и SNR_always_detected. Теперь автор теста может легко использовать эти ограничения для охвата этих сценариев.
Смотрите mw_PulseDetector_SEQCRT_param_overrides.sv.
Для достижения этих целей класс производной последовательности имеет следующие дополнительные варианты поведения:
добавить элемент «loc_bucket», объявленный как «randc».
используйте этот элемент loc_bucket для указания диапазонов местоположения.
добавить элемент «snr_bucket». Он не рандомизирован, а устанавливается тестировщиком.
использовать выбранные snr_bucket, чтобы подразумевать рандомизацию в определенных диапазонах SNR.
отключить конфликтующие ограничения значений по умолчанию
распечатать рандомизированные значения для проверки во время моделирования

Создается новый тест, который предписывает фабрике UVM использовать новый класс последовательности при построении тестового стенда, а также устанавливает определенный сегмент SNR через uvm_resource_db.

Для выполнения моделирования UVM с использованием этих новых классов можно использовать исходные сценарии с дополнительными аргументами, заданными с помощью переменных среды.
% Simulate the UVM test bench using derived sequence class overrides cd uvm_build/prm_uvmtb_uvm_testbench/top setenv EXTRA_UVM_COMP_ARGS '-f ../../../overrides_SEQCRT/extra_comp_args.f' setenv EXTRA_UVM_SIM_ARGS +UVM_TESTNAME=mw_PulseDetector_test_classCRT ! 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 ../../..

Проверьте выходные данные, чтобы убедиться, что сгенерированный SNR всегда превышает 1.4844, а место запуска импульса находится в каждом из диапазонов, определенных для loc_bucket. Можно также подтвердить, что если местоположение равно 0, так как импульс не создается, импульс не обнаруживается.
Сгенерированные выше последовательности используют рандомизацию для воздействия на входные параметры и аргументы базовых функций GenPulse DPI-C. Фактические значения транзакций являются выходными данными этих функций. Если вы хотите взять под полный контроль фактические транзакции, доставленные в секвенсор, вы можете обойти обычные вызовы DPI и рандомизировать req член данных.
Смотрите mw_PulseDetector_SEQCRT_param_overrides.sv.

В этом случае, поскольку все импульсы, коэффициенты и шум взаимосвязаны, полная рандомизация их значений не даст достоверных тестовых случаев. Но этот метод полезен для других типов транзакций.
В полной среде UVM каждый раз, когда вводится рандомизация, обычно важно включать охват и гарантировать, что различные части среды знают, какие случайные значения были сгенерированы. В этих примерах рандомизированные значения просто распечатываются. Добавление покрытия для сгенерированных значений SNR и местоположения - и связанных с порогами обнаружения и ошибок - является упражнением, оставленным читателю.