正如您所发现的,'image 属性仅针对标量类型声明,而不是数组或记录:通常的方法是在设计开始时创建自己的测试实用程序库,包括to_string
或image
函数包中的函数,并在整个过程中使用它.
将这些库标准化是完全可能的,您可能会发现许多潜在的“测试实用程序”包,但没有一个真正流行到足以成为标准的程度。
话虽如此,您可能会发现以下软件包是一个有用的起点。
它封装了几个自定义数据类型,并对它们进行操作。没有泛型,但由于重载,您可以像使用泛型一样使用包。(你会注意到函数体是不完整的!)扩展它并添加类型在大多数情况下很容易剪切和粘贴;它使主要设计变得混乱。
最好将 declns 类型和(仅限 testbench)函数分离到两个单独的包中;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;