我正在尝试编写一个 SystemVerilog 测试平台,它从文件加载预先计算的配置参数。
我的问题是SystemVerilog似乎对“常量表达式”相当严格。如果我正确理解 LRM,典型的配置(例如
module
参数化和向量声明中的范围规范)必须是精化时间常数。然而,文件访问之类的事情稍后会在模拟时发生。
我有 VHDL 背景,我的典型工作流程涉及从文件加载测试配置(针对数千个预先计算的测试用例)。我是否错过了一个简单的技巧,或者是否无法在 SystemVerilog 中执行相同的操作?
假设不可能,SystemVerilog 专家会如何做到这一点?我能想到的唯一想法是自动生成包含配置数据(而不是原始数据文件)的 SystemVerilog 包。这样,一切都可以在细化时访问。
然而,这将是一个相当丑陋的黑客行为。我想不出一种巧妙的方法来以编程方式访问数千个不同的测试用例。 (使用文件的一个好处是可以使用简单的字符串操作以编程方式构造文件名)。
这是一个最小的示例,显示从文件读取的参数不能以我想要的某些方式使用。
123
////////////////////////////////////////////////////////////////////////////////
// Module
////////////////////////////////////////////////////////////////////////////////
module my_module #(int PARAM);
endmodule
////////////////////////////////////////////////////////////////////////////////
// Testbench
////////////////////////////////////////////////////////////////////////////////
module tb;
function automatic int read_file(input string filename);
const int fid = $fopen(filename, "r");
var int value;
$fscanf(fid, "%d", value);
$fclose(fid);
return value;
endfunction
// Load a number from a file.
const int PARAM = read_file("example.txt");
// ERROR: Ranges must be bound by constant expressions.
const bit [PARAM-1:0] x = 0;
// ERROR: Parameter expressions must be constant.
my_module #(PARAM) M();
endmodule
您通常会通过工具命令行传递参数。这些是特定于每个模拟器的。例如,类似
-g tb.PARAM=10
.
您将有一个脚本来读取配置文件并将其转换为适当的命令行参数列表。