공부방/Verilog_노진호교수님_서울기술교육센터_필기

240618_ UVM_tutorial --> Adder

맘스터치보단파파이스 2024. 6. 18. 16:39

UVM 틀대로 사용하라.

이렇게 되어있으면 신입들도 어느정도 사용할 수 있다. 인력낭비가 줄어든다. 시간도 덜들고.

UVM : Universal Verification Methodology

 

틀 Framework 의 변화 없이 모둔 DUT를 검증 할 수 있을까?

SystemVerilog를 사용해야겠다 . class기능 : 객체지향 

OOP : 객체지향 프로그래밍 특징

-캡슐화(+은닉성) : 묶어서 gen, drv, mon , scb  등등 묶어서 사용 (보이지 않게.)

SysytemVerilog는 Verilog, C++, Java 의 영향을 받은 언어이다.

-상속 : 일반언어 : 상속

           컴퓨터 : 확장성, 기존기능을 포함한 기능추가.

-다형성 : 중요.

다형성이 주는 모델. 

팩토리 패턴은 생성패턴중 하나. OOP 기본틀은 있고 동작기능을 만들어 그 틀에 등록시킨다

Pactory Method Pattern : 객체를 생성하기위한 인터페이스를 정의하는데 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결장하게 만드는 패턴이다.

실제로 동작하는건 clas 자식 에서 동작시킨다.

 

UVM 구조를 변경하면 안된다. 구조에 맞게 각 Sub Class를 만들고 UVM에 등록한다.

 

UVM을 쓰겠다고 안해서 그렇다. --> 선

UVM 성공!

이제 test 모듈을 만들어야 한다.

super. : 부모 class

부모 class에 name 넣는다.

객체의 시작과 끝. 등록 절차이다.

a와 b를 등록했다.

seq_item = transaction. 

virtual로 다형성.

이름은 " SEQ_ITEM" 

핸들러로 instance를 받아온다.

sequence_item_info <<-- 중요한 파트.

요기의 send는 맨윗줄의 선언한 send




<<DUT >> 완성 후 정리.

 

test bench module  안에 class들.

module tb_adder

module은 test, interface , dut로 구성되어있다. <구조이해할것>

new : 생성자

uvm_config_db# 하며 실체화. 

adderIntf() : 물리적인 interface 생성.

uvm_config_db#(virtual adder_interface) : 자료형. data type. "db" database. 

db table 에 type, key , value 를 등록 하겠다.

 

test

sequence, env를 실체화하는 test 

build_phase : build 구간, 영역, 차례

`uvm_component_utils(adder test) : class를 factory 패턴에 등록.

그리고 handler 만들면서 실체화.

--> build phase 안에서 instance를 만드는 절차.

uvm 내부에서 run을 시킨다. : UVM이 자동으로 호출. ( phase 가 붙은 애들은 자동으로 호출.)

objection : EE 있소 : 멈춰라. 

여기서는 class를 멈추지 말아라. 로 사용되고 있다. --> raise  --> drop : 멈춰라.

sequence  = generator  :  transaction을 만들어내는것.

adderSequence.start : 부모의 class내부 명령어. --> 가져다 쓸 수 있는 것. 실제로 sequence 내부에 start가 없다.

start : 이미 정의된 명령어. --> .adderSequencer,

sequence . ~~~ . sequencer. 두개를 연결중.

sequence 와 sequencer 위치 . 어디 안에 들어가 있는지.

env 가 scorboard 와 env를 연결.

scv, agent, 만들고

monitor 안에 send와 recv 연결하겠다.

connect 도 이미 부모 class에서 정의되어있다.

agent. 

uvm agent 에서 상속받아서 시작.

sequence 에서 받는건 item으로. --> ??? 이름을 지정. handler의 이름을 지정. --> # : parameter

driver 와 sequencer의 export 와 연결.

scoreboard.

 --> momitor와 연결. recv를 이용.

write로 부모함수로부터 호출.

recv 매개변수로 넣는다. --> 실행.

거기서 받은 data.a data.b를 더한다.

monitor.

send 매개변수.

if문 내부. key 값을 받아오겠다. key : adderIntf. ( = adder_interface adderIntf)

monitor에서 저장한 값을 get 한다. key 를 가지고 연결하겠다.

scoreboard로 전송하겠다.

driver : sequencer와 연결된다.

#(seq_ item) 을 받겠다.

interface를 받겠다. --> seq_item 생성해서 넘겨줌.

 

이렇게 저장하겠다.

seq_item_port :  agent 에서 sequencer에 연결시킴.

이 절차가 매우 중요하다.

sequence 와 sequencer 연결.

 

sequencer가 sequence, driver 중간에 있다.

sequencer : arbitor : 중재자. flow control.

start item과 seq item port : 등록. --> get next item 까지 기달. 받으면 -> 응답.

3번 라인 실행 randomize. 

5번까지 다 하면 다시 sequencer -> 7번 get!!

item done --> 9번.

6번 대기와 9번 대기가 만나면 --> 10번 replay finish -> 다음라인.

systemVerilog 의 event 처리와 비슷하다.

순차적으로 처리한 후 넘겨주기 위해 .

 

'공부방 > Verilog_노진호교수님_서울기술교육센터_필기' 카테고리의 다른 글

240619_ Microblaze _ intro  (0) 2024.06.19
240619_ UVM _ axi_ slave _ mem  (0) 2024.06.19
240617 AXI4_Lite  (0) 2024.06.17
240614_ AXI4_Lite_RAM  (1) 2024.06.14
240604_ GPIO, Assembly  (1) 2024.06.04