我目前正在尝试实现一个由 N 个抽头组成的冷杉滤波器。我已经编写了单次点击的代码,并希望在顶部模块中生成 N 个单次点击。
module fir #(
parameter DataWidthBits = 32,
parameter N = 3
)(
....
);
genvar gen_i;
generate
for (gen_i=0; gen_i<N; gen_i=(gen_i+1)) begin : single_taps
fir_one_tap #(DataWidthBits, filter_coeffs[i]) fir_one_tap_inst (i_clk, i_resetn, r_sample_delay[gen_i], r_adder[gen_i]);
end
endgenerate
每个抽头都可以使用 DataWidth 和来自 filter_coeffs 的系数进行参数化。我的想法是从由十六进制值组成的 .csv 文件中读取这些值,如下所示
0, 1, A
这就是我尝试读取文件并将十六进制值保存到本地参数数组的方法
localparam [DataWidthBits-1:0] filter_coeffs [FilterTaps-1:0];
initial begin
integer coeff_file, scan_ret;
coeff_file = $fopen("coeffs_hex.csv", "r");
while (i < FilterTaps) begin
scan_ret = $fscanf(coeff_file, "%h", filter_coeffs[i]);
end
$fclose(coeff_file);
end
在 linting 时,我收到以下错误:
Parameter without initial value is never given value (IEEE 1800-2017 6.20.1): 'filter_coeffs'
: ... note: In instance 'fir_wbs.fir'
57 | localparam [DataWidthBits-1:0] [FilterTaps-1:0] filter_coeffs;
我怀疑我确实将 csv 文件中的值写入了 filter_coeffs 数组,因此给了它们一个值
你的语法不合法。声明时必须为
locapram
分配常量值,例如:
localparam WIDTH = 5;
常量,如
localparam
必须在模拟开始之前分配。这意味着它们不能在程序代码中分配(如 initial
块)。
请参阅 IEEE Std 1800-2017,第 6.20 节 常数。