핵심 동작: * Hit: 캐시에 데이터가 있으면 즉시 응답 (Performance).
Miss: 캐시에 없으면 DRAM에서 데이터를 가져옴 (Allocate).
Eviction: 캐시가 꽉 찼을 때, 기존 데이터를 DRAM으로 쫓아냄 (Write-Back).
우리가 만든 스코어보드의 Match 조건:
읽기(Read, RW=0): CPU가 데이터를 읽으려 할 때, 캐시에 있는 데이터가 정답지(ref_mem)와 똑같으면 Match++
쓰기(Write, RW=1): CPU가 데이터를 쓸 때, 메모리로 데이터를 쫓아내는(Eviction) 과정에서, 쫓겨난 데이터가 정답지와 똑같으면 Match++
검증 환경 (UVM Verification Environment)
Agent: CPU/Memory 역할을 하는 에이전트를 구축하여 트랜잭션 주입 및 응답 모니터링.
Scoreboard: Ref Model(참조 모델)과 비교하여 데이터 무결성(Data Integrity) 실시간 검증.
Sequence: 단순한 시퀀스부터 랜덤 융단폭격(500회)까지 수행하여 에지 케이스(Edge case) 탐색.
핵심 트러블슈팅 (핵심 실력 검증 구간)
우리가 이 프로젝트에서 직접 해결한 하드웨어 결함들은 다음과 같습니다.
Issue 1: X-State 블랙홀 버그
원인: 초기화되지 않은 메모리(X)를 캐시가 유효한 데이터로 착각하여 잘못된 로직으로 진입.
해결: === 연산자를 활용한 엄격한 Miss 판별 로직(방어막) 적용.
Issue 2: SRAM Write-Read Collision (충돌)
원인: 같은 클럭에 데이터 쓰기와 읽기가 겹치면서 데이터가 증발함.
해결: 포워딩 패스(Bypass) 로직을 RTL에 직접 설계하여 충돌 시 안전한 데이터를 즉시 전달.
Issue 3: 어드레스 정렬(Alignment) 미스
원인: CPU가 무작위 주소를 쐈으나 캐시는 블록 단위(16바이트)로 정렬된 주소만 처리함.
해결: 비트 마스킹(& 32'hFFFF_FFF0)을 통해 주소를 캐시 규칙에 맞게 정렬하여 테스트.

중요한 핵심은 바로 이 한 줄입니다:
UVM_ERROR ... [RAW_HAZARD_BUG][FAIL] Read Addr=0x000010bd: Exp=0x1e6281c9, Act=0x00000000
이 로그가 말해주는 스토리는 다음과 같습니다.
CPU의 명령: "야 캐시, 0x000010bd 주소에 0x1e6281c9라는 데이터를 써(Write)!"
CPU의 얌체짓 (B2B): 그리고 바로 다음 클럭에 숨 쉴 틈도 없이 "방금 쓴 0x000010bd 주소 데이터 다시 읽어줘(Read)!" 라고 명령했습니다.
스코어보드(Exp): "방금 썼으니까 당연히 방금 쓴 값(0x1e6281c9)이 나와야지."
캐시의 실패(Act): 하지만 우리의 파이프라인 캐시는 데이터를 메모리에 미처 다 적기도 전에 읽기 명령이 들어오자, 아직 업데이트되지 않은 과거의 쓰레기 값(0x00000000)을 뱉어버렸습니다.
이것이 바로 그 유명한 RAW(Read-After-Write) Data Hazard입니다. 승윤님의 테스트벤치가 이 치명적인 약점을 정확하게 찔러서 에러(MISMATCH=1)를 띄운 것입니다.
b2b seq

5개


12개



이 하드웨어(RTL)는 하나의 인덱스(Set)에 2개의 데이터를 담을 수 있는 '2-Way Set Associative 캐시'였던 것입니다!
1번째 쓰기 (10a0): "Way 0이 비었네? 쏙~" (쫓겨나는 데이터 없음)
2번째 쓰기 (20a0): "Way 1이 비었네? 쏙~" (쫓겨나는 데이터 없음)
3번째 쓰기 (30a0): "빈칸이 없네! 제일 오래된 10a0 방 빼!" (축출 1 발생 ➡️ Match 1)
... (반복) ...
12번째 쓰기 (c0a0): "빈칸 없네! a0a0 방 빼!" (축출 10 발생 ➡️ Match 10)

드디어 터진 [WRITE_BACK_PASS]
UVM_INFO ... [WRITE_BACK_PASS] Perfectly evicted!
우리가 방금 수술했던 'Dirty Bit' 로직이 완벽하게 작동했다는 뜻입니다! 캐시가 꽉 차서(Miss 발생 시) 기존 데이터를 메모리로 쫓아낼 때(Eviction), 쫓겨나는 데이터의 값이 스코어보드가 예상한 정답(Ref Model)과 100% 일치했다는 뜻입니다. 승윤님이 고친 RTL 코드가 하드웨어에 생명을 불어넣었습니다.


