Сравнение покрытия кода HDL и Simulink с помощью косимуляции

В этом примере показано, как достичь полного покрытия кода проекта круиз-контроллера HDL с помощью Simulink ® и Симулятор HDL.

Введение

HDL-код, сопоставленный с этой моделью, генерируется через HDL- Coder™ из поведенческой модели Simulink круиз- контроллер. Для проверки правильности HDL-кода предусмотрена тестовая модель путем сравнения вывода блока косимуляции HDL с выходом исходного поведенческого блока. Тестовые шкафы в тестовой модели генерируются с помощью Simulink Design Verifier™ из исходной поведенческой модели для достижения полного покрытия модели. Этот пример показывает, что автоматически сгенерированные тесткасы также достигают полного покрытия HDL-кода. Вам не нужен Simulink Design Verifier, установленный для запуска этого примера.

Откройте модель Simulink

Если вы используете 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);

Настройка синхроимпульсов, сбросов и синхроимпульсов в симуляции HDL

Сигналы clock, reset и clock enable не являются частью симуляции Simulink. Определяем драйверы для них с помощью команд «Pre-simulation Tcl» на вкладке «Simulation» маски блока косимуляции. Мы также задаем «Время запуска Симулятора HDL перед началом косимуляции» так, чтобы HDL успешно вышел из сброса перед обменом входных и выходных данных значениями.

Для ModelSim:

Для резкого:

Получившиеся формы волны в HDL:

Команды Tcl силы используются, чтобы сгенерировать формы сигналов для сигналов управления:

  1. Тактовый период составляет 10 нс

  2. Сигнал включения синхроимпульса активен на 37 нс.

  3. Сигнал сброса устанавливается в диапазоне от 0 до 27 нс.

Время запуска косимуляции должно быть выровнено с падающим ребром часов HDL, чтобы избежать условия гонки, поскольку сигналы HDL изменяют свои значения на переднем ребре часов HDL. Поэтому значение этого параметра должно быть целым числом, кратным 10-нс тактовому периоду.

Мы также хотим запустить проект после сброса, но остановиться перед первым активным ребром синхроимпульса, активированным clk_enable. Это должно соответствовать поведенческому блоку, который обновляет свои внутренние состояния сразу после начала симуляции.

Исходя из вышеизложенных факторов, опция «Время запускать HDL-симулятор перед началом косимуляции» устанавливается равной 40 нс. При запуске каждой тестовой камеры в симуляторе HDL сначала применяются команды «Pre-simulation Tcl». Затем Симулятор HDL совершенствует свое время на 40 нс, чтобы применить сигналы сброса, синхроимпульса и clk_enable перед началом косимуляции.

Запуск Симулятора HDL для косимуляции

Для 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.');

Выполняйте симуляцию

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

Для Incisive: Мы демпфируем результаты покрытия и используем инструмент «imc», чтобы визуализировать результаты.

% Dump and visualize the coverage results
tclHdlSim('coverage -dump test');
system('imc -gui -load test &');