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은 test, interface , dut로 구성되어있다. <구조이해할것>
new : 생성자
uvm_config_db# 하며 실체화.
adderIntf() : 물리적인 interface 생성.
uvm_config_db#(virtual adder_interface) : 자료형. data type. "db" database.
db table 에 type, key , value 를 등록 하겠다.
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 |