본문 바로가기

Verilog 에서 포트로 넘길때 2차원 배열이 되지 않는다는 슬픈 진실이 있네 ㅜㅜ

일단 보통 합성할 때 합성툴에서 다 자동으로 해줄 듯 한데 이를 손으로 해야 한다니 일단 방법은 알아두자고

 

https://stackoverflow.com/questions/28623819/how-to-flatten-array-in-verilog

 

How to flatten array in Verilog

As Verilog does not allow to pass the array as input to module, so how can we flatten any array in Verilog. Suppose I have this array: parameter [31:0] A [0:31]; wire [31:0] B I want to pass this...

stackoverflow.com

// 2차원 배열을 1차원 배열로 

wire [32*32-1:0]One_D_array;
integer i;
for (i=0; i<32; i=i+1) assign One_D_array[32*i+31:32*i] = A[i];

// 역으로 변환해서 사용해라

wire [31:0]local_2D_array[0:31];
integer i;
for (i=0;i<32;i=i+1) assign local_2D_array[i] = input[32*i+31:32*i];

 

기본 골격은 위의 코드를 참고하면 된다.

실제 코드에 반영하려면 

generate .. endgenerate 구문을 활용해야 한다.

 

    //port 선언은 1차원 배열로 해둔다.
    output wire [(5*8)-1:0] 1d_array,
    
    // 모듈내에 구현 결과는    
    // 2차원 배열 선언
    reg [7:0] 2d_array[4:0];


	// assign 생성기
    genvar i;
    generate 
    for (i = 0; i < 5; i = i + 1) begin : flat_array
        assign 1d_array[(i*8)+7:(i*8)] = 2d_array[i];
    end
    endgenerate

 

그냥 코드만 있어도 나중에 참고가 된다. 

generate 구문 관련 글은 아래 링크를 참고하세요.

 

https://dreamsailor.tistory.com/25

 

[Verilog 문법] Generate문을 통한 반복 작업 줄이기

엔지니어라면, 누구나 한 번쯤 해봤을 법한 생각이 있다. 입력 spec을 넣어주면 자동으로 H/W를 뱉어주는 마법 같은 시스템 상상 속에서만 존재하는 이야기라고 생각할지도 모르지만, 이를 위한

dreamsailor.tistory.com

 

지금까지 2차원 배열을 1차원 배열로 변환하는 Verilog 코드를 살펴봤다. 도움되겠쥬?

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.