exponenta event banner

Добавление случайных ограничений к последовательностям на испытательном стенде UVM

В этом примере показано, как добавить ограниченную случайную проверку в тестовый стенд универсальной методики проверки (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-коде на элемент последовательности накладываются два ограничения на минимальный, максимальный диапазон, а также значение по умолчанию, соответствующее минимальному значению. Код также добавляется для поддержки переопределения значения по умолчанию командной строки с помощью «плюс арг». Пример кода:

Поведение моделирования 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 и местоположения - и связанных с порогами обнаружения и ошибок - является упражнением, оставленным читателю.