Как вы обнаружили, возвращается атрибут изображения объявляется только для скалярных типов, а не массивы или записи: обычный подход заключается в создании собственной библиотеки тестовых утилит, включая to_string
или image
функций в пакет в начать дизайн и использовать его повсюду.
Было бы вполне возможно стандартизировать библиотеку из них, и вы, вероятно, найдете много потенциальных пакетов «тестовой утилиты», но ни один из них не поймал достаточно хорошо, чтобы заслужить стандартное.
При этом вы можете найти следующий пакет полезной отправной точкой.
Он инкапсулирует несколько пользовательских типов данных с операциями над ними. Нет дженериков, но благодаря перегрузке вы можете использовать пакет, как если бы его функции были универсальными. (Вы заметите, что тела функций неполны, хотя!) Расширение и добавление типов легко разрезано & паста по большей части; и он держит много загромождения из основного дизайна.
Может быть лучше выделить тип declns и функции (testbench only) в два отдельных пакета; Types
и Types_Test_Utils
. Затем Типы используются во всем дизайне, в то время как тестовые утилиты доступны только на тестовом стенде.
library IEEE;
use IEEE.numeric_std.all;
package Types is
subtype SmallNum is UNSIGNED(7 DOWNTO 0);
subtype BiggerNum is UNSIGNED(19 DOWNTO 0);
subtype Bits is BIT_VECTOR(7 DOWNTO 0);
-- and operations on these types
-- Simulate generic procedures using overloading
function to_string(N : Unsigned) return String;
function to_string(N : Bits) return String;
procedure eq_checker (name : string; sig,should : SmallNum; at : time);
procedure eq_checker (name : string; sig,should : Bits; at : time);
end Types;
package body Types is
function to_string(N : Unsigned) return String is
variable temp : string(1 to (N'length + 3)/4) := (others => 'x');
begin
-- not finished!
return temp;
end to_string;
function to_string(N : Bits) return String is
begin
return "hello";
end to_string;
procedure eq_checker(name : string; sig,should : SmallNum; at : time) is
begin
if (at = now) then
if sig = should then
report to_string(sig) & "has same value" severity note;
else
report to_string(sig) & "has not same value as " & to_string(should) severity note;
end if;
end if;
end procedure eq_checker;
procedure eq_checker(name : string; sig,should : Bits; at : time) is
begin
null;
end procedure eq_checker;
end Types;
И простой тестер для него ...
use Work.Types.all;
ENTITY tester IS
END tester;
ARCHITECTURE behavior OF tester IS
Signal a,b : SmallNum := X"AA";
Signal c : BiggerNum := X"ABCDE";
SIGNAL x,y : Bits := X"BB";
BEGIN
process(a,x) is
begin
report "value: " & to_string(X) severity note;
report "and this one: " & to_string(a) severity note;
report "this one too: " & to_string(c) severity note;
end process;
END;
+1 для начала использования подтипов ... –
ОП попросил преобразование в строка. Это, с другой стороны, запись/запись. См. Сообщение Брайана для преобразования в строку –
Ну, 'строка' просто определяется как тип доступа к' string'. Таким образом, можно преобразовать это в функцию и вернуть 'li.all'. – PlayDough