所以我在Verilog中创建了一个大型FIR滤波器,它有256个抽头。所以我需要256个系数。我想尝试使我的代码尽可能模块化,所以我想知道是否有办法为FIR模块创建另一个包含系数值的外部文件?目前我唯一知道在Verilog中为数组赋值如下:
reg [15:0] datafile [8];
initial
begin
datafile[0] = 32768;
datafile[1] = 37045;
datafile[2] = 41248;
datafile[3] = 45307;
datafile[4] = 49151;
datafile[5] = 52715;
datafile[6] = 55938;
datafile[7] = 58764;
end
但是当您有256个值要分配时,这是一个非常漫长的过程,手动组织代码,即使使用查找/替换,您也只能这么做。我想要的是能够像在System Verilog中那样为数组赋值:
reg [15:0] datafile [8] = '{8468,56472,56874,358,2564,8498,4513,9821};
我不想使用System Verilog,因为它没有被广泛使用。有人可以帮忙吗?
答案 0 :(得分:0)
如果值(系数)保存在外部文件中(例如'file.txt'),则可以使用模拟中的系统函数($fscanf
)从文件中读取值并将其打开datafile
(datafile
是一个数组)。
在下面的代码中我假设你有256个值保存在外部文件('file.txt')中,我试图从'file.txt'中读取256次值并将它们写在{{1 }}:
datafile
正如工具所说,系统功能不可综合。这是为了模拟。如果你想编写一个可综合的代码,我建议采用以下方式:
module b(clk,reset);
input clk;
input reset;
integer fileH; // file handler
reg [15:0] datafile [0:255];
reg [7:0] counter;
initial begin
fileH = $fopen ("file.txt", "r");
end
always @(posedge clk or posedge reset) begin
if (reset)
counter <= 0;
else begin
$fscanf (fileH, "%d\n", datafile[counter]);
counter <= counter + 1;
end
end
endmodule