지식 공유/UVM

[UVM 1.1d] 5-1. Register Model (Register Abstraction Layer)

긍수저 2024. 10. 15. 19:31
반응형

5. Using the Register Layer Classes 

Register Layer는 UVM에서 설계의 레지스터 맵을 추상화하고, 쉽게 접근할 수 있는 방법을 제공합니다. 이를 통해 복잡한 설계의 레지스터 모델을 효율적으로 관리하고 테스트할 수 있습니다. 레지스터 모델은 하드웨어 레지스터에 대한 읽기/쓰기 작업을 추상화하고 자동화하여 검증 환경의 생산성을 높여줍니다.


5.1 Register Model 개요

Register Model은 하드웨어 설계에서 레지스터 맵을 테스트벤치 내에서 추상화하여 표현하는 모델입니다. 이를 사용하면 하드웨어 레지스터에 대한 복잡한 접근 작업을 간단하게 처리할 수 있습니다.

목적

  • 레지스터 접근을 추상화하여 검증 코드와 레지스터 맵 간의 결합도를 낮춤.
  • 재사용성을 극대화하여 다양한 테스트 시나리오에서 동일한 레지스터 모델을 사용할 수 있음.
  • 자동화된 읽기/쓰기 작업을 제공해 코드의 효율성과 가독성을 향상시킴.

장단점

장점:

  • 하드웨어 레지스터와의 상호작용을 쉽게 관리 가능.
  • 레지스터 맵을 객체 기반으로 표현하여 코드의 유연성을 제공.
  • 여러 인터페이스를 추상화하여 하드웨어 접근을 단순화.

단점:

  • 복잡한 설계일 경우 레지스터 모델을 구축하는 데 시간이 걸릴 수 있음.
  • 기본적으로 제공되는 기능 외의 특수한 레지스터 동작은 추가 구현이 필요함.

5.2 Register 접근 API

Register Layer에서는 레지스터에 접근하기 위한 다양한 API를 제공합니다. 이를 통해 레지스터의 값을 읽거나 쓰는 작업을 쉽게 수행할 수 있습니다.

1. read() / write()

readwrite는 레지스터의 값을 읽고 쓰는 기본적인 함수입니다. 하드웨어 상의 레지스터 값을 추상화된 소프트웨어 모델에서 쉽게 접근할 수 있게 해줍니다.

// 레지스터에서 값 읽기
my_register.read(status);

// 레지스터에 값 쓰기
my_register.write(status, 32'hDEAD_BEEF);

2. peek() / poke()

peekpoke는 레지스터의 내부 값을 직접 확인하거나 강제로 값을 변경할 때 사용됩니다. 일반적으로 디버깅이나 테스트 중 특정 레지스터의 값을 강제로 설정할 때 유용합니다.

// 레지스터의 값을 확인 (디버깅 용도)
my_register.peek(status);

// 레지스터의 값을 강제로 변경
my_register.poke(32'hABCD1234);

3. get() / set()

getset은 소프트웨어 모델 내에서 레지스터 값을 읽고 쓰는 데 사용됩니다. 실제 하드웨어 접근 없이 모델 상의 레지스터 값을 관리할 때 유용합니다.

// 레지스터 모델에서 값 읽기 (HW 접근 없음)
int reg_value = my_register.get();

// 레지스터 모델에서 값 설정 (HW 접근 없음)
my_register.set(32'hA5A5A5A5);<>/pre

4. update()

update는 레지스터의 값을 모델과 실제 하드웨어 간에 동기화하는 역할을 합니다. 레지스터 값을 소프트웨어 모델에서 변경한 후, 실제 하드웨어 레지스터에 반영할 때 사용됩니다.

// 레지스터 값을 하드웨어에 업데이트
my_register.update(status);

5.3 Access API 사용 예시

Register Layer API를 사용하여 레지스터 값을 읽고 쓰는 방식은 매우 직관적입니다. 다음은 read, write, get, set 등의 API를 사용하는 예시입니다.

// 레지스터 읽기 예시
status = my_register.read(UVM_FRONTDOOR);

// 레지스터 쓰기 예시
my_register.write(UVM_FRONTDOOR, 32'hDEAD_BEEF);

// 레지스터 모델에서 값 설정
my_register.set(32'hA1A1A1A1);

// 하드웨어와 레지스터 모델 동기화
my_register.update(status);

이 API들은 하드웨어 레지스터에 대한 접근을 쉽게 하고, 코드의 재사용성과 가독성을 높여줍니다.


결론

UVM의 Register Layer는 레지스터 맵을 추상화하여 검증 환경에서 효율적으로 레지스터를 다룰 수 있게 해줍니다. 다양한 Access API를 통해 읽기/쓰기 작업을 간단하게 처리할 수 있으며, 디버깅 시 유용한 peek와 poke 같은 메서드를 통해 모델의 유연성을 확보할 수 있습니다. 이를 통해 복잡한 레지스터 기반 설계를 보다 쉽게 검증하고 관리할 수 있습니다.

반응형