我想编写一个使用一些从文件中加载的系数的模块。
例如:
reg [3:0] coeffs[0:1];
reg [6:0] ans;
always @(posedge clk) begin
if (!reset) begin
coeffs[0] <= 3;
coeffs[1] <= 2;
ans <= 0;
end
else begin
ans <= coeffs[0] * coeffs[1];
end
end
我想用可以在文件中修改的值替换值3和2,并在合成期间提供文件。 显然,该文件只会将初始值分配给寄存器。 我不希望它成为块公羊,我希望它像独立寄存器一样。
请澄清一下,我需要该解决方案非常通用,因为我打算在许多做相同事情但系数不同的模块中使用它。
最后,我希望有一个通用模块,该模块接收一个文件名作为参数,该文件名存储系数,系数的数量及其宽度,并使用这些参数生成代码。
我已经尝试过readmemh
,但我知道只能通过合成来启动内存。
有什么建议吗? 谢谢。
答案 0 :(得分:0)
这是一个建议:将初始化数组coeffs
的语句放在包含文件中,例如
coeffs.v:
coeffs[0] <= 3;
coeffs[1] <= 2;
代码:
reg [3:0] coeffs[0:1];
reg [6:0] ans;
always @(posedge clk) begin
if (!reset) begin
`include "coeffs.v"
ans <= 0;
end
else begin
ans <= coeffs[0] * coeffs[1];
end
end
在编译时会包含一个include文件。因此,您的合成器会将文件内容插入设计中的正确位置。然后,您可以使用操作系统来管理文件。
答案 1 :(得分:0)
我很乐意接受纠正,但是除了“ Trickery”(包括文件,定义文件,运行在合成之前生成此类脚本的脚本)之外,我不知道可以从文件中加载纯数字进行合成的任何方法。
我承认这是一个等待解决方案的问题。
如果只是为了防止当芯片从制造商处退货时出现严重的尴尬,并且您发现boot-rom完全是空的...。好像我在工作的地方发生过(滚动)。单个(接触)层更改,但较低层的遮罩最昂贵)。
答案 2 :(得分:0)
使用参数传递初始值是更好的选择。
module A
#( parameter INITIAL_VALUE_COEFFS_0 = 3,
parameter INITIAL_VALUE_COEFFS_1 = 2)
( /* ignore it */ );
reg [3:0] coeffs[0:1];
reg [6:0] ans;
always @(posedge clk) begin
if (!reset) begin
coeffs[0] <= INITIAL_VALUE_COEFFS_0;
coeffs[1] <= INITIAL_VALUE_COEFFS_1;
ans <= 0;
end
else begin
ans <= coeffs[0] * coeffs[1];
end
end
endmodule