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 |