시스템베릴로그
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
SystemVerilog는 2005년 IEEE 표준 1800-2005로 채택된 하드웨어 기술 언어(HDL)이다. Verilog-2005를 확장하여 RTL 설계를 지원하며, 데이터 타입, 절차적 블록, 인터페이스, 검증 기능, Verilog에 대한 개선 사항 등을 제공한다. 검증 기능은 객체 지향 프로그래밍, 제약 조건 기반 무작위 생성, 어설션, 커버리지, 동기화 등을 포함하며, 칩 설계 산업에서 널리 사용된다. 주요 EDA 벤더들이 SystemVerilog를 자사 시뮬레이터에 통합했으나, 논리 합성에서의 채택은 린터, 형식 검증 등의 지원 부족으로 인해 상대적으로 느리게 진행되었다.
더 읽어볼만한 페이지
- 2002년 개발된 프로그래밍 언어 - F 샤프
F#은 .NET 플랫폼에서 실행되는 크로스 플랫폼, 오픈 소스 프로그래밍 언어로서 함수형, 명령형, 객체 지향 프로그래밍을 지원하며 데이터 분석, 웹 개발, 앱 개발 등 다양한 분야에서 활용된다. - 2002년 개발된 프로그래밍 언어 - 아이오 (프로그래밍 언어)
아이오는 스티브 데코르테가 2002년에 개발한 순수 객체 지향 및 프로토타입 기반의 프로그래밍 언어로서, 코드-애즈-데이터, 호모이코닉 특징과 액터 모델 기반의 동시성, 코루틴, 메타 프로그래밍 등의 고급 기능을 제공한다. - 하드웨어 기술 언어 - 아벨 (프로그래밍 언어)
아벨은 고급 프로그래밍 언어의 한 종류이다. - 하드웨어 기술 언어 - VHDL
VHDL은 디지털 회로의 설계, 검증, 구현에 사용되는 하드웨어 설명 언어(HDL)로, 에이다를 기반으로 하며, 병렬 시스템 설명, 데이터 타입 지원, 코드 재사용 및 이식성을 제공한다.
| 시스템베릴로그 - [IT 관련 정보]에 관한 문서 | |
|---|---|
| 일반 정보 | |
| 종류 | 하드웨어 기술 언어, 하드웨어 검증 언어 |
| 설계 패러다임 | 구조적 |
| 검증 패러다임 | 객체 지향 |
| 출시일 | 2002년 |
| 설계자 | 시놉시스, 이후 IEEE |
| 최신 버전 | IEEE 1800-2023 |
| 최신 버전 출시일 | 2023년 12월 16일 |
| 타이핑 | 정적, 약한 타이핑 |
| 영향 받은 언어 (설계) | 베릴로그, VHDL, C++ |
| 영향 받은 언어 (검증) | 오픈베라, 자바 |
| 파일 확장자 | .sv, .svh |
2. 역사
SystemVerilog는 2002년 신생 기업인 Co-Design Automation이 개발한 Superlog 언어가 Accellera에 기증되면서 시작되었다.[1] 검증 기능의 대부분은 Synopsys에서 기증한 OpenVera 언어를 기반으로 한다. 2005년 SystemVerilog는 IEEE 표준 1800-2005로 채택되었다.[2] 2009년에는 이 표준이 기본 Verilog (IEEE 1364-2005) 표준과 병합되어 IEEE 표준 1800-2009가 되었다.
SystemVerilog는 Verilog-2005의 모든 기능을 포함하며, 하위 호환성을 유지한다.[10] 기능은 크게 설계 기능과 검증 기능으로 나눌 수 있는데, 설계 기능은 전자 회로 및 시뮬레이터에서, 검증 기능은 시뮬레이터에서 테스트 및 디버깅 시 이용된다.[10]
SystemVerilog 표준은 이후 2012년,[3] 2017년,[4] 그리고 가장 최근에는 2023년 12월에 업데이트되었다.[5]
3. 설계 기능
논리 합성 가능 여부는 구현에 따라 다르며, 언어 자체의 문제는 아니다. 예를 들어, Altera의 Quartus II 11.0에서는 공용체는 사용할 수 없지만 구조체는 논리 합성이 가능하다.[10]
3. 1. 데이터 타입
SystemVerilog는 Verilog-2005를 확장하여 다양한 새로운 데이터 타입을 도입했다.
== 향상된 데이터 타입 ==
```systemverilog
logic [1:0][2:0] my_pack[32]; // my_pack의 각 요소는 6비트 정수
```
```systemverilog
typedef enum logic [2:0] {
RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW
} color_t;
color_t my_color = GREEN; // my_color는 GREEN 값을 가짐
```
```systemverilog
typedef struct packed {
bit [10:0] expo;
bit sign;
bit [51:0] mant;
} FP; // FP는 패킹된 구조체
FP zero = 64'b0; // zero는 64비트 0으로 초기화
3. 2. 절차적 블록
SystemVerilog는 하드웨어 모델링을 위해 세 가지 새로운 절차적 블록을 도입했다.
Verilog는 다양한 유형의 하드웨어 구조를 모델링하기 위해 단일 범용 `always` 블록을 사용했지만, SystemVerilog의 새로운 블록은 각 블록에 의해 설명된 하드웨어가 모델의 의도된 사용과 일치하도록 의미적 제약을 가하여 특정 유형의 하드웨어를 모델링하기 위한 것이다. HDL 컴파일러 또는 검증 프로그램은 의도된 유형의 동작만 발생하는지 확인하기 위해 추가 단계를 수행할 수 있다.
전자 설계 자동화(EDA) 도구는 하드웨어 모델이 블록 사용 의미 체계를 위반하지 않는지 확인하여 설계 의도를 검증할 수 있다. 예를 들어, 새로운 블록은 여러 절차적 소스에서 할당을 허용하는 Verilog의 `always` 블록과 달리 하나의 소스만 허용하여 변수에 대한 할당을 제한한다.
3. 3. 인터페이스
시스템베릴로그는 연결된 모듈 간의 포트 이름 선언의 중복성을 줄이고, 관련 신호를 사용자 선언 번들로 묶고 추상화하기 위해 인터페이스 개념을 도입하였다. 추가적인 개념은 로직 연결의 방향을 보여주는 '모드포트'(modport)이다.
예시:
```systemverilog
interface intf;
logic a;
logic b;
modport in (input a, output b);
modport out (input b, output a);
endinterface
module top;
intf i ();
u_a m1 (.i1(i.in));
u_b m2 (.i2(i.out));
endmodule
module u_a (intf.in i1);
endmodule
module u_b (intf.out i2);
endmodule
```
3. 4. Unique/priority if/case
논리 합성이 가능할 것으로 보이는 중첩된 `if` 문이나 `case` 문에서, '''unique''' 속성은 반드시 하나의 분기(case)만 실행되도록 지시한다. 어떤 것도 실행되지 않으면 에러가 발생하며, 각 케이스는 병렬적으로 실행 가능하다. `if` 문이나 `case` 문에서의 '''priority''' 속성은 조건을 순차적으로 평가해 나가는 것을 나타낸다. 지금까지 어노테이션으로 `synopsys full_case parallel_case`를 사용하여 지시했던 것을 정식 키워드로 지시할 수 있게 되었다.
4. 검증 기능
SystemVerilog의 검증 기능은 일반적으로 논리 합성이 불가능하며, 확장 가능하고 유연한 테스트 벤치를 만드는 데 사용된다.[6] 이는 하드웨어에서 직접 구현되는 것이 아니라, 시뮬레이터 상에서 테스트 벤치를 생성하고 검증하는 데 활용된다.
4. 1. 새로운 데이터 타입
`string` 데이터 타입은 가변 길이 텍스트 문자열을 나타낸다.SystemVerilog는 설계에 사용되는 정적 배열 외에도 다음과 같은 동적 자료구조를 제공한다.
| 자료구조 | 설명 |
|---|---|
| 동적 배열 | 실행 시간에 동적으로 할당되는 배열이다. 필요에 따라 크기를 변경할 수 있다. |
| 연관 배열 | 키-값 쌍을 저장하는 이진 탐색 트리와 유사한 자료 구조이다. 키는 엄격한 약한 순서를 가지며, 연관 배열의 요소는 사전순으로 읽을 수 있다. |
| 큐 | 양쪽 끝에서 요소를 효율적으로 추가하고 제거할 수 있는 자료 구조이다. C++(C++)의 STL에 있는 deque와 유사한 기능을 제공한다. |
4. 2. 클래스
SystemVerilog는 객체 지향 프로그래밍 모델을 제공한다.SystemVerilog에서 클래스는 단일 상속 모델을 지원하지만, "인터페이스 클래스"(자바의 `interface` 기능과 개념적으로 동일)를 사용하여 다중 상속과 유사한 기능을 구현할 수 있다. 클래스는 타입별로 매개변수화될 수 있으며, C++ 템플릿의 기본 기능을 제공한다. 그러나 템플릿 특수화와 함수 템플릿은 지원되지 않는다.
SystemVerilog의 다형성 기능은 C++의 기능과 유사하다. 프로그래머는 파생 클래스가 함수의 제어 권한을 얻도록 `virtual` 함수를 명시적으로 작성할 수 있다. 자세한 내용은 가상 함수를 참조하십시오.
캡슐화 및 정보 은닉은 숨겨야 하는 모든 항목에 적용해야 하는 `local` 및 `protected` 키워드를 사용하여 수행된다. 기본적으로 모든 클래스 속성은 public이다.
클래스 인스턴스는 `new` 키워드를 사용하여 동적으로 생성된다. `function new`로 표시된 생성자를 정의할 수 있다. SystemVerilog는 자동 가비지 수집을 지원하므로, new 연산자로 생성된 인스턴스를 명시적으로 파괴하는 언어 기능은 없다.
예시:
```systemverilog
virtual class Memory;
virtual function bit [31:0] read(bit [31:0] addr); endfunction
virtual function void write(bit [31:0] addr, bit [31:0] data); endfunction
endclass
class SRAM #(parameter AWIDTH=10) extends Memory;
bit [31:0] mem [1<
virtual function bit [31:0] read(bit [31:0] addr);
return mem[addr];
endfunction
virtual function void write(bit [31:0] addr, bit [31:0] data);
mem[addr] = data;
endfunction
endclass
4. 3. 제약 조건 기반 무작위 생성
정수형 수량은 클래스 정의에서 정의되거나 일부 어휘 범위에서 독립 실행형 변수로 정의되며, 일련의 제약 조건을 기반으로 난수 생성을 통해 무작위 값을 무작위 테스팅으로 할당할 수 있다. 이 기능은 검증을 위한 무작위 시나리오를 생성하는 데 유용하다.클래스 정의 내에서 `rand` 및 `randc` 수정자는 무작위화될 변수를 나타낸다. `randc`는 순열 기반 무작위화를 지정하며, 여기서 변수는 모든 가능한 값을 한 번씩 사용한 후에야 값이 반복된다. 수정자가 없는 변수는 무작위화되지 않는다.
```systemverilog
class eth_frame;
rand bit [47:0] dest;
rand bit [47:0] src;
rand bit [15:0] f_type;
rand byte payload[];
bit [31:0] fcs;
rand bit [31:0] fcs_corrupt;
constraint basic {
payload.size inside {[46:1500]};
}
constraint good_fr {
fcs_corrupt == 0;
}
endclass
```
위 예에서 `fcs` 필드는 무작위화되지 않는다. 실제로 CRC 생성기로 계산되며, `fcs_corrupt` 필드는 FCS 오류를 주입하기 위해 손상시키는 데 사용된다. 표시된 두 제약 조건은 이더넷 프레임을 준수하는 데 적용할 수 있다. 제약 조건은 선택적으로 활성화할 수 있다. 이 기능은 위 예에서 손상된 프레임을 생성하는 데 필요하다. 제약 조건은 변수 간의 상호 관계, 함축 및 반복을 포함하여 임의로 복잡할 수 있다. SystemVerilog 제약 조건 해결사는 솔루션이 존재하는 경우 솔루션을 찾아야 하지만, 일반적으로 NP-hard 문제(부울 만족 문제)이므로 해결하는 데 필요한 시간에 대한 보장은 하지 않는다.
4. 4. 어설션 (Assertions)
어설션은 특정 조건이나 상태에 도달한 후 나타나는 설계 속성을 검증하는 데 유용하다. 시스템베릴로그는 속성 명세 언어와 유사한 자체 어설션 명세 언어(SVA)를 가지고 있다.[6]시스템베릴로그 어설션은 '''시퀀스'''와 '''속성'''으로 구성된다. 속성은 시퀀스의 상위 집합이다. 모든 시퀀스는 속성처럼 사용할 수 있지만 일반적으로 유용하지 않다.
시퀀스는 부울 표현식에 시간 연산자가 추가되어 구성된다. 가장 간단한 시간 연산자는 연결을 수행하는 `##` 연산자이다.
```systemverilog
sequence S1;
@(posedge clk) req ##1 gnt;
endsequence
```
이 시퀀스는 `req` 신호가 하이(high)로 간 후 한 클럭 사이클 후에 `gnt` 신호가 하이(high)로 가면 일치한다. 모든 시퀀스 연산은 클럭에 동기화된다.
다른 순차 연산자에는 반복 연산자와 다양한 접속사가 포함된다. 이러한 연산자를 통해 설계자는 설계 구성 요소 간의 복잡한 관계를 표현할 수 있다.
어설션은 시퀀스 또는 속성을 지속적으로 평가하려고 시도하여 작동한다. 속성이 실패하면 어설션이 실패한다. 위의 시퀀스는 `req`가 로우(low)일 때마다 실패한다. `gnt`가 `req`를 따라야 한다는 요구 사항을 정확하게 표현하려면 속성이 필요하다.
```systemverilog
property req_gnt;
@(posedge clk) req |=> gnt;
endproperty
assert_req_gnt: assert property (req_gnt) else $error("req not followed by gnt.");
```
이 예제는 '''함축''' 연산자 `|=>`를 보여준다. 함축의 왼쪽에 있는 절을 '''전건'''이라고 하고 오른쪽에 있는 절을 '''후건'''이라고 한다. 함축의 평가는 전건을 반복적으로 평가하려는 시도를 통해 시작된다. 전건이 성공하면 후건이 시도되고 어설션의 성공 여부는 후건의 성공 여부에 따라 달라진다. 이 예제에서 후건은 `req`가 하이(high)로 갈 때까지 시도되지 않으며, 그 후에는 다음 클럭에서 `gnt`가 하이(high)가 아니면 속성이 실패한다.
어설션 외에도 시스템베릴로그는 가정과 속성 범위를 지원한다. 가정은 형식 논리 증명 도구가 참이라고 가정해야 하는 조건을 설정한다. 어설션은 참으로 증명되어야 하는 속성을 지정한다. 시뮬레이션에서 어설션과 가정은 모두 테스트 자극에 대해 검증된다. 속성 범위는 검증 엔지니어가 어설션이 설계를 정확하게 모니터링하는지 확인하도록 한다.
4. 5. 커버리지 (Coverage)
커버리지는 하드웨어 검증 언어에서 시뮬레이션 내에서 샘플링된 이벤트를 기반으로 통계를 수집하는 것을 의미한다. 커버리지는 테스트 대상 장치(DUT)가 올바르게 작동한다는 높은 신뢰도를 가질 수 있도록 충분히 다양한 자극에 노출되었는지 판단하는 데 사용된다. 이는 디자인 코드의 모든 코드가 실행되었는지 확인하기 위해 디자인 코드를 계측하는 코드 커버리지와는 다르다. 기능적 커버리지는 원하는 모든 코너 케이스와 엣지 케이스가 설계 공간에서 탐색되었는지 확인한다.SystemVerilog 커버리지 그룹은 관련된 변수의 값을 저장하는 히스토그램의 "빈" 데이터베이스를 생성한다. 여러 변수의 데카르트 곱을 나타내는 히스토그램을 생성하는 교차 커버리지를 정의할 수도 있다.
샘플링 이벤트는 샘플을 언제 가져올지 제어한다. 샘플링 이벤트는 Verilog 이벤트, 코드 블록의 진입 또는 종료, 또는 커버리지 그룹의 `sample` 메서드 호출이 될 수 있다. 데이터가 의미 있을 때만 샘플링되도록 주의해야 한다.
예를 들어:
```systemverilog
class eth_frame;
// 위와 동일한 정의
covergroup cov;
coverpoint dest {
bins bcast[1] = {48'hFFFFFFFFFFFF};
bins ucast[1] = default;
}
coverpoint f_type {
bins length[16] = { [0:1535] };
bins typed[16] = { [1536:32767] };
bins other[1] = default;
}
psize: coverpoint payload.size {
bins size[] = { 46, [47:63], 64, [65:511], [512:1023], [1024:1499], 1500 };
}
sz_x_t: cross f_type, psize;
endgroup
endclass
```
이 예제에서 검증 엔지니어는 브로드캐스트 및 유니캐스트 프레임의 분포, 크기/f_type 필드 및 페이로드 크기에 관심이 있다. 페이로드 크기 커버 포인트의 범위는 최소 및 최대 크기 프레임을 포함한 흥미로운 코너 케이스를 반영한다.
4. 6. 동기화
복잡한 테스트 환경은 서로 통신해야 하는 재사용 가능한 검증 구성 요소로 구성된다. 베릴로그의 '이벤트' 기본 요소는 서로 다른 절차적 구문 블록이 서로 트리거되도록 허용했지만, 스레드 동기화를 적용하는 것은 프로그래머의 (영리한) 사용에 달려 있었다. SystemVerilog는 스레드 간 동기화를 위해 ''메일함''과 ''세마포어'' 두 가지 기본 요소를 제공한다. 메일함은 FIFO 메시지 큐로 모델링된다. 선택적으로 FIFO는 타입 매개변수화될 수 있으므로 지정된 타입의 객체만 통과시킬 수 있다. 일반적으로 객체는 검증 구성 요소에서 실행되는 기본 연산(예: 프레임 전송)인 ''트랜잭션''을 나타내는 클래스 인스턴스이다. 세마포어는 카운팅 세마포어로 모델링된다.[1]5. Verilog에 대한 일반적인 개선 사항
SystemVerilog는 절차적 할당 연산자(<=, =)가 배열에서 직접 작동하도록 개선되었다. 포트(inout, input, output) 정의는 구조체, enum, real, 다차원 유형을 지원한다.
for 루프는 for 문 내에서 지역 변수 선언을 허용하고, ''continue'' 및 ''break'' 문으로 흐름 제어가 개선되었다. SystemVerilog는 ''do''/while 루프를 ''while'' 루프에 추가했다.
상수 변수는 ''const''를 사용하여 지정할 수 있다. 변수 초기화는 배열에서 작동한다.
증가 및 감소 연산자(++, --)와 다른 복합 할당 연산자(+=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=)가 지원된다.
전처리기의 `define 매크로 대체 기능이 개선되어, 리터럴 문자열("") 내 대체 및 여러 매크로 토큰을 단일 단어로 결합할 수 있다.
fork/join 구조는 ''join_none'' 및 ''join_any''로 확장되었다. `timescale 지시어가 추가되어 각 소스 파일이 로컬 시간 척도를 사용할 수 있다.
태스크 포트는 ''ref''로 선언하여 참조로 전달을 할 수 있다. 함수는 void로 선언하여 값을 반환하지 않음을 나타낼 수 있다. 매개변수는 사용자 정의 ''typedef''를 포함한 모든 유형으로 선언할 수 있다.
6. 검증 및 합성 소프트웨어
케이던스 디자인 시스템즈, 멘토 그래픽스, 시놉시스와 같은 주요 EDA(전자 설계 자동화) 벤더들은 SystemVerilog를 자사의 혼합 언어 HDL 시뮬레이터에 통합했다. 여러 벤더 간 호환성을 높이려는 노력에도 불구하고, 테스트벤치 상호 운용성은 여전히 어려운 문제이다.
2008년, 케이던스와 멘토는 재사용 가능한 테스트벤치 및 검증 IP(지적 재산) 개발을 위한 오픈 소스 클래스 라이브러리 및 프레임워크인 OVM(Open Verification Methodology)을 출시했다. 이에 시놉시스는 자체 VMM을 공개하며 대응했다.
논리 합성 측면에서 SystemVerilog 채택은 느리게 진행되고 있다. 이는 여러 벤더의 다양한 도구를 사용하는 설계 흐름 때문인데, 대부분의 설계 팀은 전체 프런트 엔드 도구 세트가 공통 언어 하위 집합을 지원할 때까지 SystemVerilog RTL 설계를 사용하기 어렵다.
참조
[1]
간행물
The evolution of SystemVerilog
IEEE Design and Test of Computers
2003-07
[2]
웹사이트
IEEE approves SystemVerilog, revision of Verilog
http://www.eetimes.c[...]
[3]
간행물
IEEE 1800-2012
https://standards.ie[...]
IEEE
2012
[4]
간행물
IEEE 1800-2017
https://standards.ie[...]
IEEE
2017
[5]
간행물
IEEE 1800-2023, IEEE Standard for SystemVerilog--Unified Hardware Design, Specification, and Verification Language
https://standards.ie[...]
IEEE
2023
[6]
웹사이트
SystemVerilog Assertion: Introduction
http://www.project-v[...]
[7]
웹사이트
IEEE GET Program
https://ieeexplore.i[...]
IEEE
[8]
간행물
The evolution of SystemVerilog
IEEE Design and Test of Computers
2003-07
[9]
웹사이트
IEEE approves SystemVerilog, revision of Verilog
http://www.eetimes.c[...]
[10]
웹사이트
Quartus II Support for SystemVerilog
http://quartushelp.a[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com