본문 바로가기

SystemVerilog

[SystemVerilog] Packed 와 Unpacked는 무슨 의미일까?

bit [A:B] x;
bit y [A:B];

x가 packed이고, y는 unpacked array라는 사실은 누구나 다 안다.
하지만 packed와 unpacked의 진짜 의미는 무엇일까?

1. Array란?

- 동일한 type 변수들의 collection
- 근데, 변수 이름과 인덱스로 접근 가능한.

Verilog-2001 (표준?)에서는 vector와 array로 구분함.
vector와 array의 차이점이라 하면
vector는 하나의 single unit으로서 한 번에 assign될 수 있고,
array는 element 각각을 procedural statement 에서 하나씩 따로 접근할 수 있다.

<Verilog-2001>

- array element로는 모든 data type이 가능하다.
- vector-width로는 reg, wire와 다른 모든 net type이 선언 될 수 있다.

- object 이름 앞에 선언된 dimension을 "vector-width" dimension이라 한다.
- object 이름 뒤에 선언된 dimension을 "array" dimension이라 한다.

bit [7:0] value [15:0];

[7:0]이 vector dimension이고,
[15:0]이 array size dimension임.

<SystemVerilog>

- 시스템베릴로그에서 packed array란 verilog-2001에서 vector-width라 불렀던 dimension이다.
(dimension declared before the object name)
- 시스템베릴로그에서 unpacked array란 Verilog-2001에서 array dimension이다.
(dimension declared after the object name)

bit [7:0] c1; // packed array
real u [7:0]; // unpacked array


systemverilog unpacked array에서는 한 dimension 사이즈는 계속 커질 수 있다. (outermost 디멘션 하나만! C랑 똑같은 듯)

1) Fixed-Size Unpacked Array
- array의 모든 element 를 위한 fixed storage를 미리 allocate
- multi-dimension 허용

2) Dynamic Array
- storage allocation이 run-time동안 일어난다.
(한 dimension의 size가 계속 늘어난다.)

3) Associative Array
(파이썬에서의 dictionary)
- 각 element가 작성될 때, 이를 위한 storage가 allocate 됨.
- 사용자 정의한 data type을 통해 indexing한다. (파이썬에선 이를 key라 하쥐)

4) Queue Type Array
- run-time에서 array에 쓰이는 elements의 갯수에 따라, que-size가 늘어났다 줄어들었다..

Packed & Unpacked Arrays

packed array란 vector를 subfield로 나눠서 array처럼 편리하게 접근 가능하도록 하는 메커니즘이다.
결과적으로 packed array는 bit들의 연속된 set로서 표현될 수 있다.
무슨 뜻이냐 하면..
(예를 들면)bit 묶음으로 구성된 벡터를 array처럼 편하게 접근 가능하도록 기능 제공한다는 뜻이다.
unpacked array는 아니다. bit들의 연속된 set개념이 아님.

- Packed Array는 Unpacked와 달리
i) Primary ( 무슨 뜻일까나 ... 대충 감은 오는데... 자체로 하나의 데이터 타입이 된다라는 뜻 같음 )
ii) treated as a single vector ( 이건 무슨 말인지 알겠고 )

- Packed Array는 Signed로 선언 될 수 있다.
이 경우 packed array로 표현되는 하나의 벡터가 signed라는 뜻이다.
그렇지만 packed array의 각각(bit, logic등 )은 unsigned다.
packed array의 일부(선택된 bit들)도 unsigned이다.

- Packed Array를 사용하면 임의의 length를 가진 integer type을 만들 수 있다.
예를 들면 48bit로 표현되는 integer도 만들 수 있음.
이런 integer는 48bit 산술 연산에 사용될 수도 있고 얼마나 좋아!
packed array의 maximum size는 216bits 까지!


- Packed Array는 Single Bit Type으로만 구성될 수 있다..
예를 들면 bit, logic, reg, wire, 등 다른 net type들....
또한 Packed Array의 packed array를 만드는 등 recursive하게 사용할 수 있으며,
packed structure 형태로도 사용 가능하다.



- Predefined width를 가진 integer types는 packed array dimension을 declare할 수 없다.
predefined width의 integer type 자체가 사실상 이미 packed array임
byte 는 bit[7:0]과 똑같다.
integer는 logic signed [31:0]과 똑같다.
byte, shortint, int, longint등이 pre-defined width의 integer타입임.
또한 이러한 pre-defined width 타입의 integer들은 right-most index가 0이다. (인덱스의 가장 lowe bound...)



- 또한 systemverilog에선 Array 사이즈로 Single number만 받을 수도 있다. (꼭 range가 아니더라도)
예를 들면, [size]는 [0:size-1]과 같은 표현임

int[8][32] -----> int [0:7][0:31] 같은 표현임

단.. packed dimension은 안됨.
Packed dimension에는 lower bound와 upper bound 둘다 써줘야함

- Array에서 사용 가능한 Operation들... (Packed & Unpacked 둘 다 해당)
A와 B가 same type, same shape의 array 일 때,

1) Reading & Writing the Array.. ex) A=B
B array를 통째로 읽어 A에 통째로 쓴다는 뜻
2) Reading & Writing a slice of the Array.. ex ) A[i:j] = B[i:j]
B array의 slice를 읽어 A array slice에 쓴다.
3) Reading & Writing a variable slice of the Array .. ex) A[x+:c] = B[x+:c]
Variable Slice를 통해서도 read write가 가능하단 뜻
4) Reading & Writing an element of the Array .. ex) A[i]=B[j]
이건 뭐 당연
5) Equality Operation on the array or slice of the Array... ex) A==B, A[i:j]!=B[i:j]
Array를 통째로 비교하거나 Array의 일부(partial slice)를 비교 가능



요약

packed

연속된 1-bit타입의 집합을 표현 한 것.
벡터를 bit 묶음으로 나타냈다고 생각하면 편함.
single unity로 생각하고 한꺼번에 assign가능
예를 들면 static bit [7:0] A = 8'b10011011;

unpacked

그냥 동일 타입 변수들의 나열.
연속된 주소공간을 할당했을 뿐, 하나의 unity가 아님.
각 element에 개별 접근 필요.


무엇보다 packed와 unpacked의 명시적인 차이는
선언시 dimension의 위치에 있다.
variable name보다 먼저 선언되면 packed array dimension
뒤에 선언되면 unpacked array dimension



끝~!