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

时间:2018-05-07 21:26:39

标签: for-loop multidimensional-array verilog

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

1.初始化测试平台中的2048位-1D(8 * 16 * 16)数组(代码中的Row1)作为输入

2.每8位剪切1D数组并将8位数分配给2D数组中的元素

3.使用另一个1D数组(代码中的Row2)来观察最终结果,因为数组不能用作实例输出 因此,实际上我将具有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

1 个答案:

答案 0 :(得分:0)

(8*i*j)不起作用。你有两个嵌套循环,所以我在第二个循环中必须以16的步长递增。(内循环的大小)尝试8 *(i * 16 + j)-1

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

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

`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

我使用我的方法的原因是因为它是将某种类型的N维数组映射到存储器(它是线性的)的标准方法,例如, C编译器。

你可以使用2048:1但是你必须更加努力地考虑如何将索引转换为一维数组。可能用i-1,j-1之类的东西替换我公式中的i和j。