В этом примере показано, как достигнуть полного покрытия кода проектирования контроллера круиза HDL с помощью Simulink® и ModelSim®.
Создайте папку вне осциллографа вашей папки установки MATLAB®, в которую можно скопировать файлы в качестве примера. Папка должна быть перезаписываема.
Установите папку, которую вы создали как своя текущая папка в MATLAB.
Скопируйте все файлы, расположенные в matlabroot\toolbox\edalink\foundation\hdllink\demo_src\cruise_control к папке вы созданный путем выполнения следующей команды в MATLAB:
copyCosimDemoFiles('cruise_control');
HDL-код, сопоставленный с этой моделью, сгенерирован через HDL Coder™ от поведенческой модели Simulink контроллера круиза. Тестовая модель обеспечивается, чтобы проверить правильность HDL-кода путем сравнения выхода HDL cosimulation блок с тем из исходного поведенческого блока. Тестовые сценарии в тестовой модели сгенерированы через Simulink Design Verifier™ от исходной поведенческой модели для достижения полного покрытия модели. Этот пример показывает, что те автоматически сгенерированные тестовые сценарии также достигают полного покрытия HDL-кода. Вам не нужен Simulink Design Verifier, установленный, чтобы запустить этот пример. Обратите внимание на то, что функция покрытия кода является дополнительной функцией в ModelSim PE. Убедитесь, что ваша версия ModelSim имеет соответствующую лицензию покрытия кода, чтобы запустить этот пример. Откройте тестовую модель путем выполнения:
open_system('cruise_control_modelsim');
Откройтесь маска cosimulation блокируют "hdl_cruise_control" и выбирают вкладку "Simulation". Настройки на этой вкладке показывают в следующем изображении:
Обратите внимание на то, что в поле "Pre-simulation Tcl commands", команда силы Tcl используется, чтобы сгенерировать формы волны для управляющих сигналов:
Период часов составляет 10 нс
Часы включают сигнал, активно на уровне 37 нс.
Сигнал сброса утверждается от 0 до 27 нс.
Цель опции "Время, чтобы запустить симулятор HDL прежде cosimulation запускается", должен правильно выровнять сигнал поведенческого блока "cruise_control" и сигнал HDL так, чтобы они могли быть сравнены и проверены непосредственно без дополнительных задержек. Этот пример показывает, как установить эту опцию в следующем разделе.
cosimulation время начала должно быть выровнено с падающим ребром часов HDL, чтобы избежать состояния состязания, поскольку сигналы HDL изменяют свои значения в возрастающем ребре часов HDL. Поэтому значение этого параметра должно быть целочисленным кратным период часов на 10 нс.
Мы также хотим запустить проект HDL прошлый сброс, но остановка перед первым активным фронтом синхроимпульса, включенным clk_enable. Это должно совпадать с поведенческим блоком, который обновляет его внутренние состояния прямо после того, как симуляция запускается.
На основе вышеупомянутых факторов запускается опция "Время, чтобы запустить симулятор HDL прежде cosimulation", установлен в 40 нс. При выполнении каждого testcase "Предварительная симуляция команды Tcl" применяются в симуляторе HDL сначала. Затем симулятор HDL совершенствует свое время на 40 нс, чтобы применить сброс, часы и сигналы clk_enable, прежде чем cosimulation запустится.
Следующие команды ModelSim Tcl компилируют HDL-код и загружают симуляцию с включенным покрытием кода.
tclCmds = { 'vlib work',... % Create ModelSim library 'vcom +cover PI_Controller.vhd',... % Compile VHDL code with code coverage enabled 'vcom +cover Controller.vhd',... % Compile VHDL code with code coverage enabled 'vsimulink -coverage work.Controller',...% Load simulation 'puts "Ready for cosimulation..."',... }; % Now we launch HDL simulator and wait for it to ready. vsim('tclstart',tclCmds); disp('Waiting for HDL simulator to start ...'); processid = pingHdlSim(240); disp('HDL simulator is ready to cosimulate.');
В тестовой модели существует девять тестовых сценариев. Этот пример запускает эту модель со всеми тестовыми сценариями, чтобы привести к результату покрытия кода. После окончания каждого cosimulation сеанса нет никакой потребности перезапустить симулятор HDL, поскольку сигнал HDL сбрасывается правильно в начале каждой симуляции. После каждой симуляции требуется время ModelSim, чтобы обновить результат покрытия. Чтобы предотвратить потенциальный конфликт между этим процессом и следующим cosimulation сеансом, короткая пауза добавляется между двумя последовательными симуляциями.
for k = 1 : 9 % Select a testcase signalbuilder('cruise_control_modelsim/Inputs', 'activegroup', k) % Run simulation sim('cruise_control_modelsim'); % Make sure ModelSim has finished previous simulation pause(5); end
В процессе моделирования посмотрите на результаты в окне покрытия кода в ModelSim. Обратите внимание на то, что увеличения процента покрытия кода как этот пример выполняют итерации через все тестовые сценарии. Когда симуляция закончена, 100%-е покрытие кода достигается.