В этом примере показано, как добавить ограниченную случайную верификацию в испытательный стенд Универсальной методологии верификации (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, макс. область значений, а также значение по умолчанию, которое совпадает с минимумом. Код также добавляется, чтобы поддержать переопределение значения по умолчанию командной строки через плюс Пример кода аргумента:
Генерация последовательности по умолчанию 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, поскольку никакой импульс не создается, никакой импульс не обнаруживается.
Сгенерированные последовательности выше используют рандомизацию, чтобы влиять на входные параметры и аргументы к базовым функциям GenPulse DPI-C. Фактической рыночной стоимостью являются выходные параметры тех функций. Если вы хотите взять на себя полное управление фактических транзакций, поставленных секвенсеру, можно обойти обычные вызовы DPI и рандомизировать req
элемент данных.
См. mw_PulseDetector_SEQCRT_param_overrides.sv.
В этом случае, потому что импульс, коэффициенты и шум все взаимосвязаны, полностью рандомизирование их значений не даст к допустимым тестам. Но этот метод полезен для других типов транзакции.
В полной среде UVM, каждый раз, когда рандомизация введена, обычно важно включать покрытие и гарантировать, что различные части среды знают, какие случайные значения были сгенерированы. В рандомизированных значениях этих примеров просто распечатываются. Добавление покрытия для сгенерированного ОСШ и значений местоположения - и связь тех к обнаружению и порогам ошибок - являются осуществлением, оставленным читателю.