반응형
SystemVerilog는 대규모 SoC 검증 환경에서 모듈성과 재사용성을 높이기 위한 다양한 구조를 제공합니다. 이번 포스트에서는 검증 환경의 설계 품질을 높여주는 Package와 Interface의 개념과 실무 활용법을 다룹니다.
Packages: 선언의 재사용과 정리
패키지는 관련된 정의들을 하나로 묶어주는 컨테이너입니다. 클래스, 함수, typedef 등 여러 선언을 그룹화하여 코드 관리와 재사용성을 극대화할 수 있습니다.
- package my_pkg; 형태로 선언
- 내부에 typedef, function, class 등을 선언 가능
- endpackage로 마무리
장점
- 선언의 모듈화 및 재사용성 강화
- 소스 간 네임스페이스 분리로 충돌 방지
- 유지보수 및 가독성 향상
Import 방식 비교
- import my_pkg::*;: 패키지 내 모든 항목 import → 편리하지만 이름 충돌 주의
- import my_pkg::item;: 특정 항목만 import → 명확하고 안전한 사용 권장
이름 해석 순서 (Search Order)
- 로컬 범위 (module/class/task 내)
- import된 패키지
- $root 전역 범위
→ 이름 충돌이나 의도치 않은 값 참조를 피하려면 specific import 사용이 좋습니다.
중첩 패키지 (Nested Package)
패키지 내부에 또 다른 패키지를 선언할 수 있습니다.
parent_pkg::nested_pkg::my_typedef
- 계층적 구조 표현 가능
- export 키워드로 외부 공개 가능
컴파일 단위와 네임스페이스
- $unit: 동일 컴파일 단위 내에서 유효
- $root: 전체 프로젝트 전역 범위
- 패키지: 내부 전용 범위
- 모듈/클래스/인터페이스: 로컬 범위
Interfaces: 신호 연결의 추상화
Interface는 여러 신호를 하나로 묶고, 모듈 간 연결을 단순화하는 데 사용됩니다.
interface my_if;
logic clk;
logic reset;
logic data;
endinterface
주요 활용
- 테스트벤치에서 DUT 연결을 추상화
- 인터페이스 구조의 일관성 유지
- 모듈 간 커뮤니케이션 단순화
Modport로 방향 제약 설정
Modport는 인터페이스 신호에 대해 모듈마다 접근 방향을 제한합니다.
interface my_if;
logic clk, reset, data;
modport master (output clk, reset, data);
modport slave (input clk, reset, data);
endinterface
- master/slave 역할에 따라 신호 방향을 분리
- 계층적 설계 시 역할 분담이 명확해짐
Clocking Block: 안정적인 타이밍 관리
클로킹 블록은 클록 도메인 동기화를 위해 사용됩니다.
clocking cb @(posedge clk);
default input #1ns output #1ns;
input data;
output sig;
endclocking
- 입력/출력 지연을 설정하여 race condition 방지
- 주로 테스트벤치에서 유용하게 사용
Virtual Interface: 동적 바인딩을 위한 유연성
가상 인터페이스는 클래스 기반 환경에서 인터페이스 인스턴스를 동적으로 바인딩합니다.
class driver;
virtual my_if vif;
function new(virtual my_if vif_in);
vif = vif_in;
endfunction
task drive();
vif.data = 1;
endtask
endclass
- 객체지향 환경에서 유연한 구조 제공
- Sequence/Driver 같은 환경에 적합
Deep Talk: Master-Slave
- Master-Slave 구조란?
- 디지털 시스템에서 한 쪽이 주도(Master)하고 다른 쪽이 따라가는(Slave) 방식으로 동작하는 제어 구조
- 주로 동기 회로, 통신 프로토콜(AMBA, I2C, SPI 등), 그리고 플립플롭 회로에서 사용.
반응형
'지식 공유 > SystemVerilog' 카테고리의 다른 글
[SystemVerilog 실무] 10. Assertion 이해 및 활용 (0) | 2025.05.10 |
---|---|
[SystemVerilog 실무] 9. Functional Coverage의 이해 (0) | 2025.05.10 |
[SystemVerilog 실무] 7. 랜덤 테스트와 Constraints 기초 (0) | 2025.05.10 |
[SystemVerilog 실무] 6. SystemVerilog OOP: 캡슐화, 상속, 다형성 (0) | 2025.05.10 |
[SystemVerilog 실무] 5. SystemVerilog 클래스 기초 완전정복 (0) | 2025.05.10 |
[SystemVerilog 실무] 4. 절차적 블록과 제어 구조 이해하기 (0) | 2025.05.10 |
댓글