在verilog中加载初始值的综合方法

时间:2018-06-21 15:52:27

标签: file verilog synthesis

我想编写一个使用一些从文件中加载的系数的模块。

例如:

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,但我知道只能通过合成来启动内存。

有什么建议吗? 谢谢。

3 个答案:

答案 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