For loop Verilog代码:使用嵌套for循环初始化2D数组

For loop Verilog代码:使用嵌套for循环初始化2D数组,for-loop,multidimensional-array,verilog,For Loop,Multidimensional Array,Verilog,我最近尝试存储一个2D数组,其元素由8位整数(0~4)组成,首先逐行输入其元素(将其视为1D数组),然后访问1D数组中的值。 我的程序如下: 1.初始化测试台中的2048位1D(8*16*16)阵列(代码中的行1)作为输入 2.每8位剪切一次一维数组,并将8位编号分配给二维数组中的元素 3.使用另一个1D数组(代码中的第2行)观察最终结果,因为数组不能用作实例输出 实际上,我正在将一个包含256个8位元素的一维数组转换为一个包含16*16个8位元素的二维数组 问题是在运行模拟之后, 似乎2D数组

我最近尝试存储一个2D数组,其元素由8位整数(0~4)组成,首先逐行输入其元素(将其视为1D数组),然后访问1D数组中的值。 我的程序如下:

1.初始化测试台中的2048位1D(8*16*16)阵列(代码中的行1)作为输入

2.每8位剪切一次一维数组,并将8位编号分配给二维数组中的元素

3.使用另一个1D数组(代码中的第2行)观察最终结果,因为数组不能用作实例输出 实际上,我正在将一个包含256个8位元素的一维数组转换为一个包含16*16个8位元素的二维数组

问题是在运行模拟之后, 似乎2D数组中的大多数元素都处于高z状态, 最后一个已正确分配新值。 谁能解释一下发生了什么事,我该怎么解决

为了清楚起见,我将我的verilog代码放在下面:

`timescale 1ns / 1ps
module convPE(
    input clk,
    input reset,
    input [2048:1] Row1,
    output [2048:1] Row2
    );
    wire [7:0] arr[17:0][17:0];

    generate
    genvar i,j;
    for(i=16;i>=1;i=i-1)
    begin:gen1
        for(j=16;j>=1;j=j-1)
        begin:gen2
            assign arr[i][j]=Row1[(8*i*j) -: 8];
            assign Row2[(8*i*j) -: 8]=arr[i][j];

        end
    end
    end generate
endmodule
这是试验台:

`timescale 1ns / 1ps
module testbench;

    // Inputs
    reg [2048:1] Row1;
    reg Clk;
    reg Reset;

    wire [2048:1] Row2;
    convPE uut (
        .clk(Clk),
        .reset(Reset),
        .Row1(Row1),
        .Row2(Row2)
    );

    initial begin
        // Initialize Inputs
        Row1=2048'd0;

        Row1[1784:1777]=8'd1;//1
        Row1[1584:1577]=8'd1;
        Row1[944:937]=8'd1;
        Row1[376:369]=8'd1;
        //2
        Row1[1720:1713]=8'd2;
        Row1[1600:1593]=8'd2;
        Row1[1488:1481]=8'd2;
        Row1[1480:1473]=8'd2;
        Row1[1368:1361]=8'd2;
        Row1[1344:1337]=8'd2;
        Row1[1336:1329]=8'd2;
        Row1[1120:1113]=8'd2;
        Row1[1112:1105]=8'd2;
        Row1[1080:1073]=8'd2;
        Row1[1072:1065]=8'd2;
        Row1[1056:1049]=8'd2;
        Row1[984:977]=8'd2;
        Row1[936:929]=8'd2;
        Row1[856:849]=8'd2;
        Row1[808:801]=8'd2;
        Row1[728:721]=8'd2;
        Row1[680:673]=8'd2;
        Row1[608:601]=8'd2;
        Row1[592:585]=8'd2;
        Row1[584:577]=8'd2;
        Row1[576:569]=8'd2;
        Row1[568:561]=8'd2;
        Row1[560:553]=8'd2;
        Row1[544:537]=8'd2;
        Row1[472:465]=8'd2;
        Row1[424:417]=8'd2;
        Row1[416:409]=8'd2;
        //3
        Row1[1712:1705]=8'd3;
        Row1[1592:1585]=8'd3;
        Row1[1472:1465]=8'd3;
        Row1[1360:1353]=8'd3;
        Row1[1352:1345]=8'd3;
        Row1[1240:1233]=8'd3;
        Row1[1208:1201]=8'd3;
        Row1[1200:1193]=8'd3;
        Row1[1064:1057]=8'd3;
        Row1[992:985]=8'd3;
        Row1[928:921]=8'd3;
        Row1[864:857]=8'd3;
        Row1[736:729]=8'd3;
        Row1[600:593]=8'd3;
        Row1[464:457]=8'd3;
        Row1[456:449]=8'd3;
        Row1[448:441]=8'd3;
        Row1[440:433]=8'd3;
        Row1[432:425]=8'd3;

    //4
        Row1[800:793]=8'd4;
        Row1[672:665]=8'd4;
        Row1[552:545]=8'd4;


        #100
        Reset=1'b1;
        #100
        Reset=1'b0;
        Clk=1'b1;

        // Add stimulus here

    end
   always
    #50 Clk=~Clk;
endmodule
(8*i*j)
不起作用。您有两个嵌套循环,因此第二个循环中的i必须以16的步长递增。(内环的大小)尝试8*(i*16+j)-1

您的代码有些不一致,因为您有时使用0,有时使用1作为最低索引。我建议所有数组和向量都从0开始。[2047:0]这是Verilog约定


我已经使用我使用的Verilog约定转换了您的代码。我还删除了所有多余的信号,如时钟和复位。对于以下代码,
Row2
arr
中都没有X-E或Z-E

`timescale 1ns / 1ps
module convPE(
    input [2047:0] Row1,
    output [2047:0] Row2
    );
    wire [7:0] arr[15:0][15:0];

    generate
    genvar i,j;
    for(i=0; i<16; i=i+1)
    begin:gen1
        for(j=0; j<16; j=j+1)
        begin:gen2
            assign arr[i][j]=Row1[(8*(i*16+j)) +: 8];
            assign Row2[(8*(i*16+j)) +: 8] =arr[i][j];
        end
    end
    endgenerate
endmodule

`timescale 1ns / 1ps
module testbench;
    // Inputs
    reg [2047:0] Row1;
    wire [2047:0] Row2;

    convPE uut (
        .Row1(Row1),
        .Row2(Row2)
    );

    initial begin
        #100; // I want to see X-es first
        // Initialize Inputs
        Row1=2048'd0;
        #100;
        $stop;        
    end
endmodule
`时间刻度为1ns/1ps
模块convPE(
输入[2047:0]行1,
输出[2047:0]行2
);
电线[7:0]arr[15:0][15:0];
生成
genvar i,j;
对于(i=0;iwell,使用8*(i*16+j)-1可能会导致数组索引超出范围。使用[2048:1]作为索引的原因是为了便于以下计算。0和17索引用于零填充,因为它们不会导致胎儿错误,我想我会保留此表达式。顺便说一句,仍然感谢您的建议:)