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

В этом примере показано, как добавить ограниченную случайную верификацию в испытательный стенд Универсальной методологии верификации (UVM), сгенерированный от Simulink®. И параметры Simulink и входные порты к генерации стимула приводят к randomizable элементам данных класса последовательности в испытательном стенде 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 демонстрационных импульсов в больших 5 000 демонстрационных систем координат. Чтобы сохранить в SystemVerilog используют Simulink.Parameter. В том параметре значение по умолчанию 2100, и допустимая область значений [0, 4936]. (Импульс должен быть полностью в рамках 5 000 выборок.)

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

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

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

Поведение симуляции UVM по умолчанию

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

Из-за ограничений значения по умолчанию, если вы запускаете тест по умолчанию, он будет использовать фиксированные значения для параметров. Для этой модели, которая означает импульсное местоположение запуска 2 100 и ОСШ 0,0. ОСШ 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, чтобы добавить рандомизированное поведение в генерацию стимула. В этом примере, призывы плана тестирования к использованию значений ОСШ между 0,75 и 1.00, чтобы определить, насколько устойчивый алгоритм находится в обнаружении импульсов в этой области значений. Для этого случая местоположение импульса не имеет значения и фиксируется в конце 5 000 демонстрационных систем координат.

См. mw_PulseDetector_SEQCRT_param_overrides.sv.

Чтобы достигнуть этой цели плана тестирования, выведенный класс последовательности создается. Это имеет следующие дополнительные поведения:

  • в pre_body() замените, использование ограничений значения по умолчанию выключено

  • в post_randomize() замените, рандомизированное значение распечатывается так, чтобы значения ОСШ могли быть связаны с тем, обнаруживаются ли импульсы или нет. Это использует служебную функцию класса fixed2real дать дружественное значение.

  • в randomize_params() замените, встроенное ограничение "рандомизируют с", ограничивает значения ОСШ, чтобы быть между 0,75 и 1.0. (Можно получить эти битные значения от MATLAB при помощи fi переменной и ее метода интервала.)

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

Чтобы запустить симуляции 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 ../../..

Исследуйте выход и смотрите, что сгенерированный ОСШ всегда между [0.75, 1.00] и импульс, который стартовое местоположение всегда 4936. С такой областью значений ОСШ заметьте, что иногда импульс обнаруживается, и иногда это не.

Ограниченная случайная верификация Используя основанные на классах ограничения

Встроенные ограничения хороши для затачивания в на определенных условиях испытания. Поскольку знаток ограничил случайное тестирование, можно создать новые ограничительные блоки операторов в выведенном классе последовательности. Здесь, план тестирования требует, чтобы местоположение импульса варьировалось через систему координат с помощью определенных "блоков" интересных местоположений в начале, середине и конце системы координат. Специальное местоположение 0 гарантирует, что, когда никакой импульс не создается, никакой импульс не обнаруживается. Аналогично, для ОСШ, несколько категорий интересных областей значений ОСШ заданы, такие как SNR_never_detected и SNR_always_detected. testwriter теперь может легко использовать эти ограничения, чтобы покрыть эти сценарии.

См. mw_PulseDetector_SEQCRT_param_overrides.sv.

Чтобы достигнуть этих целей, выведенный класс последовательности имеет следующие дополнительные поведения:

  • добавьте "loc_bucket" член, объявленный как "randc".

  • используйте это loc_bucket член, чтобы подразумевать области значений местоположения.

  • добавьте "snr_bucket" член. Это не рандомизируется, а скорее установлено testwriter.

  • используйте выбранный snr_bucket, чтобы подразумевать рандомизацию в определенных областях значений ОСШ.

  • выключите конфликт, ограничения значения по умолчанию

  • распечатайте рандомизированные значения для контроля в процессе моделирования

Новый тест создается, который говорит фабрике UVM использовать новый класс последовательности при построении испытательного стенда и также устанавливает определенный блок ОСШ через 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 ../../..

Исследуйте выход, чтобы видеть, что сгенерированный ОСШ всегда выше 1.4844 и импульс, стартовое местоположение посещает каждую из областей значений, заданных для loc_bucket. Можно также подтвердить, что, когда местоположение 0, поскольку никакой импульс не создается, никакой импульс не обнаруживается.

Обойдите генерацию стимула Simulink

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

См. mw_PulseDetector_SEQCRT_param_overrides.sv.

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

Заключения и затем продвигаются

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