지노랩 /JinoLab

[UVM] 5.7.5 읽기 전용(RO)·쓰기 전용(WO) 레지스터가 한 주소를 공유할 때의 모델링 본문

UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기

[UVM] 5.7.5 읽기 전용(RO)·쓰기 전용(WO) 레지스터가 한 주소를 공유할 때의 모델링

지노랩/JinoLab 2025. 5. 16. 11:54

 

1 | 하드웨어 배경

  • 동일 물리 주소 0x100
    • 쓰기-전용 레지스터(WO) – 제어, 클리어, 트리거용
    • 읽기-전용 레지스터(RO) – 상태·결과
  • 두 레지스터의 비트 레이아웃도 서로 다를 수 있음
    (전혀 관련 없는 필드를 겹쳐놓은 구조)

2 | UVM 모델링 규칙

규칙 설명

RO 레지스터와 WO 레지스터를 각각 1 개씩 인스턴스 두 인스턴스 모두 같은 add_reg() 주소로 매핑
읽기/쓰기 API 제약 RO 인스턴스에 write() 또는 WO 인스턴스에 read() 호출 시— • UVM_NOT_OK 반환 • 에러 메시지 출력 • 트랜잭션 수행 안 함
Back-door 허용 범위 • RO 레지스터 → peek()(읽기)만 허용 • WO 레지스터 → poke()(쓰기)만 허용

3 | 예제 코드

class block_B extends uvm_reg_block;
  rand reg_RO  R;   // 읽기 전용
  rand reg_WO  W;   // 쓰기 전용
  `uvm_object_utils(block_B)

  virtual function void build();
    default_map = create_map("", 0, 4, UVM_BIG_ENDIAN);

    // RO 인스턴스
    R = reg_RO::type_id::create("R"); 
    R.configure(this, null, "R_reg"); 
    R.build();

    // WO 인스턴스
    W = reg_WO::type_id::create("W"); 
    W.configure(this, null, "W_reg"); 
    W.build();

    // 두 인스턴스를 **동일 주소 0x100** 에 매핑
    default_map.add_reg(R, 'h100, "RO");
    default_map.add_reg(W, 'h100, "WO");
  endfunction
endclass

4 | 테스트벤치 사용 예

uvm_status_e st;
uvm_reg_data_t data;

// 올바른 사용
R.read (st, data);         // OK
W.write(st, 32'hDEADBEEF); // OK

// 잘못된 사용 – 에러 발생 후 st == UVM_NOT_OK
R.write(st, 32'h1234);     // ERROR: RO 레지스터에 write
W.read (st, data);         // ERROR: WO 레지스터에 read

// 백도어 디버그
R.peek(st, data);          // 허용
W.poke(st, 32'hBAD0);      // 허용

5 | 정리

  • 한 주소-두 인스턴스로써 읽기·쓰기를 명확히 분리.
  • 프런트도어 API가 규칙을 자동 체크해 잘못된 접근을 차단하고,
    디버그용 Back-door peek/poke 는 선택적으로 허용된다.

 


 

본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.