exponenta event banner

Создание тестового стенда MATLAB

Программное обеспечение HDL Verifier™ обеспечивает средства для проверки модулей HDL в среде MATLAB ®. Для этого необходимо кодировать модель ЛПВП и функцию MATLAB, которые могут совместно использовать данные с моделью ЛПВП. В этой главе рассматриваются соглашения по программированию, интерфейсам и планированию для функций тестового стенда MATLAB, которые взаимодействуют с имитатором HDL.

Функции испытательного стенда MATLAB позволяют проверить производительность модели HDL или компонентов в модели. Функция испытательного стенда включает значения в сигналы, подключенные к входным портам проверяемой конструкции ЛПВП, и принимает значения сигналов от выходных портов модуля.

На следующем рисунке показано, как функция MATLAB охватывает имитатор HDL и взаимодействует с ним во время сеанса моделирования тестового стенда.

При связывании с MATLAB имитатор HDL функционирует как клиент, а MATLAB - как сервер. На следующем рисунке показан сценарий подключения нескольких клиентов к серверу через порт сокета TCP/IP 4449.

Сервер MATLAB может обслуживать несколько одновременных сеансов имитатора HDL и модулей HDL. Однако необходимо следовать рекомендуемым инструкциям, чтобы помочь серверу отслеживать операции ввода-вывода, связанные с каждым модулем и сеансом. сервер MATLAB, который начинается с указанной функции; hdldaemonожидает запросов на подключение от экземпляров имитатора HDL, работающего на одном или разных компьютерах. Когда сервер получает запрос, он выполняет указанную функцию MATLAB, закодированную для выполнения задач от имени модуля в конструкции HDL. Параметры, задаваемые при запуске сервера, указывают, устанавливает ли сервер общую память или каналы связи сокетов TCP/IP.

Допустимые конфигурации машины см. в разделе Конфигурации Cosimulation.

Примечание

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

Выполните следующие действия для создания сеанса тестового стенда MATLAB для косимуляции с помощью имитатора ЛПВП.

Запись модулей HDL для испытательного стенда MATLAB

Кодирование модулей HDL для проверки с помощью MATLAB

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

Выбор имени модуля HDL для использования с испытательным стендом MATLAB

Хотя это и не требуется, при присвоении имени модулю HDL следует выбрать имя, которое также может использоваться в качестве имени функции MATLAB. (Как правило, правила именования для VHDL ® или Verilog ® и MATLAB совместимы.) По умолчанию программное обеспечение HDL Verifier предполагает, что модуль HDL и его функция моделирования имеют одно и то же имя. См. раздел Bind Test Stench Function Calls with matlabtb.

Для получения более подробной информации о правилах присвоения имен функциям MATLAB см. «Советы по программированию MATLAB» по файлам и именам файлов в документации MATLAB.

Определение режимов направления порта в модуле HDL для использования с испытательным стендом

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

Использовать режим VHDL...Использовать режим Verilog...Для портов, которые...
INinputПредставляют сигналы, которые могут управляться функцией MATLAB
OUToutputПредставление значений сигналов, передаваемых функции MATLAB
INOUTinoutПредставление двунаправленных сигналов, которые могут управляться или передаваться в функцию MATLAB

Определение типов данных портов в модулях HDL для использования с испытательным стендом

В этом разделе описывается, как указать типы данных, совместимые с MATLAB, для портов в модулях HDL. Дополнительные сведения о том, как интерфейс HDL Verifier преобразует типы данных для среды MATLAB, см. в разделе Поддерживаемые типы данных.

Примечание

При использовании неподдерживаемых типов программное обеспечение HDL Verifier выдает предупреждение и игнорирует порт во время выполнения. Например, при определении интерфейса с пятью портами, один из которых является портом доступа VHDL, во время выполнения интерфейс отображает предупреждение, а код видит только четыре порта.

Типы данных портов для объектов VHDL.  В инструкции сущности необходимо определить каждый порт, который планируется протестировать с помощью MATLAB с типом данных VHDL, поддерживаемым программным обеспечением HDL Verifier. Интерфейс может преобразовывать скалярные и массивные данные следующих типов VHDL в сопоставимые типы MATLAB:

  • STD_LOGIC, STD_ULOGIC, BIT, STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, и BIT_VECTOR

  • INTEGER и NATURAL

  • REAL

  • TIME

  • Перечислимые типы, включая пользовательские перечислимые типы и CHARACTER

Интерфейс также поддерживает все подтипы и массивы предшествующих типов.

Примечание

Программное обеспечение HDL Verifier не поддерживает расширенные идентификаторы VHDL для следующих компонентов:

  • Имена портов и сигналов, используемые при косимуляции

  • Перечисляемые литералы при использовании в качестве индексов массива имен портов и сигналов, используемых при косимуляции

Однако программное обеспечение поддерживает базовые идентификаторы для VHDL.

Типы данных портов для модулей Verilog.  В определении модуля необходимо определить каждый порт, который планируется протестировать с помощью MATLAB, с типом данных порта Verilog, поддерживаемым программным обеспечением HDL Verifier. Интерфейс может преобразовывать данные следующих типов портов Verilog в сопоставимые типы MATLAB:

  • reg

  • целое число

  • провод

Примечание

Программное обеспечение HDL Verifier не поддерживает идентификаторы выхода Verilog для имен портов и сигналов, используемых при косимуляции. Однако он поддерживает простые идентификаторы для Verilog.

Компиляция и разработка проекта ЛПВП для использования на испытательном стенде

После создания или редактирования исходных файлов HDL компилятор симулятора HDL используется для компиляции и отладки кода.

 Компиляция для ModelSim

 Компиляция для резцового

Дополнительные примеры см. в учебных пособиях и демонстрациях программы HDL Verifier. Дополнительные сведения об использовании компилятора HDL см. в документации симулятора.

Образец определения объекта VHDL

Этот образец фрагмента кода VHDL определяет объект decoder. По умолчанию объект связан с функцией тестового стенда MATLAB decoder.

Ключевое слово PORT отмечает начало предложения порта сущности, которое определяет два IN порты -isum и qsum- и триOUT порты -adj, dvalid, и odata. Выходные порты подают сигналы на входные порты функции MATLAB для обработки. Входные порты принимают сигналы от выходных портов функции MATLAB.

Оба входных порта определяются как векторы, состоящие из пяти стандартных логических значений. Выходной порт adj также определяется как стандартный логический вектор, но состоит только из двух значений. Выходные порты dvalid и odata определяются как скалярные стандартные логические порты. Сведения о том, как интерфейс HDL Verifier преобразует данные стандартных типов логических скаляров и массивов для использования в среде MATLAB, см. в разделе Поддерживаемые типы данных.

ENTITY decoder IS
PORT (
  isum   : IN std_logic_vector(4 DOWNTO 0);
  qsum   : IN std_logic_vector(4 DOWNTO 0);
  adj    : OUT std_logic_vector(1 DOWNTO 0);
  dvalid : OUT std_logic;
  odata  : OUT std_logic);
END decoder ;

Запись функции тестового стенда

Кодирование функций косимуляции MATLAB

Кодирование функции MATLAB для проверки модуля или компонента HDL требует соблюдения определенных правил кодирования. Необходимо также понимать происходящие преобразования типов данных и преобразования типов данных программы для работы с данными и возврата данных в имитатор HDL.

Для кодирования функции MATLAB для проверки модуля или компонента HDL выполните следующие шаги:

  1. Изучите синтаксис функции тестового стенда MATLAB HDL Verifier. См. раздел Синтаксис функции тестового стенда.

  2. Узнайте, как программное обеспечение HDL Verifier преобразует данные из имитатора HDL для использования в среде MATLAB. См. раздел Поддерживаемые типы данных.

  3. Выберите имя для функции MATLAB. См. раздел Привязка компонента модуля HDL к функции испытательного стенда MATLAB.

  4. Определите ожидаемые параметры в строке определения функции. См. раздел Синтаксис функции MATLAB и определения аргументов функции.

  5. Определите типы данных порта, передаваемых в функцию. См. раздел Синтаксис функции MATLAB и определения аргументов функции.

  6. Извлеките и, если применимо к моделированию, примените информацию, полученную в portinfo структура. См. раздел Получение доступа к информации о портах и ее применение.

  7. При необходимости преобразуйте данные для манипулирования в среде MATLAB. См. раздел Преобразование данных HDL для отправки в MATLAB.

  8. Преобразуйте данные, которые необходимо вернуть в имитатор ЛПВП. См. раздел Преобразование данных для возврата в имитатор ЛПВП.

Дополнительные советы см. в разделе Запись функций тестового стенда и компонентов.

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

Синтаксис функции тестового стенда MATLAB:

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

Описание каждого из аргументов функции см. в разделах Синтаксис функции MATLAB и Определения аргументов функции.

Образец функции испытательного стенда MATLAB

В этом разделе используется образец функции MATLAB для идентификации секций функции тестового стенда MATLAB, требуемой программным обеспечением HDL Verifier. Полный текст кода, используемого в этом примере, приведен в разделе Пример функции MATLAB Builder EX: manchester_decoder.m.

Для пользователей ModelSim

В этом примере используется объект VHDL и код функции MATLAB Builder™ EX, извлеченный из части декодера примера манчестерского приемника. Полный список кодов VHDL и функций см. в следующих файлах:

matlabroot\toolbox\edalink\extensions\modelsim\modelsimdemos\vhdl\manchester\decoder.vhd
matlabroot\toolbox\edalink\extensions\modelsim\modelsimdemos\manchester_decoder.m

В качестве первого шага к кодированию тестовой функции MATLAB Builder EX необходимо понять, как данные, смоделированные в объекте VHDL, сопоставляются с данными в среде MATLAB Builder EX. Объект VHDL decoder определяется следующим образом:

ENTITY decoder IS
PORT (
  isum   : IN std_logic_vector(4 DOWNTO 0);
  qsum   : IN std_logic_vector(4 DOWNTO 0); 
  adj    : OUT std_logic_vector(1 DOWNTO 0);
  dvalid : OUT std_logic;
  odata  : OUT std_logic
  );
END decoder ;

Следующее обсуждение выделяет ключевые строки кода в определении manchester_decoder Функция MATLAB Builder EX:

  1. Укажите имя функции MATLAB и требуемые параметры.

    Следующий код является объявлением функции manchester_decoder Функция MATLAB Builder EX.

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

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

    Объявление функции выполняет следующие действия:

    • Называет функцию. Это объявление называет функцию manchester_decoder, который отличается от имени объекта decoder. Поскольку имена различаются, имя функции должно быть явно указано позже, когда объект инициализирован для проверки с помощью matlabtb или matlabtbeval функция. См. раздел Привязка компонента модуля HDL к функции испытательного стенда MATLAB.

    • Определяет требуемый аргумент и возвращаемые параметры. Функция тестового стенда MATLAB Builder EX должна возвращать два параметра, iport и tnextи передайте три аргумента, oport, tnow, и portinfo, и должен отображаться в указанном порядке. См. раздел Синтаксис функции MATLAB и определения аргументов функции.

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

      tnext = [];
      iport = struct();
      

      Необходимо инициализировать выходные данные функции в начале функции, чтобы следовать рекомендуемым рекомендациям.

      На следующем рисунке показана взаимосвязь между портами объекта и функцией MATLAB Builder EX. iport и oport параметры.

      Дополнительные сведения о необходимых параметрах тестовой функции MATLAB Builder EX см. в разделе Синтаксис функции MATLAB и определения аргументов функции.

  2. Обратите внимание на типы данных портов, определенных для моделируемого объекта.

    Программное обеспечение HDL Verifier преобразует типы данных HDL в сопоставимые типы данных MATLAB Builder EX и наоборот. При разработке функции MATLAB Builder EX необходимо знать типы данных, которые она получает от имитатора ЛПВП и должна вернуться к имитатору ЛПВП.

    Объект VHDL, определенный для этого примера, состоит из следующих портов:

    Примеры определений портов VHDL

    Порт Направление Введите...Преобразует в/Требует преобразования в...
    isumINSTD_LOGIC_VECTOR(4 DOWNTO 0)5-битный столбец или вектор строк символов, где каждый бит соответствует стандартному логическому символьному литералу.
    qsumINSTD_LOGIC_VECTOR(4 DOWNTO 0)5-битный столбец или вектор строк символов, где каждый бит соответствует стандартному логическому символьному литералу.
    adjOUTSTD_LOGIC_VECTOR(1 DOWNTO 0)Двухэлементный вектор-столбец из символов. Каждый символ соответствует соответствующему символьному литералу, который представляет логическое состояние и соответствует одному биту.
    dvalidOUTSTD_LOGICСимвол, соответствующий литералу символа, представляющему логическое состояние.
    odataOUTSTD_LOGICСимвол, соответствующий литералу символа, представляющему логическое состояние.

    Дополнительные сведения о преобразованиях типов данных интерфейса см. в разделе Поддерживаемые типы данных.

  3. Установите все требуемые параметры синхронизации.

    tnext оператор назначения устанавливает параметр синхронизации tnext так, что симулятор вызывает функцию MATLAB Builder EX каждую наносекунду.

    tnext = tnow+1e-9;
  4. Преобразование данных выходного порта в типы данных MATLAB для обработки.

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

    %% Compute one row and plot
    isum = isum + 1;
    adj(isum) = mvl2dec(oport.adj');
    data(isum) = mvl2dec([oport.dvalid oport.odata]);
    .
    .
    .
    

    Два вызова mvl2dec преобразовать двоичные данные, которые функция MATLAB Builder EX получает от выходных портов объекта, adj, dvalid, и odata для неподписанных десятичных значений, которые может вычислить MATLAB Builder EX. Функция преобразует 2-битный транспонированный вектор oport.adj до десятичного значения в диапазоне от 0 до 4 и oport.dvalid и oport.odata к десятичному значению 0 или 1.

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

  5. Преобразование данных, возвращаемых в имитатор ЛПВП.

    Следующий фрагмент кода иллюстрирует преобразование типа данных, возвращаемых в имитатор ЛПВП.

     if isum == 17
       iport.isum = dec2mvl(isum,5);
       iport.qsum = dec2mvl(qsum,5);    
    else
       iport.isum = dec2mvl(isum,5);
    end
    

    Три вызова dec2mvl преобразовать десятичные значения, вычисленные MATLAB Builder EX, в двоичные данные, которые функция MATLAB Builder EX может поместить во входные порты объекта, isum и qsum. В каждом случае функция преобразует десятичное значение в 5-элементный битовый вектор, причем каждый бит представляет символ, который отображается в символьный литерал, представляющий логическое состояние.

    Функция «Преобразование данных для возврата в имитатор ЛПВП» предоставляет сводку типов преобразований данных, учитываемых при возврате данных в имитатор ЛПВП.

Пример функции MATLAB Builder EX: manchester_decoder.m

function [iport,tnext] = manchester_decoder(oport,tnow,portinfo)
% MANCHESTER_DECODER  Test bench for VHDL 'decoder'
%  [IPORT,TNEXT]=MANCHESTER_DECODER(OPORT,TNOW,PORTINFO) -
%    Implements a test of the VHDL decoder entity which is part
%    of the Manchester receiver demo.  This test bench plots
%    the IQ mapping produced by the decoder.
%
%      iport              oport
%            +-----------+
% isum -(5)->|           |-(2)-> adj
% qsum -(5)->| decoder   |-(1)-> dvalid
%            |           |-(1)-> odata
%            +-----------+
%
%   isum - Inphase Convolution value
%   qsum - Quadrature Convolution value
%   adj  - Clock adjustment ('01','00','10')
%   dvalid - Data validity ('1' = data is valid)
%   odata - Recovered data stream
%
% Adjust = 0 (00b), generate full 16 cycle waveform

%   Copyright 2003-2009 The MathWorks, Inc.

persistent isum;
persistent qsum;
%persistent ga;
persistent x;
persistent y;
persistent adj;
persistent data;
global testisdone;
% This useful feature allows you to manually
% reset the plot by simply typing: >manchester_decoder
tnext = [];
iport = struct();

if nargin == 0,
    isum = [];
    return;
end

if exist('portinfo') == 1
    isum = [];
end

tnext = tnow+1e-9;
if isempty(isum),  %% First call
    scale = 9;
    isum = 0;
    qsum = 0;
    for k=1:2,
        ga(k) = subplot(2,1,k);
        axis([-1 17 -1 17]);
        ylabel('Quadrature');
        line([0 16],[8 8],'Color','r','LineStyle',':','LineWidth',1)
        line([8 8],[0 16],'Color','r','LineStyle',':','LineWidth',1)
    end
    xlabel('Inphase');
    subplot(2,1,1);
    title('Clock Adjustment (adj)');
    subplot(2,1,2);
    title('Data with Validity');
    iport.isum = '00000';
    iport.qsum = '00000';
    return;
end

% compute one row, then plot
isum = isum + 1;
adj(isum) = bin2dec(oport.adj');
data(isum) = bin2dec([oport.dvalid oport.odata]);

if isum == 17,
    subplot(2,1,1);
    for k=0:16,
        if adj(k+1) == 0,  % Bang on!
            line(k,qsum,'color','k','Marker','o');
        elseif adj(k+1) == 1,  %
            line(k,qsum,'color','r','Marker','<');
        else
            line(k,qsum,'color','b','Marker','>');
        end
    end
    subplot(2,1,2);
    for k=0:16,
        if data(k+1) < 2,  % Invalid
            line(k,qsum,'color','r','Marker','X');
        else
            if data(k+1) == 2,  %Valid and 0!
                line(k,qsum,'color','g','Marker','o');
            else
                line(k,qsum,'color','k','Marker','.');
            end
        end
    end

    isum = 0;
    qsum = qsum + 1;
    if qsum == 17,
        qsum = 0;
        disp('done');
        tnext = [];  % suspend callbacks
        testisdone = 1;
        return;
    end
    iport.isum = dec2bin(isum,5);
    iport.qsum = dec2bin(qsum,5);
else
    iport.isum = dec2bin(isum,5);
end



Связанные темы