【发布时间】:2015-06-15 08:56:19
【问题描述】:
我正在尝试构建一个测试平台,使每个测试用例都由一个记录表示,该记录包含测试用例的所有参数,例如输入文件名,用于 DUT 实例化的泛型等。这个想法是只需要更改一项分配即可在不同的测试用例之间切换。
type string_ptr is access string;
type test_case_t is record
input_file : string_ptr;
...
end record;
shared variable test_case_1 : test_case_t := (
input_file => new string'("path to input file 1")
...
);
shared variable TEST_CASE : test_case_t := test_case_1;
dut: my_module
generic map (
file_name => TEST_CASE.input_file.all
);
...
字符串指针用于input_file,因为在记录类型声明中不允许使用无约束数组(在这种情况下,VHDL-2008 之前的版本)。
由于test_case_t 中的字符串指针,我必须为 test_case_1 使用共享变量。
但是,当我尝试在 Xilinx ISE/ISim 14.4 中模拟此测试平台时,模拟器会继续使用通用的默认值,而不是我在测试平台中传递给它的值(我认为这是一个错误)。
我试图解决这个问题
constant INPUT_FILE : string := TEST_CASE.input_file.all;
dut: my_module
generic map (
file_name => INPUT_FILE
);
...
这基本上是使用共享变量的初始值作为常量的初始值。然而,这个赋值会在仿真开始之前使 Xilinx 编译器崩溃(我假设是另一个错误)。
此时我完全不再信任 Xilinx 工具。
我的问题是,是否可以使用共享变量将通用值传递给如上所示的模块(第一个代码 sn-p)?
此外,这种共享变量的使用是否适合测试台?我会为test_case_1 使用常量或信号,但由于在test_case_t 中使用string_ptr 类型,这似乎是不允许的。
【问题讨论】:
-
放弃尝试将泛型映射到变量(或信号)。在运行时,泛型是常量。它们的值在细化时最终确定。只需在测试模块上创建一个输入端口,类型为 test_case_t。
-
澄清一下,我并没有真正将共享变量用作“变量”。我只为它们分配一次初始值。我不明白为什么(共享)变量的初始值不能用于设置常量/泛型,因为变量的初始值在细化时是常量。我本来可以为
test_case使用一个常量,但是常量不能保存访问类型(或者通常是任何具有动态分配的类型),这是由于可变长度字符串应该是test_case的一部分而需要的。因此,第二个 sn-p 中显示了解决方法。 -
然后将它们设为常量。一种方法是创建一个字符串表(字符串数组 - 或者如果您需要可变长度字符串,访问字符串数组)并将索引保存在记录中。
-
这是 VHDL 简化与 Ada 相去甚远的一个领域——Ada 具有区分记录,无缝处理可变长度字符串,无需访问类型。
-
字符串表听起来像是一个可行的解决方案。我会试一试。借助大多数 IDE 提供的大量 VHDL 支持,我通常会尽量避免使用许多间接方式(有时我太努力了)。