В этом примере показано, как достигнуть полного покрытия кода проектирования контроллера круиза HDL с помощью Simulink® и симулятора HDL.
HDL-код, сопоставленный с этой моделью, сгенерирован через HDL Coder™ от поведенческой модели Simulink контроллера круиза. Тестовая модель обеспечивается, чтобы проверить правильность HDL-кода путем сравнения выхода HDL cosimulation блок с тем из исходного поведенческого блока. Тестовые сценарии в тестовой модели сгенерированы через Simulink Design Verifier™ от исходной поведенческой модели для достижения полного покрытия модели. Этот пример показывает, что те автоматически сгенерированные тестовые сценарии также достигают полного покрытия HDL-кода. Вам не нужен Simulink Design Verifier, установленный, чтобы запустить этот пример.
Если вы используете ModelSim или QuestaSim, модель cruise_control_modelsim.slx должна быть открыта. Если вы используете Incisive или 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" во вкладке "Simulation" маски блока cosimulation. Мы также устанавливаем "Время запускать симулятор HDL, прежде чем cosimulation запустится" таким образом, что HDL успешно вышел из сброса, прежде чем любыми значениями входных и выходных данных обменяются.
Для ModelSim:
Для острого:
Получившиеся формы волны в HDL:
Команды силы Tcl используются, чтобы сгенерировать формы волны для управляющих сигналов:
Период часов составляет 10 нс
Часы включают сигнал, активно на уровне 37 нс.
Сигнал сброса утверждается от 0 до 27 нс.
cosimulation время начала должно быть выровнено с падающим ребром часов HDL, чтобы избежать состояния состязания, поскольку сигналы HDL изменяют свои значения в возрастающем ребре часов HDL. Поэтому значение этого параметра должно быть целочисленным кратным период часов на 10 нс.
Мы также хотим запустить проект HDL прошлый сброс, но остановка перед первым активным фронтом синхроимпульса, включенным clk_enable. Это должно совпадать с поведенческим блоком, который обновляет его внутренние состояния прямо после того, как симуляция запускается.
На основе вышеупомянутых факторов запускается опция "Время, чтобы запустить симулятор HDL прежде cosimulation", установлен в 40 нс. При выполнении каждого testcase "Предварительная симуляция команды Tcl" применяются в симуляторе HDL сначала. Затем симулятор HDL совершенствует свое время на 40 нс, чтобы применить сброс, часы и сигналы clk_enable, прежде чем cosimulation запустится.
Для 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.');
В тестовой модели существует девять тестовых сценариев. Этот пример запускает эту модель со всеми тестовыми сценариями, чтобы привести к результату покрытия кода. После окончания каждого cosimulation сеанса нет никакой потребности перезапустить симулятор HDL, поскольку сигнал HDL сбрасывается правильно в начале каждой симуляции. После каждой симуляции короткая пауза добавляется, чтобы гарантировать время для симулятора HDL, чтобы обновить результат покрытия перед следующей итерацией.
% 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
Симулятор HDL накапливает покрытие, когда мы выполняем итерации через все тестовые сценарии. Когда симуляция закончена, 100%-е покрытие кода достигается.
Для ModelSim: можно исследовать результат покрытия во вкладке "Coverage" пользовательского интерфейса.
Для Острого: Мы выводим результаты покрытия и используем "imc" инструмент, чтобы визуализировать результаты.
% Dump and visualize the coverage results tclHdlSim('coverage -dump test'); system('imc -gui -load test &');