Verilog 将文件中的值存储为常量,并将它们用于生成块中的模块实例化

问题描述 投票:0回答:1

我目前正在尝试实现一个由 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 数组,因此给了它们一个值

file module constants verilog
1个回答
0
投票

你的语法不合法。声明时必须为

locapram
分配常量值,例如:

localparam WIDTH = 5;

常量,如

localparam
必须在模拟开始之前分配。这意味着它们不能在程序代码中分配(如
initial
块)。

请参阅 IEEE Std 1800-2017,第 6.20 节 常数

© www.soinside.com 2019 - 2024. All rights reserved.