在Verilog中使用常量值初始化可合成2D阵列的方法

Hai*_* Bi 4 arrays verilog initialization constants vhdl

在VHDL中,我可以轻松地做到这一点:

constant    cmdbytes       : bytearray(0 to Total) := (x"05", x"00", x...};
Run Code Online (Sandbox Code Playgroud)

我想要可合成的常量,这样当FPGA启动时,这个数组就有我提供的数据.这些寄存器连接到VCC或接地以表示1或0.然后我可以使用它们来生成波形.另外我想在verilog世界中拥有2D字节数组,这是3D.

Mar*_*rty 8

如果您只是使用数组一次提取一个值,那么使用case语句怎么样?当然,这是一个冗长的方式,但你总是可以编写一个脚本来为你编写RTL.

reg [7:0] value;
reg [7:0] i;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        i <= 8'd0;
    else
        i <= i + 1;
end

always @(*) begin
    case(i) 
        8'h00: value = 8'd0;
        8'h01: value = 8'd34;
        ...
    endcase
endcase
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用initial语句.据我所知,FPGA综合工具允许您以下列方式设置数组的初始值.再一次,写这个的脚本可能是要走的路.

reg [0:35][7:0] my_array;

initial begin
    my_array[0] = 8'd45;
    my_array[1] = 8'd26;
    ...
end
Run Code Online (Sandbox Code Playgroud)

如果您的FGPA综合工具支持某些SystemVerilog,您将能够像这样初始化数组:

reg [0:34][7:0] my_array = '{ 8'd90, 8'd34, ... }; // note the '{
Run Code Online (Sandbox Code Playgroud)