Arrays 在Verilog中用常量值初始化可合成2D数组的方法

Arrays 在Verilog中用常量值初始化可合成2D数组的方法,arrays,initialization,constants,vhdl,verilog,Arrays,Initialization,Constants,Vhdl,Verilog,在VHDL中,我可以轻松做到这一点: constant cmdbytes : bytearray(0 to Total) := (x"05", x"00", x...}; 我想要可合成的常数,这样当FPGA启动时,这个数组就有了我提供的数据。这些寄存器连接到VCC或接地以表示1或0。然后我可以用它们来生成波形。此外,我想有二维字节数组,这是在verilog世界的三维 Verilog 2005不允许阵列初始化。虽然您的FPGA供应商应该有办法生成ROM。如果您只是使用阵列一次提

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

constant    cmdbytes       : bytearray(0 to Total) := (x"05", x"00", x...};

我想要可合成的常数,这样当FPGA启动时,这个数组就有了我提供的数据。这些寄存器连接到VCC或接地以表示1或0。然后我可以用它们来生成波形。此外,我想有二维字节数组,这是在verilog世界的三维

Verilog 2005不允许阵列初始化。虽然您的FPGA供应商应该有办法生成ROM。

如果您只是使用阵列一次提取一个值,那么使用
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
如果您的FGPA合成工具支持某些SystemVerilog,您将能够像这样初始化阵列:

reg [0:34][7:0] my_array = '{ 8'd90, 8'd34, ... }; // note the '{

我尝试了上面的系统verilog代码,它在modelsim和Vivado中运行良好。

使用
case
语句方法的替代方法是使用
函数访问值

包含8位常量的大小为4的“数组”示例:

function [7:0] cmdbytes;
        input    [1:0] index;
        reg      [7:0] t[0:3];
    begin
        {   
             t[0],t[1],t[2],t[3]
        } = {   
             8'h05, 8'h00, 8'h5b, 8'h45
        };

        cmdbytes = t[index];
    end
endfunction
您可以这样访问常量:

wire [7:0] value0;
wire [7:0] value1;
wire [7:0] value2;
wire [7:0] value3;

assign value0 = cmdbytes(2'd0);
assign value1 = cmdbytes(2'd1);
assign value2 = cmdbytes(2'd2);
assign value3 = cmdbytes(2'd3);
function [7:0] cmdbytes;
        input    [1:0] index;
        reg      [7:0] t[0:3];
    begin
        {   
             t[0],t[1],t[2],t[3]
        } = {   
             8'h05, 8'h00, 8'h5b, 8'h45
        };

        cmdbytes = t[index];
    end
endfunction
wire [7:0] value0;
wire [7:0] value1;
wire [7:0] value2;
wire [7:0] value3;

assign value0 = cmdbytes(2'd0);
assign value1 = cmdbytes(2'd1);
assign value2 = cmdbytes(2'd2);
assign value3 = cmdbytes(2'd3);