Этот пример иллюстрирует рабочий 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.
Файл filtertb_modelsim.m для ModelSim/QuestaSim или filtertb_batch_in.m для Incisive/Xcelium содержит испытательный стенд MATLAB.
Мы создаем временную директорию для скомпилированных и разработанных файлов HDL.
У вас должны быть исполняемые файлы симулятора HDL на вашем системном пути. Обратите внимание на то, что мы не запускаем Filter Design HDL Coder во время этого примера.
Этот пример разделен на несколько шагов, которые показывают вам, как записать скрипт, который выполняет cosimulation между 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);
Incisive/Xcelium
projdir = tempname; mkdir(projdir); copyfile(fullfile(matlabroot,'toolbox','edalink','extensions','incisive','incisivedemos','Filter_batch','filtertb_batch_in.m'),pwd);
Запустите сервер MATLAB с помощью функции HDL Verifier hdldaemon. Установите свойство 'сокета' задать коммуникацию сокета.
status = hdldaemon('socket',0); socket_port = status.ipc_id; %Socket number to be used for cosimulation
Задайте команды 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}"'... ]};
Поскольку мы запускаем симулятор 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 в пакетном режиме путем установки свойства 'режима выполнения' на 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 входной сигнал является синусоидой на 25 МГц.
frequency = 25e6; % 25 MHz
ticks = 0;
Запустите симулятор 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 МГц и соответствующий выход.
Это завершает этот пример.