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