Если приложению HDL необходимо отправить данные HDL в функцию MATLAB ®, может потребоваться сначала преобразовать данные в тип, поддерживаемый MATLAB и программным обеспечением HDL Verifier™.
Для программирования функции MATLAB для модели HDL необходимо понимать преобразования типов, требуемые приложением. Также может потребоваться обработка различий между соглашениями по индексированию массивов, используемыми используемым HDL, и MATLAB (см. следующий раздел).
Типы данных аргументов, передаваемых функции, определяют следующее:
Типы преобразований, необходимые для обработки данных
Типы преобразований, необходимые для возврата данных в имитатор ЛПВП
В следующей таблице показано, как программное обеспечение HDL Verifier преобразует поддерживаемые типы данных VHDL ® в типы MATLAB в зависимости от того, является ли тип скалярным или массивным.
Преобразования типов данных VHDL в MATLAB
| Типы VHDL... | При скалярном преобразовании в... | При преобразовании массива в... |
|---|---|---|
STD_LOGIC, STD_ULOGIC, и BIT | Символ, соответствующий литералу символа для требуемого логического состояния. | |
STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, BIT_VECTOR, SIGNED, и UNSIGNED | Вектор столбца символов (как определено в преобразованиях VHDL для имитатора HDL) с одним битом на символ. | |
Массивы STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, BIT_VECTOR, SIGNED, и UNSIGNED | Массив символов (как определено выше) с размером, эквивалентным размеру порта VHDL. | |
INTEGER и NATURAL | Напечатать int32. | Массивы типа int32 с размером, эквивалентным размеру порта VHDL. |
REAL | Напечатать double. | Массивы типа double с размером, эквивалентным размеру порта VHDL. |
TIME | Напечатать double для значений времени в секундах и введите int64 для значений, представляющих временные приращения симулятора (см. описание 'time' опция в hdldaemon). | Массивы типа double или int64 с размером, эквивалентным размеру порта VHDL. |
| Перечислимые типы | Вектор символов или строковый скаляр, содержащий представление MATLAB метки VHDL или литерала символов. Например, метка high преобразует в 'high' и литерал символа 'c' преобразует в '''c'''. | Массив ячеек символьных векторов или строковый массив с каждым элементом, равным метке для определенного перечисляемого типа. Каждый элемент является представлением MATLAB метки VHDL или символьного литерала. Например, вектор (one, '2', three) преобразует в вектор столбца ['one'; '''2'''; 'three']. Определяемый пользователем перечисляемый тип, который содержит только символьные литералы, а затем преобразуется в вектор или массив символов, как указано для типов STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, BIT_VECTOR, SIGNED, и UNSIGNED. |
В следующей таблице показано, как программное обеспечение HDL Verifier преобразует поддерживаемые типы данных Verilog ® в типы MATLAB. Программное обеспечение поддерживает только скалярные типы данных для Verilog.
Преобразования типов данных Verilog в MATLAB
| Типы Verilog... | Преобразует в... |
|---|---|
wire, reg | Символ или вектор столбца символов, соответствующий литералу символа для требуемых логических состояний (битов). |
В следующей таблице показано, как программное обеспечение HDL Verifier преобразует поддерживаемые типы данных SystemVerilog в типы MATLAB. Программное обеспечение поддерживает только скалярные типы данных для SystemVerilog.
Преобразования типов данных SystemVerilog в MATLAB
| Типы SystemVerilog... | Преобразует в... |
|---|---|
wire, reg, logic | Символ или вектор столбца символов, соответствующий литералу символа для требуемых логических состояний (битов). |
integer
| 32-элементный вектор-столбец символов, соответствующий символьному литералу для требуемых логических состояний (битов). |
Примечание
Многомерные массивы reg/wire/logic не поддерживаются.
В HDL имеется возможность определения битового вектора с MSB-0 или LSB-0 нумерацией. В MATLAB битовые векторы всегда рассматриваются LSB-0 нумерации. Для предотвращения повреждения данных рекомендуется использовать индексирование LSB-0 для интерфейсов HDL.
Если логический вектор в ЛПВП определен как:
signal s1 : std_logic_vector(7 downto 0);
Он отображается в int8 в MATLAB с s1 [7] в качестве MSB. Также можно определить логический вектор как:
signal s1 : std_logic_vector(0 to 7);
Он отображается в int8 в MATLAB с s1 [0] в качестве MSB.
В многомерных массивах один и тот же базовый буфер памяти ОС сопоставляется с разными элементами в MATLAB и имитаторе HDL (это отображение отражает только разные способы, предлагаемые различными языками для именования элементов одного и того же массива). При использовании обоих matlabtb и matlabcp будьте внимательны к назначению и интерпретации значений в обоих приложениях.
В HDL многомерный массив объявляется как:
type matrix_2x3x4 is array (0 to 1, 4 downto 2) of std_logic_vector(8 downto 5);
имеет следующий формат памяти:
bit 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 - dim1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 dim2 4 4 4 4 3 3 3 3 2 2 2 2 4 4 4 4 3 3 3 3 2 2 2 2 dim3 8 7 6 5 8 7 6 5 8 7 6 5 8 7 6 5 8 7 6 5 8 7 6 5
Эта же компоновка соответствует следующей матрице MATLAB 4x3x2:
bit 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 - dim1 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 dim2 1 1 1 1 2 2 2 2 3 3 3 3 1 1 1 1 2 2 2 2 3 3 3 3 dim3 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
Следовательно, если H - массив HDL, а M - матрица MATLAB, то следующие индексированные значения одинаковы:
b1 H(0,4,8) = M(1,1,1) b2 H(0,4,7) = M(2,1,1) b3 H(0,4,6) = M(3,1,1) b4 H(0,4,5) = M(4,1,1) b5 H(0,3,8) = M(1,2,1) b6 H(0,3,7) = M(2,2,1) ... b19 H(1,3,6) = M(3,2,2) b20 H(1,3,5) = M(4,2,2) b21 H(1,2,8) = M(1,3,2) b22 H(1,2,7) = M(2,3,2) b23 H(1,2,6) = M(3,3,2) b24 H(1,2,5) = M(4,3,2)
Индексирование можно расширить на N-размеры. В общем случае размеры, пронумерованные слева направо, меняются местами. Самый правый размер в HDL соответствует самому левому размеру в MATLAB.
В зависимости от того, как функция моделирования MATLAB использует данные, полученные от имитатора HDL, может потребоваться кодировать функцию для преобразования данных в другой тип перед их обработкой. В следующей таблице перечислены обстоятельства, при которых потребуется такое преобразование.
Необходимые преобразования данных
| Если вам нужна функция, чтобы... | Тогда... |
|---|---|
Вычислить числовые данные, полученные как тип, отличный от double |
Используйте datas(inc+1) = double(idata); |
| Преобразовать стандартный логический или битовый вектор в целое или положительное десятичное число без знака |
Используйте uval = mvl2dec(oport.val) В этом примере предполагается, что стандартный логический или битовый вектор состоит из символьных литералов. Посмотрите |
| Преобразование стандартной логики или битового вектора в отрицательное десятичное число |
Используйте следующее приложение suval = mvl2dec(oport.val, true); В этом примере предполагается, что стандартный логический или битовый вектор состоит из символьных литералов. |
Следующий фрагмент кода иллюстрирует преобразование типа данных, переданных в обратный вызов:
InDelayLine(1) = InputScale * mvl2dec(iport.osc_in',true);
В этом примере проверяются значения портов типа VHDL STD_LOGIC и STD_LOGIC_VECTOR с помощью all выполнять следующие функции:
all(oport.val == '1' | oport.val == '0')
Этот пример возвращает True если все элементы '1' или '0'.
Если функция моделирования MATLAB должна вернуть данные в имитатор HDL, может потребоваться сначала преобразовать данные в тип, поддерживаемый программным обеспечением HDL Verifier. В следующих таблицах перечислены обстоятельства, при которых такие преобразования требуются для VHDL и Verilog.
Примечание
Когда значения данных возвращаются в имитатор ЛПВП, размер массива символов должен соответствовать типу ЛПВП, включая начальные нули, если применимо. Например:
oport.signal = dec2mvl(2)
будет работать только в том случае, если signal является 2-разрядным типом в HDL. Если тип HDL является чем-либо другим, необходимо указать второй аргумент:
oport.signal = dec2mvl(2, N)
где N - количество битов в типе данных HDL.
Преобразования VHDL для имитатора HDL
| Возврат данных к входящему порту типа... | Тогда... |
|---|---|
STD_LOGIC, STD_ULOGIC, или BIT |
Объявите данные как символ, соответствующий литералу символа для требуемого логического состояния. Для iport.s1 = 'X'; %STD_LOGIC iport.bit = '1'; %BIT |
STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, BIT_VECTOR, SIGNED, или UNSIGNED |
Объявите данные в виде вектора столбца или вектора строки символов (как определено выше) с одним битом на символ. Например: iport.s1v = 'X10ZZ'; %STD_LOGIC_VECTOR iport.bitv = '10100'; %BIT_VECTOR iport.uns = dec2mvl(10,8); %UNSIGNED, 8 bits |
Массив STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, BIT_VECTOR, SIGNED, или UNSIGNED | Объявите данные как массив типа с размером, эквивалентным размеру порта VHDL. См. раздел Различия в индексировании массивов между MATLAB и HDL. |
INTEGER или NATURAL | Объявить данные как массив типа iport.int = int32(1:10)'; |
REAL |
Объявить данные как массив типа iport.dbl = ones(2,2); |
TIME | Объявление VHDL iport.t1 = int64(1:10)'; %Simulator time
%increments
iport.t2 = 1e-9; %1 nsec
|
| Перечислимые типы | Объявите данные в виде вектора символов или скаляра строки для скалярных портов или массива ячеек из векторов символов или массива строк для портов массива с каждым элементом, равным метке для определенного перечисляемого типа. iport.char = {'''A''', '''B'''}; %Character
%literal
iport.udef = 'mylabel'; %User-defined label
|
| Символьный массив для стандартного логического или битового представления |
Используйте oport.slva =dec2mvl([23 99],8)'; |
Преобразования Verilog для имитатора HDL
Возврат данных в input Порт типа... | Тогда... |
|---|---|
reg, wire |
Объявите данные как символ или вектор столбца символов, соответствующий литералу символа для требуемого логического состояния. Например: iport.bit = '1'; |
Преобразования SystemVerilog для имитатора HDL
Возврат данных в input Порт типа... | Тогда... |
|---|---|
reg, wire, logic |
Объявите данные как символ или вектор столбца символов, соответствующий литералу символа для требуемого логического состояния. Например: iport.bit = '1'; |
integer | Объявите данные как 32-элементный вектор столбцов символов (как определено выше) с одним битом на символ. |
Примечание
Многомерные массивы reg/wire/logic не поддерживаются.