Генерация покрытия HDL-кода Используя Simulink и острый тактовый сигнал

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

Настройте файлы в качестве примера

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

open_system('cruise_control_incisive');

Наблюдайте настройки блока Cosimulation

Откройтесь маска cosimulation блокируют "hdl_cruise_control" и выбирают вкладку "Simulation". Настройки на этой вкладке показывают в следующем изображении:

Обратите внимание на то, что в поле "Pre-simulation Tcl commands", команда силы Tcl используется, чтобы сгенерировать формы волны для управляющих сигналов:

  1. Период часов составляет 10 нс

  2. Часы включают сигнал, активно на уровне 37 нс.

  3. Сигнал сброса утверждается от 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 запустится.

Запуск, острый для Cosimulation

Следующие Острые команды Tcl компилируют HDL-код и загружают симуляцию с включенным покрытием кода.

tclCmds = {
    'exec ncvhdl -64bit -v93 PI_Controller.vhd',...      % Compile VHDL code
    'exec ncvhdl -64bit -v93 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 HDL simulator and wait for it to 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 сбрасывается правильно в начале каждой симуляции.

for k = 1 : 9
    % Select a testcase
    signalbuilder('cruise_control_incisive/Inputs', 'activegroup', k)
    % Run simulation
    sim('cruise_control_incisive');
end

Наблюдайте результат покрытия кода

Когда симуляция будет закончена, запустите следующие команды, чтобы сгенерировать результат покрытия кода в ncsim и просмотреть результат в iccr графический интерфейсе пользователя.

% Generate code coverage result in ncsim
tclHdlSim('coverage -dump test');
% View code coverage result in iccr GUI
system('iccr -gui -test test &');