본문 바로가기

HDL/UVM

[UVM] uvm_config_db 관련

반응형

uvm에서 처음 접했을대 낯선것중에 하나가 uvm_config_db라는 구문입니다. 

이것의 주요특징들은 아래와 같습니다. 

 

돌아다니는 uvm 기본 예제들을 보면, 이것은 주로 interface를 만들어서 이것을 uvm_config_db로 각각의 agent, driver, monitor등에 일괄적으로 설정하는 예제들을 많이 볼수 있습니다. 

 

이번글에서는 이 uvm_config_db를 왜 사용하는지랑 어떻게 해야 이것을 잘 쓸 수 있는지 적어 보려고 합니다. 

 

먼저, 왜 uvm_config_db인지인데요, 이것은 uvm자체가 object기반이기때문에, object내부에서는 각각의 변수들을 관리하기가 그나마 낫지만, object가 부모라든지, 서로 관련 접점이 없다고 하면, access가 쉽지 않습니다. 

그래서 이 uvm_config_db를 통해서 이들을 access하고 있습니다. 

 

즉, 일종의 전역변수 형식을 통해서 접근하는 방식인데요, 이것은 편리한 점도 있지만, 

프로그램이 복잡해지고, 이것 남발하게 되면 어디서 자칫 Access가 되었는지 모르는 난잡한 문제가 발생합니다. 

 

그래서 다른언어들도 이것 여러개 만들수 없게 가이드하고 있고 (singleton 패턴)

마찬가지로 uvm에서도 config_db는 하나만 만들고, 여기를 통해서 access하는 것을 목적으로 합니다. 

다시말해서, uvm_config_db는 일종의 전역변수를 구현해놓는것입니다. 

다만 dynamic하게 생성된는 변수도 access할 수 있게끔 되어있는 구조입니다.

 

이 uvm_config_db 기본적인 사용법은 아래와 같고, 이름(string)을 통해서 변수에 access할 수 있습니다. 

type이라는 형태를 지정해서 특정 type만 가져올 수 있도록 type safety한 형태이고, 

 

특히 아래 예제에서 눈여겨봐야할 부분은 uvm_component cntxt 입니다

// set - 값을 설정
uvm_config_db#(type)::set(uvm_component cntxt, string inst_name, string field_name, type value);

// get - 값을 읽음
uvm_config_db#(type)::get(uvm_component cntxt, string inst_name, string field_name, type value);

 

Context 값 설명

 

위에서 context (cntxt) 이부분은 어디서 값을 가져올거냐, 시작지점을 정하는 부분입니다. 

대략 아래의 3가지 정도를 많이 사용하고 있는데, 

Context값 설명
this 현재 UVM 구성 요소의 참조입니다. 주로 구성 요소 내부에서 설정 및 검색 시 사용됩니다.
null or
uvm::get_root()
전역 컨텍스트를 나타냅니다. 전체 테스트벤치에서 설정 및 검색 시 사용됩니다.
get_parent() 현재 구성 요소의 부모(상위) 구성 요소 참조를 반환합니다. 부모의 컨텍스트에서 설정 및 검색 시 사용됩니다.

 

첫번째는 자기 자신 아래 있는 component의 값을 지정할때 사용하고, null은 전역변수 처럼 사용합니다. 그리고, get_parent() 함수를 이용해서 부모 component를 access할 수도 있습니다. 

 

// 전역 컨텍스트에서 설정
uvm_config_db#(int)::set(null, "agent1.driver", "delay", 10);

// 현재 구성 요소 (예: agent1의 driver)에서 검색
int delay;
uvm_config_db#(int)::get(this, "", "delay", delay);

// 부모 구성 요소에서 설정값 가져오기
int parent_value;
uvm_config_db#(int)::get(get_parent(), "", "config_name", parent_value);

 

uvm_config_db에서의 와일드카드(*) 의 사용

 

uvm_config_db는 와일드카드(*) 를 지원합니다. 아래와 같이 사용할 수 있습니다. 값 설정의 경우에는 모든변수에 동일 값을 설정하기 때문에 이 방법이 편리할 수도 있습니다. 다만, get의 경우는 같은 이름을 가진 변수가 여러개 존재할때 어디에 있던 값이 올라오는지도, 순서나 우선순위에 따라 문제가 될수 있습니다.

 

따라서 와일드카드는 값 설정시에만 쓰는게 유용할 듯합니다. 아래표는 (*)말고도 다른 와일드카드들의 기능입니다. 

Wildcard 종류 내용
* 0 또는 더 많은 문자에 매칭
+ 1 또는 더 많은 문자에 매칭
? 1문자와만 매칭

아래는 실제 사용되는 예시입니다. 

// top.env.agent 이하 모든 모듈의 max_val을 100으로 설정
uvm_config_db#(int)::set(null, "top.env.agent.*", "max_val", 100);

// 정확한 위치를 모를지만 max_val의 값을 가져오고 싶을때
uvm_config_db#(int)::get(this, "*", "max_val", max_val);

 

이상으로 uvm_config_db에 대해서 간략히 정리해보았습니다. 

이구문이 여기저기서 쓰이지만, 왜 쓰이는지, 어떻게 써야하는지를 고민해보고 쓰면 좋을것 같습니다

반응형

'HDL > UVM' 카테고리의 다른 글

[UVM] Agent  (0) 2023.07.19
[UVM] Drivers  (0) 2023.07.18
[UVM] virtual sequencer를 사용하는 목적  (0) 2023.07.17
UVM Tests (테스트 시나리오)  (0) 2019.12.24