hw001 · UART TX

UART TX 검증 커리큘럼

UART TX의 동작부터 시작해 SystemVerilog 테스트벤치의 역할을 단계별로 분리합니다. 각 단계는 바로 이전 단계에서 무엇이 달라졌는지 보여줍니다.

UART 동작 이해m01 직접 구동·검사m02 task 분리m03 병렬 실행m04 scoreboard 분리m05 queue handoffm06 sequence 분리m07 expected 경로 분리m08 역할 계층m09 interface·item·sequencerm10 UVC 파일 블록m11 mailbox channelm12 SV class UVCm13 seq_item_portm14 analysis portm15 minimal UVM
RTL

UART TX 동작 데모

병렬 데이터가 UART 프레임으로 변환되고 수신 측에서 다시 한 바이트로 조립되는 과정을 살펴봅니다.

Parallel load와 shift register Start·data·stop bit 전송 수신 측 샘플링과 byte 복원
동작 데모 열기 →
m01

m01_pure

한 initial 블록에서 DUT를 직접 구동하고 직렬 출력을 직접 샘플링해 확인합니다.

DUT pin 직접 구동 직렬 출력 직접 샘플링 한 흐름 안에서 결과 비교
단계 흐름 보기 →
m02

m02_task

반복되는 구동과 수신 코드를 send_byte·recv_byte task로 분리해 첫 역할 경계를 만듭니다.

send_byte로 구동 캡슐화 recv_byte로 수신 캡슐화 순차 호출 구조의 한계 확인
단계 흐름 보기 →
m03

m03_fork

driver와 monitor를 fork/join으로 동시에 실행해 여러 바이트를 보내면서 직렬 출력을 놓치지 않고 관찰합니다.

driver·monitor 병렬 실행 "Hello" 5바이트 전송과 수신 monitor 내부 비교의 한계 확인
단계 흐름 보기 →
m04

m04_scoreboard

monitor는 수신만 담당하고 scoreboard가 expected와 actual의 비교와 결과 집계를 전담합니다.

driver·monitor·scoreboard 역할 분리 공유 변수와 event로 actual 전달 queue handoff가 필요한 이유 확인
단계 흐름 보기 →
m05

m05_queue

monitor와 scoreboard 사이에 queue를 두어 actual byte를 순서대로 안전하게 전달합니다.

monitor가 actual queue에 push scoreboard가 순서대로 pop sequence 역할이 필요한 이유 확인
단계 흐름 보기 →
m06

m06_sequence

sequence가 stimulus를 준비하고 driver는 queue에서 받은 byte만 DUT에 구동합니다.

sequence가 driver queue에 push driver의 payload 직접 참조 제거 expected ownership의 다음 과제 확인
단계 흐름 보기 →
m07

m07_expected_path

sequence가 stimulus와 expected를 함께 분배해 scoreboard의 payload 직접 참조를 제거합니다.

driver용 r_DrvQ와 expected용 r_ExpQ scoreboard는 expected·actual queue만 비교 검증 데이터 양쪽 경로의 대칭 구조
단계 흐름 보기 →
m08

m08_role_split

m07의 데이터 경로를 유지하면서 test, env, agent 역할을 task 계층으로 묶습니다.

test가 payload·sequence·env 실행 관리 env가 agent와 scoreboard를 병렬 실행 agent가 driver와 monitor를 하나의 역할로 구성
단계 흐름 보기 →
m09

m09_if_seqitem_sequencer

UART TX pin을 interface로 묶고, byte를 sequence item 객체로 만들어 sequencer API로 전달합니다.

uart_tx_if로 DUT pin bundle 구성 uart_tx_seq_item으로 transaction 표현 sequencer put/get API로 sequence-driver 분리
단계 흐름 보기 →
m10

m10_uvc_block

UART TX 역할 task를 파일별로 분리해 include 기반 UVC 블록을 구성합니다.

uvc/uart_tx에 재사용 역할 파일 배치 tb/top과 tb/test에 단계 전용 조립·test 배치 smoke·pattern·random 세 case에서 같은 UVC 재사용
단계 흐름 보기 →
m11

m11_mailbox_channel

직접 관리하던 queue와 event를 typed mailbox로 바꿔 sequence item 객체를 전달합니다.

sequence→driver item mailbox expected·actual item mailbox blocking get으로 대기 코드 단순화
단계 흐름 보기 →
m12

m12_sv_class_uvc

task 기반 UVC 역할을 plain SystemVerilog class로 전환하고 virtual interface로 DUT에 연결합니다.

test·env·agent·driver·monitor class ownership constructor를 통한 동일 object handle 연결 virtual uart_tx_if를 통한 pin 접근
단계 흐름 보기 →
m13

m13_sv_seq_item_port

driver와 sequencer 사이에 순수 SystemVerilog seq_item_port bridge를 도입합니다.

driver의 sequencer 직접 참조 제거 get_next_item(req)로 request 수신 구동 후 item_done() 완료 통지
단계 흐름 보기 →
m14

m14_sv_analysis_port

monitor와 scoreboard 사이에 순수 SystemVerilog analysis port/imp bridge를 도입합니다.

monitor의 actual mailbox 직접 참조 제거 analysis_port.write(item)으로 관측값 publish scoreboard.write(actual) callback 비교
단계 흐름 보기 →
m15

m15_uvm_minimal

순수 SystemVerilog helper를 실제 UVM object, component, phase와 TLM port로 전환합니다.

factory 기반 object·component 생성 build·connect·run phase와 objection 실제 seq_item_port와 analysis port/imp
단계 흐름 보기 →