Пакетный режим Cosimulation для тестирования компонента фильтра

Этот пример иллюстрирует рабочий ModelSim® или Incisive® HDL Simulator в пакетном режиме, чтобы протестировать компонент HDL с испытательным стендом MATLAB®. На этой демонстрации мы компилируем HDL фильтр lowpass - спроектированный и сгенерированный с Filter Design HDL Coder™ - и затем тестируем его ответ с помощью функции HDL Verifier™ matlabtb. Целый cosimulation выполняется в пакетном режиме.

В этом примере:

  • Фильтр имеет шаг расчета 10 нс (частота дискретизации 100 МГц) с полосой пропускания МГц Fpass=20 и полоса задерживания МГц Fstop=25.

  • Файл lowpass_filter.v содержит фильтр lowpass, сгенерированный Filter Design HDL Coder.

  • Мы создаем временную директорию для скомпилированных и разработанных файлов HDL.

У вас должны быть исполняемые файлы симулятора HDL на вашем системном пути. Обратите внимание на то, что мы не запускаем Filter Design HDL Coder во время этого примера.

Запустите целую симуляцию пакетного режима

Этот пример разделен на несколько шагов, которые показывают вам, как записать скрипт, который выполняет cosimulation между MATLAB и симулятором HDL. Однако для многих приложений пакетного режима, вы запустили бы один скрипт, чтобы выполнить несколько запусков симуляции.

Создайте каталог проекта

Создайте временную рабочую директорию для компиляции проекта и скопируйте требуемые файлы.

  • ModelSim/QuestaSim

projdir = tempname;
mkdir(tempdir,strrep(projdir,tempdir,''));
unixprojdir = strrep(projdir,'\','/');
copyfile(fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos','Filter_batch','filtertb_modelsim.m'),pwd);
  • Incisive/Xcelium

projdir = tempname;
mkdir(projdir);
copyfile(fullfile(matlabroot,'toolbox','edalink','extensions','incisive','incisivedemos','Filter_batch','filtertb_batch_in.m'),pwd);

Запустите сервер MATLAB

Запустите сервер MATLAB с помощью функции HDL Verifier hdldaemon. Установите свойство 'сокета' задать коммуникацию сокета.

status = hdldaemon('socket',0);
socket_port = status.ipc_id; %Socket number to be used for cosimulation

Задайте команды Tcl

Задайте команды Tcl, чтобы выполниться в симуляторе HDL. Эти команды будут компилировать проект HDL, загружать cosimulation библиотеку, планировать функцию обратного вызова и управлять сигналами HDL.

  • ModelSim/QuestaSim

srcfile= fullfile(matlabroot,'toolbox','edalink','extensions',...
       'modelsim','modelsimdemos','Filter_batch','lowpass_filter.v');
unixsrcfile = ['"' strrep(srcfile,'\','/') '"'];
tclcmd ={['cd ', unixprojdir],...
         'vlib work',...
        ['vlog ' unixsrcfile],...
         'vsimmatlab  lowpass_filter ', ...
        ['matlabtb lowpass_filter 10ns -repeat 10ns -mfunc filtertb_modelsim -socket ' socket_port],...
         'force clk_enable 1 0',...
         'force reset 1 0, 0 25',...
         'force clk 1 0, 0 5 -repeat 10'};
  • Incisive/Xcelium

srcfile = fullfile(matlabroot,'toolbox','edalink','extensions',...
   'incisive','incisivedemos','Filter_batch','lowpass_filter.v');
unixsrcfile = ['"' strrep(srcfile,'\','/') '"'];
tclcmd = {  ['cd ',projdir],...
           ['exec ncvlog -64bit ' unixsrcfile],...
           'exec ncelab -64bit -access +wc lowpass_filter',...
           ['hdlsimmatlab lowpass_filter ', ...
           [' -input "{@matlabtb lowpass_filter 10ns -repeat 10ns -mfunc filtertb_batch_in -socket ' socket_port '}"'],...
            ' -input "{@force lowpass_filter.clk_enable 1 -after 0ns}"',...
            ' -input "{@force lowpass_filter.reset 1 -after 0ns 0 -after 22ns}"',...
            ' -input "{@force lowpass_filter.clk 1 -after 0ns 0 -after 5ns -repeat 10ns}"',...
            ' -input "{@deposit lowpass_filter.filter_in 0}"'...
           ]};

Добавьте 'запуск' и 'notifyMatlabServer' команды

Поскольку мы запускаем симулятор HDL в пакетном режиме, мы не можем выпустить команду выполнения в интерактивном режиме. Вместо этого мы обеспечиваем команду выполнения в 'tclstart' свойстве. Когда cosimulation заканчивается в симуляторе HDL, мы отправляем идентификатор события 1 в hdldaemon посредством notifyMatlabServer команды. В MATLAB waitForHdlClient команда ожидает, чтобы получить этот идентификатор события. (Можно также использовать notifyMatlabServer и waitForHdlClient команды, когда cosimulation запускается в режимах CLI или GUI.)

  • ModelSim/QuestaSim

tclcmd = [tclcmd,...
   {'run 10000',...
   ['notifyMatlabServer 1 -socket ' socket_port]}];
  • Incisive/Xcelium

tclcmd{end} = [tclcmd{end} ...
   ' -input "{@run 10000 ns}"' ...
   ' -input "{@notifyMatlabServer 1 -socket ' socket_port '}"'];

Подготовьте данные об испытательном стенде

Объявите частоту входного сигнала как глобальная переменная так, чтобы к этому можно было получить доступ и внутри и снаружи функции обратного вызова. Для первого запущенного cosimulation вход к фильтру является синусоидой на 1 МГц.

global frequency;   % Frequency of input signal
global ticks;       % Number of callbacks executed
frequency = 1e6;    % 1 MHz
ticks     = 0;

Запустите симулятор HDL в пакетном режиме для первого запуска Cosimulation

Запустите симулятор HDL в пакетном режиме путем установки свойства 'режима выполнения' на HDL Verifier vsim команда для ModelSim или nclaunch команда для Острого. Процесс симулятора HDL запускается в фоновом режиме и на Windows®, командное окно открывается. Затем используйте waitForHdlClient команду, чтобы ожидать идентификатора события 1 отправленный notifyMatlabServer командой в симуляторе HDL. Получение этого ID указывает, что cosimulation закончен, и мы можем перейти к следующему шагу. Если этот идентификатор события не получен в течение 120 секунд, об ошибке сообщают.

  • ModelSim/QuestaSim

vsim('tclstart',tclcmd, 'rundir',projdir,...
    'runmode','Batch'); % Start HDL simulator in batch mode
waitForHdlClient(120,1); % Waiting for cosimulation to finish
  • Incisive/Xcelium

nclaunch('tclstart',tclcmd, 'rundir',projdir,...
    'runmode','Batch'); % Start HDL simulator in batch mode
waitForHdlClient(120,1); % Waiting for cosimulation to finish

Готовьте следующую кампанию по участию в выборах Cosimulation

Во втором запущенном cosimulation входной сигнал является синусоидой на 25 МГц.

frequency = 25e6; % 25 MHz
ticks = 0;

Запустите симулятор HDL в пакетном режиме для второго запуска Cosimulation

Запустите симулятор HDL в пакетном режиме снова и ожидайте cosimulation, запущенного, чтобы завершить использование waitForHdlClient команды.

  • ModelSim/QuestaSim

vsim('tclstart',tclcmd, 'rundir', projdir,...
    'runmode','Batch'); % Start HDL simulator in batch mode
waitForHdlClient(120,1); % Waiting for cosimulation to finish
  • Incisive/Xcelium

nclaunch('tclstart',tclcmd, 'rundir',projdir,...
    'runmode','Batch'); % Start HDL simulator in batch mode
waitForHdlClient(120,1); % Waiting for cosimulation to finish

Когда симуляция завершается, две открытые фигуры MATLAB. Первый график показывает входной сигнал на 1 МГц и его выход. Второй график показывает входной сигнал на 25 МГц и соответствующий выход.

Это завершает этот пример.