Испытательный стенд и функциональная запись компонента

Запись функций Используя объект экземпляра HDL

Этот раздел объясняет, как вы используете аргумент use_instance_obj для функций MATLAB® matlabcp и matlabtb. Эта функция заменяет iport, oport, tnext, tnow и аргументы portinfo определения функции MATLAB. Вместо этого объект экземпляра HDL передается функции в качестве аргумента. С этой функцией matlabcp и коллбэки функции matlabtb передали объект экземпляра HDL в: к состоянию удержания обеспечьте защиту доступа для чтения-записи для сигналов и позвольте вам добавлять состояние, как желаемый.

С этой функцией вы получаете следующие преимущества:

  • Использование той же функции MATLAB, чтобы представлять поведение для различных экземпляров того же модуля в HDL без потребности создать одноразовые функции обертки.

  • Никакая потребность в специальном аргументе portinfo на первом вызове.

  • Никакая потребность использовать персистентные или глобальные переменные.

  • Лучшая обратная связь и меры защиты при чтении/записи сигналов.

  • Использование полей объекта, чтобы идентифицировать путь к экземпляру и прибывает ли вызов из функции или испытательного стенда компонента.

  • Использование полевого аргумента, чтобы передать пользовательские аргументы от matlabcp или инстанцирования matlabtb на стороне HDL к функциональным коллбэкам.

Аргумент use_instance_obj идентичен и для matlabcp и для matlabtb. Вы включаете аргумент -use_instance_obj с matlabcp или matlabtb в следующем формате:

matlabcp modelname -mfunc funcname -use_instance_obj

Когда вы используете use_instance_obj, HDL Verifier™ передает объект экземпляра HDL функции, заданной с аргументом -mfunc. Вызванная функция имеет следующую подпись:

function MyFunctionName(hdl_instance_obj)

Объекту экземпляра HDL, hdl_instance_obj, показали поля в следующей таблице.

Поле Доступ для чтения-записиОписание
tnextТолько для записи

Используемый, чтобы запланировать коллбэк во время временной стоимости набора. Это поле совпадает с tnext в старой структуре portinfo. Например:

hdl_instance_obj.tnext = hdl_instance_obj.tnow + 5e-9

Эта строка кода планирует коллбэк во время = 5 наносекунд от tnow.

userdataЧтение-записьПеременные состояния хранилищ текущего экземпляра matlabcp. Можно получить переменные в следующий раз, когда коллбэк этого экземпляра планируется.
simstatusТолько для чтения

Хранит состояние симулятора HDL. Программное обеспечение HDL Verifier устанавливает это поле на 'Init' во время первого коллбэка для этого конкретного экземпляра и к 'Running' после этого. Это значение поля является свойством только для чтения.

>> hdl_instance_obj.simstatus

ans=
      Init
instanceТолько для чтения

Хранит полный путь экземпляра Verilog®/VHDL®, сопоставленного с коллбэком. экземпляр является свойством только для чтения. Значение этого поля равняется значению экземпляра модуля, заданного с вызовом функции. Например:

В симуляторе HDL:

hdlsim> matlabcp osc_top -mfunc oscfilter use_instance_obj

В MATLAB:

>> hdl_instance_obj.instance

ans=
		osc_top
argumentТолько для чтения

Хранит аргумент, установленный опцией -argument matlabcp. Например:

matlabtb osc_top -mfunc oscfilter -use_instance_obj -argument foo
Программное обеспечение верификации поддерживает опцию -argument только, когда вы используете его с -use_instance_obj, в противном случае аргумент проигнорирован. аргумент является свойством только для чтения.
>> hdl_instance_obj.argument

ans= 
    	foo

portinfoТолько для чтения

Хранит информацию о портах VHDL и Verilog, сопоставленных с этим экземпляром. Это значение поля является свойством только для чтения, которое имеет полевую структуру, которая описывает порты, заданные для связанного модуля HDL. Для каждого порта структура portinfo передает информацию, такую как тип порта, направление и размер. Для получения дополнительной информации о данных порта смотрите Получающий доступ к и Применение Информации порта.

hdl_instance_obj.portinfo.field1.field2.field3

Примечание

Когда вы используете use_instance_obj, вы получаете доступ к tscale через объект экземпляра HDL. Если вы не используете use_instance_obj, можно все еще получить доступ к tscale через portinfo.

tscaleТолько для чтения

Хранит предел разрешения (метка деления) в секундах симулятора HDL. Это значение поля является свойством только для чтения.

>> hdl_instance_obj.tscale

ans=
	1.0000e-009

Примечание

Когда вы используете use_instance_obj, вы получаете доступ к tscale через объект экземпляра HDL. Если вы не используете use_instance_obj, можно все еще получить доступ к tscale через portinfo.

tnowТолько для чтения

Хранит текущее время. Это значение поля является свойством только для чтения.

hdl_instance_obj.tnext = hld_instance_obj.tnow + fastestrate;

portvaluesЧтение-запись

Хранит текущие значения и устанавливает новые значения для выходных и входных портов для экземпляра matlabcp. Например:

>> hdl_instance_obj.portvalues

ans =
Read Only Input ports:
	clk_enable: []
	clk: []
	reset: []
Read/Write Output ports:
	sine_out: [22x1 char]

linkmodeТолько для чтения

Хранит состояние коллбэка. Программное обеспечение HDL Verifier устанавливает это поле на 'testbench', если коллбэк сопоставлен с matlabtb и 'component', если коллбэк сопоставлен с matlabcp. Это значение поля является свойством только для чтения.

>> hdl_instance_obj.linkmode

ans=
	component

Пример: Используя matlabcp и объект экземпляра HDL

В этом примере симулятор HDL выполняет повторенные вызовы к matlabcp, чтобы связать несколько экземпляров HDL с той же функцией MATLAB. Каждый вызов содержит -argument как параметр конструктора, чтобы дифференцировать поведение.

> matlabcp u1_filter1x -mfunc osc_filter -use_instance_obj -argument "oversample=1"
> matlabcp u1_filter8x -mfunc osc_filter -use_instance_obj -argument "oversample=8"
> matlabcp u2_filter8x -mfunc osc_filter -use_instance_obj -argument "oversample=8"

Коллбэк функции MATLAB, osc_filter.m, настраивает пользователя основанное на экземпляре состояние с помощью obj.userdata, запрашивает порт и контекст симуляции с помощью других полей obj, и использует переданный в obj.argument, чтобы дифференцировать поведение.

function osc_filter(obj)
  if (strcmp(obj.simstatus,'Init'))
    ud = struct('Nbits', 22, 'Norder', 31, 'clockperiod', 80e-9, 'phase', 1));
    eval(obj.argument);
    if (~exist('oversample','var'))
        error('HdlLinkDemo:UseInstanceObj:BadCtorArg', ...
        'Bad constructor arg to osc_filter callback. Expecting 
					''oversample=value''.');
    end
    ud.oversample        = oversample;
    ud.oversampleperiod  = ud.clockperiod/ud.oversample;
    ud.InDelayLine       = zeros(1,ud.Norder+1);

    centerfreq = 70/256;
    passband   = [centerfreq-0.01, centerfreq+0.01];
    b          = fir1((ud.Norder+1)*ud.oversample-1, passband./ud.oversample);
    ud.Hresp             = ud.oversample .* b;

    obj.userdata = ud;
  end

...

Запись функций Используя информацию порта

Синтаксис функции MATLAB и определения аргумента функции

Синтаксис функции компонента MATLAB

function [oport, tnext] = MyFunctionName(iport, tnow, portinfo)

Синтаксис функции испытательного стенда MATLAB

function [iport, tnext] = MyFunctionName(oport, tnow, portinfo)

Аргументы ввода/вывода (iport и oport) для функции компонента MATLAB являются реверсом аргументов port для функции испытательного стенда MATLAB. Таким образом, функция компонента MATLAB возвращает данные сигнала в выходные параметры и получает данные из входных параметров связанного модуля HDL.

Для получения дополнительной информации об использовании tnext и tnow для планирования симуляции, смотрите, что Функции Компонента Расписания Используют tnext Параметр.

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

ПараметрИспытательный стендКомпонент
iportВывод
Структура, которая обеспечивает (депозитом) значения на сигналы, соединенные с входными портами связанного модуля HDL.
Входной параметр
Структура, которая получает значения сигналов от входных портов, заданных для связанного модуля HDL, в то время, когда задано tnow.
tnextВыведите, дополнительный
Задает время, в которое симулятор HDL планирует следующий коллбэк к MATLAB. tnext должен быть инициализирован к пустому значению ([]). Если tnext позже не обновляется, никакие новые записи не добавляются к расписанию симуляции.
Выведите, дополнительный
То же самое как испытательный стенд.
oportВходной параметр
Структура, которая получает значения сигналов от выходных портов, заданных для связанного модуля HDL, в то время, когда задано tnow.
Вывод
Структура, которая обеспечивает (депозитом) значения на сигналы, соединенные с выходными портами связанного модуля HDL.
tnowВходной параметр
Получает время симуляции, в котором называется функция MATLAB. По умолчанию время представлено в секундах. Для получения дополнительной информации смотрите, что Функции Компонента Расписания Используют tnext Параметр.
То же самое как испытательный стенд.
portinfoВходной параметр
Для первого вызова функции только (в начале симуляции), portinfo получает структуру, поля которой описывают порты, заданные для связанного модуля HDL. Для каждого порта структура portinfo передает информацию, такую как тип порта, направление и размер.
То же самое как испытательный стенд.

Если вы используете matlabcp, инициализируете функциональные выходные параметры к пустым значениям в начале функции как в следующем примере:

tnext = [];
oport = struct();

Примечание

Когда вы импортируете сигналы VHDL, имена сигнала в iport, oport, и portinfo возвращен во всех прописных буквах.

Можно использовать информацию порта, чтобы создать типичную функцию MATLAB, которая действует по-другому в зависимости от информации порта, предоставленной при запуске. Для получения дополнительной информации о данных порта смотрите Получающий доступ к и Применение Информации порта.

Пример функции Oscfilter

Следующий код дает определение функции компонента oscfilter MATLAB.

function [oport,tnext] = oscfilter(iport, tnow, portinfo)

Имя функции oscfilter, отличается от имени сущности u_osc_filter. Поэтому имя функции компонента должно быть передано в явным образом команде matlabcp, которая соединяет функцию со связанным экземпляром HDL с помощью параметра -mfunc.

Функциональное определение задает все необходимые параметры ввода и вывода, как перечислено здесь:

oportСилы (депозитом) значения на сигналы, соединенные с выходными портами сущности, filter1x_out, filter4x_out и filter8x_out.
tnextЗадает временную стоимость, которая указывает, когда симулятор HDL выполнит следующий коллбэк к функции MATLAB.
iportПолучает значения сигналов HDL от входного порта сущности, osc_in.
tnowПолучает текущее время симуляции.
portinfoДля первого вызова функции, получает структуру, которая описывает порты, заданные для сущности.

Следующие данные показывают отношение между портами сущности HDL и iport функции MATLAB, и параметры oport (показанный пример для использования с ModelSim®).

Получение доступа к и применения информации порта

Программное обеспечение HDL Verifier передает информацию о сущности или модуле под тестом в структуре portinfo. Структура portinfo передается в качестве третьего аргумента функции. Это передается только в первом вызове вашей функции ModelSim. Можно использовать информацию, переданную в структуре portinfo, чтобы подтвердить сущность или модуль при симуляции. Три поля предоставляют информацию, как обозначено в следующей выборке.. Содержимое этих полей зависит от типа портов, заданных для модуля сущности или Verilog VHDL.

portinfo.field1.field2.field3

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

Информация порта HDL

Поле ...Может содержать...Который...И применяется...
field1inУказывает, что порт является входным портомВсе типы порта
outУказывает, что порт является выходным портомВсе типы порта
inoutУказывает, что порт является двунаправленным портом Все типы порта
tscaleУказывает на предел разрешения средства моделирования в секундах, как задано в симуляторе HDLВсе типы
field2portnameИмя портаВсе типы порта
field3type

Идентифицирует тип порта

Для VHDL: integer, real, time или enum

Поскольку Verilog: 'verilog_logic' идентифицирует типы порта reg, wire, integer

Все типы порта

right (только VHDL)

VHDL атрибут RIGHT

VHDL integer, natural или типы порта positive

left (только VHDL)

VHDL атрибут LEFT

VHDL integer, natural или типы порта positive

 size

VHDL: размер матрицы, содержащей данные

Verilog: размер битового вектора, содержащего данные

Все типы порта
label

VHDL: символьный литерал или метка

Verilog: вектор символов '01ZX'

VHDL: Перечислимые типы, включая предварительно определенные типы BIT, STD_LOGIC, STD_ULOGIC, BIT_VECTOR и STD_LOGIC_VECTOR

Verilog: Все типы порта

Первый вызов функции ModelSim имеет три аргумента включая структуру portinfo. Проверка количества аргументов является одним способом, которым можно проверить, что portinfo был передан. Например:

if(nargin ==3)
 tscale  = portinfo.tscale;
end