2016-07-25 2 views
1
나는 다음과 같은 가이드를 읽고 있어요

: 코드 3.2 라인에서 https://colorlesscube.com/uvm-guide-for-beginners/chapter-3-top-block/UVM- 실행 테스트() 및 매크로

24 run_test(); 내가 테스트를 실행하기로 실현하지만 방법을 알고 어떤 테스트를 거쳤으며, 어떻게 그리고 왜 상위 블록에 기록해야합니까? 코드에서

4.1 라인 11 ~ 14 (https://colorlesscube.com/uvm-guide-for-beginners/chapter-4-transactions-sequences-and-sequencers/) :

`uvm_object_utils_begin(simpleadder_transaction) 
`uvm_field_int(ina, UVM_ALL_ON) 
`uvm_field_int(inb, UVM_ALL_ON) 
`uvm_field_int(out, UVM_ALL_ON) 
`uvm_object_utils_end 
나는 "uvm_field_int"내가 추가하지 않은 경우, 무슨 일이 생긴 것를 추가해야하는 이유

은 무엇이다 "UVM_ALL_ON"?

답변

2

RUN_TEST는 테스트 케이스를 실행하는 uvm_root 클래스의 RUN_TEST 함수를 호출 도우미 전역 함수입니다. 함수에 테스트 이름을 전달할 수있는 두 가지 방법이 있습니다. 첫 번째는 함수 인수를 사용하고 두 번째는 명령 줄 인수를 통해 수행합니다. 명령 행 인수는 함수 인수를 통해 전달 된 테스트 이름보다 우선합니다.

+UVM_TESTNAME=YOUR_TEST_NAME 

    run_test("YOUR_TEST_NAME"); 
uvm_root에

RUN_TEST 함수 umm_test 클래스의 해당 인스턴스를 생성하는 공장 메커니즘을 사용하고 있으므로 상기 테스트 케이스가 작동하는 공장 메커니즘 (create_component_by_name)를 매크로`uvm_component_utils을 이용한 공장 자체를 등록해야 .

class YOUR_TEST_NAME extends umm_test ; 
// register the class with the factory 
// so that run_test can find this class when the 
// string test_name is passed to it. 
`uvm_component_utils(YOUR_TEST_NAME) 
..... 
endclass 

run_test 함수는 uvm_phases (.., build_phase, connect_phase ...)를 실행합니다.) 시뮬레이션의 uvm 부분을 시작합니다. run_phase가 시작되기 전에 시간 틱이 소비되지 않아야하므로 run_test 대소 문자가 초기 블록 자체에서 호출되어야합니다. 또한 우리는 uvm과 테스트 벤치가 RTL이 준비되는 즉시 데이터를 운전하고 수신 할 준비가되어 있어야합니다.이 테스트를 위해 우리는 가장 빨리 run_test를 시작해야합니다. 이 작업을 지연하면 오류가 발생합니다.


`uvm_field_int/uvm_field_object/.. 필드 자동화 매크로라고합니다. 클래스 정의에서 필수는 아니며 uvm_object의 많은 공통/일상적인 기능을 쉽게 사용할 수 있도록 도우미 매크로로 제공됩니다. uvm_object의 thse 함수의 예는 - copy, compare, pack, unpack, print 등이며이 매크로는 이러한 함수를 자동으로 사용하는 코드를 생성합니다.

uvm_object 공통 함수를 사용하지 않는 경우 클래스 정의에서이 매크로를 제외해도 오류가 발생하지 않습니다. 일반적인 작업의 버전을 구현 한 경우 클래스에서이 매크로를 제외 할 수도 있습니다.

UVM_ALL_ON - 특정 필드에 대해 compare/copy/...와 같은 모든 기능을 구현할 수 있습니다. 예에

링크 - uvm_object가 동일 클래스의 두 인스턴스를 비교하고 클래스의 모든 변수가 동일한 경우 true를 돌려 비교하는 기능을 갖고, 예를 들어 http://www.testbench.in/UT_04_UVM_TRANSACTION.html

.

virtual function bit do_compare(uvm_object rhs, uvm_comparer comparer); 

     ..... 
     // return 1 if all the variables match 
     return (super.do_compare(rhs, comparer) && 
       this.var_1 == rhs.var_1   && 
       this.var_2 == rhs.var_2   && 
       ...... 
       this.var_n  == rhs.var_n); 
    endfunction: do_compare 




      // use in main code 
      if (new_class.compare(old_classs)) 
      ... 

      //instead of 
      if (new_class.var1 == old_class.var1 && new_class.var2 == old_class.var2 && ... new_class.varn == old_class.varn) 
     ... 

위의 비교는 각 클래스에 대해 작성되어야하며 클래스에 추가 된 모든 새 변수에 대해 업데이트되고 유지되어야합니다. 새로운 변수가 추가되면 오류가 발생할 수 있습니다. uvm_object가 제공하는 모든 표준 함수에 대해 유사한 프로세스를 따라야합니다.

필드 자동화 매크로는 이러한 모든 기능을 자동으로 처리하는 기능을 생성합니다. 매크로를 사용하여 클래스에 대해 do_print를 수행하면 명시 적으로 코드를 작성하지 않고 모든 필드가 인쇄됩니다. 그들이 클래스에 코드의 상당 금액을 추가로

// compare/print/.. functions for class simpleadder_transaction are provided by using `uvm_field_int macro. 
`uvm_object_utils_begin(simpleadder_transaction) 
`uvm_field_int(ina, UVM_ALL_ON) 
`uvm_object_utils_end 

하지만주의의 단어

,이 매크로의 사용은 권장되지 않습니다.. 이러한 함수의 대부분은 클래스에서 필요하지 않을 수도 있지만 기본적으로 생성됩니다.

1

RUN_TEST가 같은 문서 (link)에 정의되어

virtual task run_test (
     string  test_name =  "" 
) 

그래서 원칙적으로, 당신은 거기 문자열로 테스트 이름을 명시 할 수 있습니다. 하지만 일반적으로 수행 할 작업은 인수를 사용하여 시뮬레이터의 명령 줄에 전달하는 것입니다. + UVM_TESTNAME = TEST_NAME

uvm_object 매크로는 좀 더 복잡합니다. 그들은 여러 가지 방법을 생성하며 더 중요한 것은 UVM 팩토리에 객체를 등록한다는 것인데, 이는 UVM 팩토리를 만드는 공장을 사용하는 경우 최소한 필요합니다. UVM Class Reference documentation에서 인용 (제 20.2 구성 요소 및 매크로 개체) :

간단한 (비 매개 변수) 객체는 다음 않는 uvm_object_utils * 버전, 사용

  • 이 get_type_name를 구현하는이 TYPE을 반환합니다 문자열로
  • 인수를 사용하지 않고 생성자를 호출하여 유형이 TYPE 인 객체를 할당하는 create를 구현합니다. TYPE의 생성자가 으로 정의 된 경우 모든 인수에 기본값이 있어야합니다.
  • TYPE 문자열을 TYPE을 공장 출하시 참조 문자열로 사용하여 TYPE을 출고시에 등록합니다.
  • 유형에 대한 팩토리 프록시 객체를 반환하는 정적 get_type() 메소드를 구현합니다.
  • 정적 get_type() 메소드와 마찬가지로 작동하지만 이미 할당 된 객체 인 에서 작동하는 가상 get_object_type() 메소드를 구현합니다.