[UVM 1.1d] 5-3. Register Model (Register Abstraction Layer)
본문 바로가기
지식 공유/UVM

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

by 긍수저 2024. 10. 20.
반응형

5.6 Predicting Values in the Register Model (레지스터 모델에서의 예측 값)

UVM 레지스터 모델에서는 **예상 값(Predict)**을 추적하여 하드웨어와의 동기화를 관리합니다. 이는 레지스터에 대한 읽기/쓰기 작업이 실제 하드웨어와 일치하는지 확인할 수 있도록 도와줍니다.

주요 기능:

  • 레지스터 값이 읽기/쓰기 작업 후 하드웨어와 일치하는지 확인.
  • 자동 동기화를 통해 소프트웨어 모델의 상태를 하드웨어 상태와 일치시킴.

5.7 Backdoor Access and uvm_hdl_path

UVM에서 Backdoor Access는 설계의 레지스터에 접근할 때 버스를 거치지 않고 직접적으로 레지스터 값을 읽거나 쓸 수 있게 해주는 방법입니다. 이 방식은 시뮬레이션 성능을 높이는 데 유용하며, 주로 빠른 검증을 위해 사용됩니다.

1. Backdoor Access

Backdoor Access는 시뮬레이션 중에 레지스터 값을 강제로 변경하거나 직접 읽을 수 있는 방법을 제공합니다. 특히 **peek()**와 poke() 메서드가 많이 사용됩니다.

  • peek(): 레지스터 값을 직접 읽는 메서드로, 버스를 거치지 않고 하드웨어 레지스터의 값을 가져옵니다.
  • poke(): 레지스터에 값을 강제로 쓰는 메서드로, 설계의 값을 강제로 설정할 수 있습니다.
// 레지스터 값을 직접 읽기 (peek)
my_register.peek(status);

// 레지스터에 값을 강제로 쓰기 (poke)
my_register.poke(32'hABCD_1234);

2. uvm_hdl_path

**uvm_hdl_path**는 Backdoor Access를 통해 레지스터에 접근할 때 사용할 수 있는 경로를 정의하는 속성입니다. 이 속성을 통해 하드웨어 레지스터에 직접적으로 접근할 수 있습니다.

// HDL 경로 설정 예시
my_register.set_hdl_path("top.dut.my_register");

이 코드는 uvm_hdl_path를 통해 레지스터가 하드웨어 설계 내에서 어디에 위치하는지 명시하는 방법을 보여줍니다. 이를 통해 Backdoor 접근 시 경로를 따라 레지스터 값을 읽고 쓸 수 있습니다.


5.8 Special Registers (특수 레지스터)

특수 레지스터는 일반 레지스터와 달리 특정 기능을 수행하는 레지스터를 의미합니다. 주로 다음과 같은 특수 레지스터들이 사용됩니다.

1. Read-Only Registers

  • 읽기 전용 레지스터는 하드웨어 상태를 반영하는 레지스터로, 테스트 중 값이 변경되지 않습니다. 주로 상태 확인 용도로 사용됩니다.
// 읽기 전용 레지스터 설정
my_register.configure(this, 32, 0, "RO", 0, 1, 1, 1);

2. Write-Only Registers

  • 쓰기 전용 레지스터는 외부 입력 값을 받아 동작하는 레지스터로, 하드웨어의 설정을 변경할 때 사용됩니다.
// 쓰기 전용 레지스터 설정
my_register.configure(this, 32, 0, "WO", 0, 1, 1, 1);

3. Clear-on-Read Registers

  • Clear-on-Read 레지스터는 값을 읽으면 자동으로 0으로 초기화되는 레지스터입니다. 주로 이벤트 플래그와 같은 상태 정보에 사용됩니다.
// Clear-on-Read 레지스터 설정
my_register.configure(this, 32, 0, "RW", 1, 0, 1, 1, 1, "CLEAR");

이러한 특수 레지스터는 일반적인 읽기/쓰기 방식과 다른 동작을 제공하여, 시스템의 다양한 상태를 관리하고 제어하는 데 유용합니다.


5.8 Register Model을 환경에 구현하기 (Implementing the Register Model into an Environment)

프로젝트에서는 Register Model을 검증 환경에 통합하여 레지스터 기반 검증을 수행합니다. 이를 위해 레지스터 블록을 환경에 인스턴스화하고, 어댑터를 통해 레지스터와 하드웨어 간의 상호작용을 설정합니다.

Register Model 통합 과정

1. Register Adapter 설정: 어댑터는 레지스터 트랜잭션을 버스 트랜잭션으로 변환합니다.

class my_reg_adapter extends uvm_reg_adapter;
  `uvm_object_utils(my_reg_adapter)

  virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw);
    my_bus_transaction trans = my_bus_transaction::type_id::create("trans");
    trans.addr = rw.addr;
    trans.data = rw.data;
    return trans;
  endfunction
endclass
2. 환경에 레지스터 모델 통합:
class my_env extends uvm_env;
  my_reg_block reg_block;
  my_reg_adapter reg_adapter;

  function new(string name = "my_env", uvm_component parent = null);
    super.new(name, parent);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);

    reg_block = my_reg_block::type_id::create("reg_block", this);
    reg_adapter = my_reg_adapter::type_id::create("reg_adapter", this);

    reg_block.build(); // 레지스터 모델 구축
    reg_block.default_map.set_adapter(reg_adapter); // 어댑터 설정
    reg_block.default_map.set_sequencer(my_sequencer); // 시퀀서 연결
  endfunction
endclass

위 코드에서는 레지스터 블록어댑터를 환경에 통합하여 실제 하드웨어와 상호작용하도록 설정합니다.


결론

UVM에서 Backdoor Accesspeek()와 poke() 메서드를 통해 빠른 검증을 수행하며, **uvm_hdl_path**를 설정하여 하드웨어 설계 내 레지스터 경로를 지정할 수 있습니다. 또한, 특수 레지스터는 프로젝트에서 자주 사용되며, 이를 통해 시스템 상태를 효과적으로 제어할 수 있습니다. Register Model을 환경에 구현하는 과정에서 어댑터와 시퀀서를 설정하여 레지스터와 하드웨어 간의 상호작용을 원활히 수행할 수 있습니다.

반응형

댓글