В этом примере показана работа модуля ModelSim ® или Imcisive ® HDL Simulator в пакетном режиме для тестирования компонента HDL с помощью тестового стенда MATLAB ®. В этой демонстрации мы скомпилируем фильтр нижних частот HDL, разработанный и сгенерированный с помощью Coder™ HDL Filter Design, а затем тестируем его ответ с помощью функции HDL Verifier™ matlabtb. Вся косимуляция выполняется в пакетном режиме.
В этом примере:
Фильтр имеет время выборки 10 нс (частота выборки 100 МГц) с полосой пропускания Fpass = 20 МГц и полосой останова Fstop = 25 МГц.
Файл lowpass_filter.v содержащий фильтр нижних частот, созданный кодером HDL конструкции фильтра.
Файл, filtertb_modelsim.m для ModelSim/QuestaSim или filtertb_batch_in.m для Incisive/Xcelium, содержит тестовый стенд MATLAB.
Создадим временный каталог для скомпилированных и разработанных HDL-файлов.
Необходимо иметь исполняемые файлы имитатора HDL на системном пути. Обратите внимание, что в этом примере не выполняется кодер HDL конструкции фильтра.
Этот пример разделен на несколько шагов, которые показывают, как написать сценарий, который выполняет косимуляцию между MATLAB и имитатором HDL. Однако для многих приложений пакетного режима для выполнения нескольких прогонов моделирования требуется запустить один сценарий.
ModelSim/QuestaSim Можно запустить весь этот пример как сценарий регрессии. В остальном примере сценарий разбивается на разделы.
Incisive/Xcelium Можно запустить весь этот пример как сценарий регрессии. В остальном примере сценарий разбивается на разделы.
Создайте временную рабочую папку для компиляции проекта и скопируйте требуемые файлы.
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);
Резак/Кселий
projdir = tempname; mkdir(projdir); copyfile(fullfile(matlabroot,'toolbox','edalink','extensions','incisive','incisivedemos','Filter_batch','filtertb_batch_in.m'),pwd);
Запустите сервер MATLAB с помощью функции hdldaemon HDL Verifier. Задайте свойство «» сокет «» для указания связи сокета.
status = hdldaemon('socket',0);
socket_port = status.ipc_id; %Socket number to be used for cosimulationУкажите команды Tcl для выполнения в имитаторе ЛПВП. Эти команды компилируют конструкцию ЛПВП, загружают библиотеку косимуляции, планируют функцию обратного вызова и управляют сигналами ЛПВП.
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'};
Резак/Кселий
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}"'... ]};
Поскольку имитатор HDL запускается в пакетном режиме, выполнение команды run в интерактивном режиме невозможно. Вместо этого мы предоставляем команду run в свойстве «tclstart». Когда cosimulation завершается в имитаторе HDL, мы отправляем событие ID 1 hdldaemon через команду notifyMatlabServer. В MATLAB команда waitForHdlClient ожидает получения этого идентификатора события. (Можно также использовать команды notifyMatlabServer и waitForHdlClient при запуске косимуляции в режимах CLI или GUI.)
ModelSim/QuestaSim
tclcmd = [tclcmd,... {'run 10000',... ['notifyMatlabServer 1 -socket ' socket_port]}];
Резак/Кселий
tclcmd{end} = [tclcmd{end} ...
' -input "{@run 10000 ns}"' ...
' -input "{@notifyMatlabServer 1 -socket ' socket_port '}"'];
Объявите частоту входного сигнала глобальной, чтобы к нему можно было обращаться как внутри, так и снаружи функции обратного вызова. Для первого цикла косимуляции вход фильтра представляет собой синусоидальную волну 1 МГц.
global frequency; % Frequency of input signal global ticks; % Number of callbacks executed
frequency = 1e6; % 1 MHz
ticks = 0;
Запустите имитатор ЛПВП в пакетном режиме, установив для свойства «runmode» команду HDL Verifier vsim для ModelSim или команду nclaunch для Insisive. Процесс имитатора HDL запускается в фоновом режиме, и в Windows ® открывается окно команд. Затем используйте команду waitForHdlClient для ожидания события с идентификатором 1, отправленного командой notifyMatlabServer в симуляторе HDL. Получение этого идентификатора указывает на то, что косимуляция закончилась, и мы можем перейти к следующему шагу. Если этот идентификатор события не получен в течение 120 секунд, выдается сообщение об ошибке.

ModelSim/QuestaSim
vsim('tclstart',tclcmd, 'rundir',projdir,... 'runmode','Batch'); % Start HDL simulator in batch mode waitForHdlClient(120,1); % Waiting for cosimulation to finish
Резак/Кселий
nclaunch('tclstart',tclcmd, 'rundir',projdir,... 'runmode','Batch'); % Start HDL simulator in batch mode waitForHdlClient(120,1); % Waiting for cosimulation to finish
Во втором цикле косимуляции входной сигнал представляет собой синусоидальную волну 25 МГц.
frequency = 25e6; % 25 MHz
ticks = 0;
Снова запустите имитатор HDL в пакетном режиме и дождитесь завершения запуска косимуляции с помощью команды waitForHdlClient.

ModelSim/QuestaSim
vsim('tclstart',tclcmd, 'rundir', projdir,... 'runmode','Batch'); % Start HDL simulator in batch mode waitForHdlClient(120,1); % Waiting for cosimulation to finish
Резак/Кселий
nclaunch('tclstart',tclcmd, 'rundir',projdir,... 'runmode','Batch'); % Start HDL simulator in batch mode waitForHdlClient(120,1); % Waiting for cosimulation to finish
По завершении моделирования открываются две фигуры MATLAB. На первом графике показан входной сигнал 1 МГц и его выход. На втором графике показан входной сигнал 25 МГц и соответствующий выход.
На этом этот пример завершается.