728x90
이전
UVM002 - UART_Tx, task
이 곳에서는 pure TB 를 task 로 전환하는 단계적 방법에 대해 다뤄본다.UVM 이란 것이 범용적인 검증 방법론이라 어떤 공통된 규약을 다룬다고 해도,이것을 왜 이렇게 바꾸는지 이해는 해야 써먹을
hdnua.tistory.com
.
.
이전 문서에서 다음과 같이 주석을 달았던 적이 있다.
// -----------------------------------------------------------------------------
// Insight: 왜 UART testbench는 fork 없이는 말이 안 되는가
// -----------------------------------------------------------------------------
//
// UART는 서로 다른 장치 간 비동기 직렬 통신이다.
// 실제 시스템에서 TX 장치와 RX 장치는 물리적으로 동시에 동작한다.
// TX가 비트를 쏘는 동안, RX는 그 선을 듣고 있다.
//
// testbench에서 이를 모델링하려면 driver와 monitor가 동시에 실행되어야 한다.
//
// 그러나 순차 실행에서는:
//
// send_byte('H') → valid 올리고 즉시 반환
// send_byte('e') → w_TxReady 기다리는 중(블로킹)
// ← 이 동안 recv_byte 는 실행 못 함
// ← 'H' 프레임은 지금 지나가고 있음
// send_byte('e') → 완료
// recv_byte() → 이제 실행 — 근데 'H' 프레임은 이미 지나감
//
// driver가 블로킹되는 동안 monitor가 동시에 들을 수 없기 때문에,
// 순차 실행으로는 UART의 본질 자체를 표현할 수 없다.
//
// fork는 단순한 편의 기능이 아니라,
// "동시에 동작하는 두 장치"를 시뮬레이션하기 위한 필수 구조다.
// =============================================================================
.
.
fork 의 존재 이유에 대해서는 잘 설명이 된 거 같고. 다음은 TB다.
https://github.com/HDNua/hw001_uvm_study/blob/main/260329_uart/m1_uart_tx/m03_fork/tb/tb_top_v3.sv
// =============================================================================
// m03_fork : fork/join 병렬 실행
//
// m02_task 대비 변화:
// - 다음 바이트를 보내기 전에 o_TxReady 복귀를 기다린다.
// - fork/join으로 driver와 monitor를 병렬 실행한다.
// - payload를 "Hello" 5바이트로 확장한다.
//
// 한계:
// - driver와 monitor가 payload를 직접 공유한다.
// - pass/fail 판정이 monitor task 내부에 섞여 있다.
// → 비교 로직을 분리한 scoreboard가 필요한 이유.
// =============================================================================
.
.
waveform

.
.
두 프로젝트의 차이.

.
.
.
.
728x90
'HW' 카테고리의 다른 글
| UVM005 - UART_Tx, queue (0) | 2026.07.19 |
|---|---|
| UVM004 - UART_Tx, scoreboard (0) | 2026.07.19 |
| UVM002 - UART_Tx, task (0) | 2026.07.19 |
| UVM001 - UART_Tx, RTL & pure TB (0) | 2026.07.18 |
| UVM000 - 바닥부터 시작하는 UVM 전환 (0) | 2026.07.18 |

