В этом примере показано, как обеспечить полное кодовое покрытие конструкции круиз-контроллера ЛПВП с использованием Simulink ® и симулятора ЛПВП.
Код ЛПВП, связанный с этой моделью, генерируется посредством Coder™ ЛПВП из поведенческой модели Simulink круизного контроллера. Предлагается модель испытательного стенда для проверки правильности кода ЛПВП путем сравнения выходного сигнала блока косимуляции ЛПВП с выходным сигналом исходного поведенческого блока. Тестовые оболочки в модели тестового стенда генерируются с помощью Simulink Design Verifier™ из исходной поведенческой модели для достижения полного охвата модели. В этом примере показано, что автоматически сгенерированные тестовые пакеты также обеспечивают полное покрытие кода HDL. Для выполнения этого примера не требуется установка программы Simulink Design Verifier.
При использовании ModelSim или QuestaSim cruise_control_modelsim.slx модели должен быть открыт. При использовании Insive или Xcelium закройте модель ModelSim и откройте cruise_control_incisive.slx модели.
Обратите внимание, что функция покрытия кода является дополнительной функцией в ModelSim PE. Убедитесь, что версия ModelSim имеет соответствующую лицензию на покрытие кода для выполнения этого примера.
% For ModelSim: modelName = 'cruise_control_modelsim'; open_system(modelName);
% For Incisive: modelName = 'cruise_control_incisive'; open_system(modelName);

Сигналы синхронизации, сброса и включения синхронизации не являются частью моделирования Simulink. Драйверы для них определяются с помощью команд предварительного моделирования Tcl на вкладке «Моделирование» маски блока косимуляции. Мы также задаем значение «Time to run HDL simulator before cosimulation start» (Время запуска имитатора ЛПВП перед началом косимуляции) таким образом, что ЛПВП успешно выходит из сброса до обмена значениями входных и выходных данных.
Для ModelSim:

Для резцового:

Результирующие сигналы в ЛПВП:

Команды Tcl force используются для формирования сигналов управления:
Тактовый период составляет 10 нс
Сигнал разрешения синхронизации активен на 37 нс.
Сигнал сброса устанавливается от 0 до 27 нс.
Время начала косимуляции должно быть выровнено с задним фронтом синхросигнала ЛПВП, чтобы избежать условий гонки, поскольку сигналы ЛПВП изменяют свои значения на переднем фронте синхросигнала ЛПВП. Поэтому значение этого параметра должно быть целым числом, кратным 10 нс тактовому периоду.
Мы также хотим запустить конструкцию HDL после сброса, но остановить перед первым активным фронтом синхронизации, включенным clk_enable. Это должно соответствовать поведенческому блоку, который обновляет свои внутренние состояния сразу после запуска моделирования.
Исходя из вышеизложенных соображений, опция «Время запуска имитатора ЛПВП до запуска косимуляции» устанавливается равной 40 нс. При запуске каждого тестового случая сначала в имитаторе ЛПВП применяются «Команды предварительного моделирования РУД». Затем имитатор ЛПВП увеличивает свое время на 40 нс для подачи сигналов сброса, синхронизации и clk_enable перед началом косимуляции.
Для Modelsim:
% Commands to compile and invoke Modelsim with code coverage enabled. tclCmds = { 'vlib work',... % Create ModelSim library 'vcom +cover cruise_hdlsrc/PI_Controller.vhd',... % Compile VHDL code with code coverage enabled 'vcom +cover cruise_hdlsrc/Controller.vhd',... % Compile VHDL code with code coverage enabled 'vsimulink -coverage work.Controller',... % Load simulation 'puts "Ready for cosimulation..."',... }; % Now we launch the HDL simulator and wait for it to be ready. vsim('tclstart',tclCmds); disp('Waiting for HDL simulator to start ...'); processid = pingHdlSim(240); disp('HDL simulator is ready to cosimulate.');
Для резцового:
% Commands to compile and invoke Incisive with code coverage enabled. tclCmds = { 'exec ncvhdl -64bit -v93 cruise_hdlsrc/PI_Controller.vhd',... % Compile VHDL code 'exec ncvhdl -64bit -v93 cruise_hdlsrc/Controller.vhd',... % Compile VHDL code 'exec ncelab -64bit -coverage all -vhdl_time_precision 1ns -access +wc Controller',... % Elaborate design with coverage enabled 'hdlsimulink -covoverwrite Controller',... % Load simulation 'puts "Ready for cosimulation..."',... }; % Now we launch the HDL simulator and wait for it to be ready. nclaunch('tclstart',tclCmds,'runmode','CLI','libfile','liblfihdls_gcc44.so'); disp('Waiting for HDL simulator to start ...'); processid = pingHdlSim(240); disp('HDL simulator is ready to cosimulate.');
В модели испытательного стенда девять тестовых корпусов. В этом примере выполняется эта модель со всеми тестовыми кадрами для получения результата покрытия кода. После завершения каждого сеанса косимуляции нет необходимости перезапускать имитатор ЛПВП, поскольку сигнал ЛПВП сбрасывается должным образом в начале каждого моделирования. После каждого моделирования добавляется короткая пауза, чтобы обеспечить время для обновления результата покрытия имитатором ЛПВП до следующей итерации.
% Run the cosimulation for k = 1 : 9 signalbuilder([modelName '/Inputs'], 'activegroup', k); % Select a testcase sim(modelName); % Run simulation pause(5); % pause for writing coverage to database end
Имитатор ЛПВП накапливает покрытие по мере итерации всех тестовых циклов. По завершении моделирования достигается 100% покрытие кода.
Для ModelSim: можно проверить результат покрытия на вкладке «Покрытие» пользовательского интерфейса.

For Incisive: Мы сбрасываем результаты покрытия и используем инструмент «imc» для визуализации результатов.
% Dump and visualize the coverage results tclHdlSim('coverage -dump test'); system('imc -gui -load test &');
