SoC 설계/Verilog, SystemVerilog

SystemVerilog: Arrays

yztech 2023. 3. 10. 08:21
반응형

SystemVerilog는 다양한 유형의 array를 제공하여, 복잡한 데이터 구조를 구축하는데 많은 유연성을 제공한다.

  • Static arrays
  • Dynamic arrays
  • Associative arrays
  • Queues

1. Static Arrays

정정 배열은 컴파일하기 전에 크기가 알려진 배열이다. 아래 예제에서는 8 bit 정적 배열이 선언되고 일부 값이 할당되고 반복되면서 해당값을 출력한다.

// (a)
module tb;
    bit [7:0] m_data;

    initial begin
        m_data = 8'h5a;

        for(int i=0; i<$size(m_data); i++) begin
            $display("m_data[%0d] = %h",i,m_data[i]);
        end
    end
endmodule

정적 배열은 packed array와 unpacked array로 더 분류된다.

// (b)
bit [2:0][7:0] m_data1; // Packed
bit [15:0] m_data2 [10:0]; // Unpacked

1.1. Packed Arrays

packed array는 변수 이름앞에 dimension이 선언된 배열을 의미한다.

packed array는 연속적인 비트들의 집합으로 표현되도록 보장한다.

이들은 bit, logic과 같이 단일 비트를 가진 데이터형들로만 구성되고, 재귀적으로 packed array가 될 수 있다.

1.1.1. 1 Dimensional Packed Array

1차원 압축 배열은 보통 vector라고 불린다.

// (c)
module tb;
    bit [7:0] m_data;

    initial begin
        m_data = 8'h82;

        for(int i=0; i<$size(m_data); i++) begin
            $display("m_data[%0d] = %h",i,m_data[i]);
        end
    end
endmodule

결과

m_data[0] = 0
m_data[1] = 1
m_data[2] = 0
m_data[3] = 0
m_data[4] = 0
m_data[5] = 0
m_data[6] = 0
m_data[7] = 1

1.1.2. N-Dimensional Packed Array

다차원 압축 배열은 여전히 연속된 bit들의 집합이고, 더 작은 segment 그룹으로 분할된다.

예 1

아래 코드는 32 bits 혹은 4 bytes를 갖는 2D packed array를 보여준다. segments단위로 반복되고, 출력될 수 있다.

// (d)
module tb;
    bit [3:0][7:0] m_data; // 4 x 8 = 32 bits = 4 bytes

    initial begin
        m_data = 32'h8282_cafe;

        $display("m_data = %x%0h", m_data);

        for(int i=0; i<$size(m_data); i++) begin
            $display("m_data[%0d] = 0x%0h",i,m_data[i]);
        end
    end
endmodule

결과

m_data = 0x8282cafe

m_data[0] = 0xfe
m_data[1] = 0xca
m_data[2] = 0x82
m_data[3] = 0x82

예2:

다음 3D packed array를 살펴보자

// (e)
module tb;
    bit [2:0][3:0][7:0] m_data; // 2 x 4 x 8 = 96 bits = 12 bytes

    initial begin
        m_data[0] = 32'h8282_cafe;
        m_data[1] = 32'h89ab_cdef;
        m_data[2] = 32'h0123_4567;

        $display("m_data = %x%0h", m_data);

        foreach(m_data[i]) begin
            $display("m_data[%0d] = 0x%0h",i,m_data[i]);
            foreach(m_data[i][j]) begin
                $display("m_data[%0d][%0d] = 0x%0h",i,j,m_data[i][j]);                
            end
        end
    end
endmodule

결과

m_data = 0x0123456789abcdef8282cafe
m_data[2] = 0x01234567
m_data[2][3] = 0x01
m_data[2][2] = 0x23
m_data[2][1] = 0x45
m_data[2][0] = 0x67
m_data[1] = 0x89abcdef
m_data[1][3] = 0x89
m_data[1][2] = 0xab
m_data[1][1] = 0xcd
m_data[1][0] = 0xef
m_data[0] = 0x8282cafe
m_data[0][3] = 0x82
m_data[0][2] = 0x82
m_data[0][1] = 0xca
m_data[0][0] = 0xfe

1.2. Unpacked Arrays

Unpacked array는 변수 이름뒤에 dimension이 선언된 배열을 의미한다.

압축되지 않은 배열은 고정 크기 배열, 동적 배열, 연관 배열, 큐가 될 수 있다.

1.2.1. 1-Dimensional Unpacked Arrays

아래는 압축되지 않은 1차원 배열의 예를 보여준다.

// (f)
module tb;
    byte m_data[4]; // depth = 4, 1 byte variable

    initial begin
        foreach(m_data[i]) begin
            m_data[i] = $dandom;
            $display("m_data[%0d] = 0x%0h",i,m_data[i]);
        end

        $display("m_data = %p", m_data);
endmodule

결과

m_data[0] = 0xfe
m_data[1] = 0xca
m_data[2] = 0x82
m_data[3] = 0x82
m_data = '{'hfe, 'hca, 'h82, 'h82}

1.2.2. Multi-Dimensional Unpacked Arrays

아래는 압축되지 않은 1차원 배열의 예를 보여준다.

// (g)
module tb;
    byte m_data[2][4]; // 2x4, 1 byte variable

    initial begin
        foreach(m_data[i]) begin
            foreach(m_data[i][j]) begin
                m_data[i][j] = $dandom;
                $display("m_data[%0d][%0d] = 0x%0h",i,j,m_data[i]);
            end
        end

        $display("m_data = %p", m_data);
endmodule

결과

m_data[0][0] = 0xfe
m_data[0][1] = 0xca
m_data[0][2] = 0x82
m_data[0][3] = 0x82
m_data[1][0] = 0x01
m_data[1][1] = 0x23
m_data[1][2] = 0x45
m_data[1][3] = 0x67
m_data = '{'hfe, 'hca, 'h82, 'h82, 'h1, 'h23, 'h45, 'h67}

1.2.3. Multi-Dimensional Packed + Unpacked Arrays

아래 예는 다차원의 압축 + 비압축 배열을 보여준다.

// (h)
module tb;
    byte [3:0][7:0] m_data[2][4]; // 2x4

    initial begin
        foreach(m_data[i]) begin
            foreach(m_data[i][j]) begin
                m_data[i][j] = $dandom;
                $display("m_data[%0d][%0d] = 0x%0h",i,j,m_data[i]);
            end
        end

        $display("m_data = %p", m_data);

        $display("m_data[0][0][3] = 0x%0h", m_data[0][0][3]);
endmodule

결과

m_data[0][0] = 0x8282cafe
m_data[0][1] = 0x01234567
m_data[0][2] = 0x89abcdef
m_data[0][3] = 0x12389512
m_data[1][0] = 0x13425012
m_data[1][1] = 0x23452351
m_data[1][2] = 0x24577834
m_data[1][3] = 0x62345578
m_data = '{'{'h8282cafe, 'h01234567, 'h89abcdef, 'h12389512},'{'h13425012, 
'h23452351, 'h24577834, 'h62345578}}
m_data[0][0][3] = 0xca

다차원 배열에서는 이름 앞에 선언된 차원이, 이름 뒤에 오는 차원보다 빠르게 달라진다.

bit [1:3] m_data1 [1:5];
bit       m_data2 [1:5][1:3];
bit [1:3][1:7] m_data3;
bit [1:3][1:7] m_data4[1:5][1:3];

2. Dynamic Arrays

Reserved

3. Associative Arrays

Reserved

4. Queues

Reserved

반응형

'SoC 설계 > Verilog, SystemVerilog' 카테고리의 다른 글

SystemVerilog: Casting  (0) 2023.03.18
SystemVerilog: Parameterized task/functions  (0) 2023.03.18
SystemVerilog: modport  (0) 2023.03.10
SystemVerilog: Testbench  (0) 2023.02.23
SystemVerilog: 소개  (0) 2023.02.22