목록SystemVerilog검증/2. Data Type (17)
지노랩 /JinoLab
SystemVerilog는 다양한 새로운 데이터 타입과 구조를 제공하여 고수준의 테스트벤치 설계가 가능하도록 지원한다.이를 통해 비트 수준 표현에 대한 고민 없이 복잡한 검증 환경을 구축할 수 있으며, 유연성과 확장성을 극대화할 수 있다.1. 큐(Queue)와 스코어보드(Scoreboard) 활용테스트벤치에서 큐(Queue)는 데이터 추가 및 삭제가 빈번한 경우 유용하게 사용된다.특히 스코어보드에서 예측(expected) 데이터와 실제(actual) 데이터를 비교하는 구조에서 큐가 효과적으로 활용된다.✅ 큐(Queue) 사용 예시패킷 처리와 같은 순차적인 데이터 관리동적인 데이터 크기 조정이 필요한 환경스코어보드에서 예상 결과와 실제 결과를 비교할 때2. 동적 배열(Dynamic Array)의 유연한 크..
Verilog에서는 네트를 정의하지 않고 사용할 수 있는 암시적 네트(Implicit Nets) 기능을 제공한다.이 기능은 코드를 간결하게 작성할 수 있도록 도와주지만, 네트 이름을 잘못 입력하는 경우 컴파일러가 오류를 발생시키지 않고 새로운 네트를 자동 생성하기 때문에 문제가 발생할 수 있다.2.16.1 암시적 네트의 특징과 문제점Verilog는 별도의 선언 없이 네트 이름을 사용하면 자동으로 wire로 간주한다.이는 네트 이름을 잘못 입력했을 때도 오류가 발생하지 않도록 허용하기 때문에 예상치 못한 동작을 초래할 가능성이 크다.예제: 암시적 네트로 인해 발생할 수 있는 문제module example; assign out_signal = in_signal; // in_signal이 선언되지 않았지만 ..
Verilog에서 예기치 않은 동작이 발생하는 주요 원인 중 하나는 표현식의 비트 너비(Expression Width)이다.SystemVerilog에서는 연산의 피연산자(operand) 크기에 따라 결과 값이 달라질 수 있다.첨부된 내용에서는 1 + 1 연산을 서로 다른 방식으로 수행하는 네 가지 예제를 통해 비트 너비에 따른 결과 차이를 설명하고 있다.2.15.1 비트 너비에 따른 덧셈 연산 예제다음 예제는 1 + 1 연산을 네 가지 방식으로 수행하는 방법을 보여준다.예제 2-40: 표현식의 비트 너비가 컨텍스트에 따라 달라지는 경우bit [7:0] b8; bit one = 1'b1; // 단일 비트 변수$displayb(one + one); // A: 1+1 = 0b8 = one + one; ..
SystemVerilog에서는 string 타입을 제공하여 가변 길이 문자열을 저장할 수 있도록 한다.이는 Verilog에서 reg 변수를 사용하여 문자열을 저장하려던 불편함을 해결해준다.각 문자열의 개별 문자는 byte 타입이며, 문자열의 인덱스는 0부터 시작하여 N-1까지 번호가 매겨진다.C 언어와 달리 SystemVerilog 문자열은 널(null) 문자 \0로 끝나지 않는다.즉, 문자열이 끝날 때 별도의 종료 문자가 포함되지 않으며, \0을 사용해도 무시된다.또한, 문자열은 동적 메모리 할당(dynamic memory allocation)을 사용하므로 고정된 크기로 선언할 필요가 없으며, 공간이 부족할 걱정 없이 사용할 수 있다.2.14.1 문자열 처리 함수SystemVerilog에서는 문자열을 ..
SystemVerilog에서 상수(Constant) 는 여러 가지 방식으로 정의될 수 있다.전통적인 Verilog에서는 텍스트 매크로를 사용하여 상수를 생성했다.텍스트 매크로의 장점은 전역 범위를 가지며 비트 필드 정의나 타입 정의에 활용할 수 있다는 것이다.하지만 단점으로는 매크로가 전역 범위를 가지므로, 지역적인 상수가 필요한 경우 충돌 가능성이 있다는 점과매크로는 '`' (백틱) 기호를 사용해야 하므로 코드 가독성이 떨어질 수 있다는 점이 있다.2.13.1 SystemVerilog에서의 상수 정의 방법SystemVerilog에서는 전통적인 매크로 방식 외에도 상수를 정의할 수 있는 다양한 방법이 존재한다.다음과 같은 방식이 사용될 수 있다.1. $root 레벨의 전역 매개변수(Parameter)Sy..
SystemVerilog에서 열거형(Enum, Enumeration) 타입은 특정한 이름의 상수 집합을 정의하는 데 사용된다.이는 명령어(OpCode), 상태 머신(State Machine) 값 등의 표현에 유용하며, 코드 가독성을 향상시키고 유지보수를 쉽게 만든다.숫자 리터럴을 직접 사용하는 것보다 의미 있는 이름을 부여하여 가독성을 높일 수 있다.2.12.1 열거형 값 정의하기열거형의 기본 값은 0부터 시작하여 1씩 증가한다.사용자는 필요에 따라 특정 값을 직접 지정할 수도 있다.예제 2-31: 단순한 열거형 선언enum {RED, BLUE, GREEN} color;위 코드에서 RED=0, BLUE=1, GREEN=2의 값이 자동으로 할당된다.예제 2-32: 이름이 있는 열거형 타입 선언typedef..
Verilog의 가장 큰 한계 중 하나는 기본적인 데이터 구조의 부족입니다. SystemVerilog에서는 struct 문법을 사용하여 C 언어의 구조체(struct)와 유사한 구조체를 정의할 수 있습니다. 그러나 struct는 제한적인 클래스 형태이므로, 보다 효율적인 코드 작성을 위해 클래스를 사용하는 것이 권장됩니다.Verilog에서 모듈이 신호(data)와 코드(always 블록, initial 블록, 루틴 등)를 함께 포함하는 것처럼, SystemVerilog의 클래스는 데이터와 루틴을 결합하여 디버깅과 재사용이 용이한 엔티티를 생성할 수 있습니다. 그러나 typedef 문법을 활용하면 단순히 데이터를 그룹화할 수 있으며, 코드의 가독성을 높이고 유지보수를 쉽게 만들 수 있습니다.사용자 정의 타..
SystemVerilog에서는 typedef 문을 사용하여 새로운 데이터 타입을 정의할 수 있다.예를 들어, ALU(Arithmetic Logic Unit)가 8비트, 16비트, 24비트, 32비트와 같이 여러 크기의 피연산자를 지원해야 한다면, Verilog에서는 매크로를 사용하여 각 피연산자 크기를 정의해야 했다.2.10.1 Verilog에서 매크로를 사용한 사용자 정의 타입기존 Verilog 스타일에서는 다음과 같이 매크로를 정의하여 데이터를 처리했다.// Old Verilog style`define OPSIZE 8`define OPREG reg [`OPSIZE-1:0]`OPREG op_a, op_b;이 방법은 실제로 새로운 타입을 생성하는 것이 아니라 **텍스트 치환(text substitutio..
SystemVerilog에서는 다양한 저장소 유형을 선택할 수 있으며, 각 유형은 유연성, 메모리 사용량, 속도 및 정렬(sorting)과 같은 요소에 따라 적절하게 사용될 수 있다.2.9.1 유연성 (Flexibility)저장소 유형을 선택할 때 배열의 크기와 접근 방식이 중요한 요소로 작용한다.고정 크기(fixed-size) 배열: 배열의 크기가 컴파일 시간에 결정되며, 연속된 인덱스(0, 1, 2, ...)로 접근한다.동적(dynamic) 배열: 런타임에 크기를 결정할 수 있으며, 패킷과 같은 가변 길이 데이터를 저장하는 데 적합하다.연관(associative) 배열: 랜덤 데이터 값이나 주소와 같이 비연속적인 인덱스를 저장할 때 사용된다.큐(queue): 시뮬레이션 도중 요소의 수가 증가하거나 감..
SystemVerilog는 다양한 배열 연산 메서드를 제공하여 배열 요소를 집계하거나 특정 조건을 만족하는 값을 찾을 수 있도록 한다. 이러한 기능은 검증 환경에서 데이터 조작을 간결하고 효율적으로 수행하는 데 유용하다.2.8.1 배열 축소(reduction) 메서드배열 축소 메서드는 배열의 모든 요소를 하나의 스칼라 값으로 줄이는 역할을 한다. 가장 일반적인 축소 메서드는 sum이며, 배열 내 모든 값을 더한 결과를 반환한다.하지만 SystemVerilog에서는 비트 폭 처리 규칙을 주의해야 한다. 단일 비트 배열을 더할 경우 기본적으로 단일 비트 결과가 나오지만, 이를 32비트 변수에 저장하면 32비트 연산이 수행된다. 예를 들어:bit on[10]; // 10개의 단일 비트 배열int summ;i..
SystemVerilog은 표준 템플릿 라이브러리(STL)의 리스트 컨테이너와 유사한 연결 리스트(Linked List) 자료 구조를 제공한다. 이 컨테이너는 **파라미터화된 클래스(parameterized class)**로 정의되며, 이를 통해 다양한 유형의 데이터를 저장하도록 맞춤 설정할 수 있다.2.7.1 SystemVerilog에서의 연결 리스트 개념연결 리스트는 노드(Node)와 포인터(Pointer)로 이루어진 동적 자료 구조로, 각 노드는 데이터와 다음 노드를 가리키는 포인터를 포함한다. 이를 통해 연속적인 메모리 공간을 필요로 하지 않으며, 삽입과 삭제가 용이하다는 장점이 있다. 하지만 SystemVerilog에서는 이 자료 구조를 적극적으로 사용하는 것이 권장되지 않는다.2.7.2 Sys..
연관 배열(Associative Array)은 SystemVerilog에서 제공하는 데이터 구조 중 하나로, 큰 메모리 공간을 효율적으로 관리할 수 있도록 설계되었다. 연관 배열은 기존의 동적 배열과 비교했을 때, 대용량 데이터를 저장할 필요 없이 필요한 경우에만 메모리를 할당하는 방식으로 동작한다.2.6.1 연관 배열의 개념동적 배열은 실행 중 크기를 변경할 수 있는 유연성을 제공하지만, 시스템에서 실제로 사용할지 여부와 관계없이 특정 크기의 메모리를 미리 할당해야 한다. 그러나, 연관 배열을 사용하면 특정 인덱스에 접근할 때만 메모리가 할당되므로, 수백만 개의 메모리 공간을 가진 모델을 다룰 때도 불필요한 메모리 낭비를 방지할 수 있다.예를 들어, 프로세서를 모델링하는 경우, 실행 중 특정 메모리 위..
1. 개요SystemVerilog는 큐(Queue) 라는 새로운 데이터 타입을 도입하여, 동적 배열과 비슷한 성능을 제공하면서도 고정 크기 배열(Fixed-Size Array)만큼 빠르고, 연결 리스트(Linked List)처럼 유연한 자료 구조를 제공한다.큐는 동적 배열과 유사하게 크기를 조절할 수 있으며, 특정 위치에서 요소를 삽입하거나 삭제하는 기능을 제공한다. 그러나 동적 배열과 달리 new[] 연산자를 사용하여 명시적으로 메모리를 할당할 필요가 없으며, SystemVerilog가 자동으로 크기를 관리한다.이러한 특성 덕분에 검증 환경에서는 데이터를 효율적으로 관리하고 버퍼(buffer) 역할을 수행하는 데 적합하다.2. 큐의 선언 및 기본 연산큐 선언 및 초기화SystemVerilog에서 큐는 ..
1. 개요SystemVerilog에서 배열은 크게 고정 크기 배열(Fixed-Size Array) 과 동적 배열(Dynamic Array) 로 구분된다. 고정 크기 배열은 컴파일 시점에 크기가 결정되며 변경할 수 없는 반면, 동적 배열은 런타임에 크기를 동적으로 할당하고 조정할 수 있다. 이러한 특징은 검증 환경에서 다양한 테스트 시나리오를 수행할 때 유용하게 활용된다.SystemVerilog의 동적 배열은 시뮬레이션 중 배열 크기를 유연하게 조절할 수 있으며, 메모리 사용을 최적화하는 데 도움이 된다. 따라서 테스트 벤치에서 반복적으로 변화하는 데이터 크기를 다룰 때 동적 배열을 사용하는 것이 효과적이다.2. 동적 배열의 선언 및 할당동적 배열 선언동적 배열은 대괄호([]) 를 사용하여 선언하며, 초기..
SystemVerilog에서는 Verilog-1995에서 제공하는 기본적인 고정 크기 배열(fixed-size array) 외에도 다양한 배열 기능을 지원합니다. 이러한 확장 기능을 활용하면 설계와 검증 과정에서 더 높은 효율성과 가독성을 확보할 수 있습니다.2.3.1 고정 크기 배열의 선언 및 초기화SystemVerilog에서 배열을 선언할 때는 반드시 배열의 크기(하한과 상한)를 명시해야 합니다. 대부분의 경우, 배열의 인덱스는 0부터 시작하므로 C 언어처럼 배열 크기만 지정하는 간략한 선언 방식도 가능합니다.고정 크기 배열 선언 예제int lo_hi[0:15]; // 16개 요소를 가지는 배열 (인덱스 범위: 0~15)int c_style[16]; // 16개 요소를 가지는 배열 (인덱스 범위:..
Verilog-1995는 두 가지 기본 데이터 타입을 제공한다.변수(Variable): reg을 사용하여 선언되며, 조합 논리 및 순차 논리를 저장할 수 있다.넷(Net): 설계의 다양한 요소를 연결하는 데 사용되며, 게이트(Gate) 원시 소자 및 모듈 인스턴스를 연결하는 역할을 한다.이러한 데이터 타입은 4-상태(four-state) 값을 가지며, 각각 다음과 같은 의미를 갖는다.0, 1: 일반적인 논리 값Z: 하이 임피던스(High Impedance) 상태X: 알 수 없는 상태(Unknown State)변수는 다음과 같은 다양한 형태로 선언될 수 있다.Unsigned 변수: 단일 또는 멀티비트(reg [7:0] m)Signed 변수: 32비트 정수(integer), 64비트 변수(time), 부동 ..
SystemVerilog는 Verilog와 비교하여 다양한 개선된 데이터 구조를 제공하며, 이러한 구조는 설계자뿐만 아니라 테스트벤치에서도 유용하게 활용될 수 있다. 이 장에서는 검증에 가장 유용한 데이터 구조에 대해 설명한다.SystemVerilog는 다음과 같은 새로운 데이터 타입을 도입하여 성능을 향상시키고 메모리 사용을 최적화할 수 있도록 한다.1) 이진 상태(Two-state) 데이터 타입기존 Verilog의 4-상태(4-state) 논리(0, 1, X, Z)와 달리, SystemVerilog는 0과 1의 두 상태만을 가지는 이진 상태 데이터를 지원한다.이진 상태 데이터 타입을 사용하면 성능이 향상되며, 메모리 사용량이 줄어드는 장점이 있다.2) 큐(Queue), 동적 배열(Dynamic Arr..