맘스터치보단파파이스 2024. 6. 19. 15:47

UVM 검증환경

Test Bench Module

 

Test Bench -> [TEST -> [ Sequence , env-> [scoreboard , agent - >[ sequencer, monitor, driver] ] ] ]

sequencer : . squence - driver 사이에서 arbitor( sv의 event 역할 )

seq_item ( transaction ) SW로 생각하자.

 

실행 전 값들이 저장중.

최외각 TestBench 모듈. db 공간에만 interface값을 등록해둠.

type, key, value 값이 등록되어있다. --> monitor & driver가 꺼내쓴다.

db까지만 구현해둔 것.

이미 만들어진 uvm_test 를 상속받겠다.

uvm frame work 안에서 맞추는중.

instance 생성은 build_phase에서 많이 한다.

axi_sequence , axi_env 안에 있는 create 기능을 사용하여 axiSequence , axiEnv에 넣겠다.

axiSequence를 axiEnv 안에 있는 axiAgent 안에 있는 axiSequencer와 연결하엤다.

uvm phase 순서 : C 언어로 생각한다면 --> 순차적으로 호출되는 함수로 생각하자.

Build, connect , run 을 함수라고 생각하자.

이 코드가 순차적으로 실행됨.  그래서 function : build_phase,  task : run_phase

즉 phase 는 어디에서 동작시킬지 정해둔 함수들.

 

테스트 끝.

<<env>>

부모 class의 생성자를 부름.

부모 class의 build phase를 불러다가 scb, agent 를 생성해다가 여기서 쓸거다. ( this )

build -> connect

connect 에서 agent 안에있는 momitor의 send 와 scoreboard 의 recv를 연결하겠다.

 

uvm_component_utils : factory에 등록하겠다.

agent 내부 만들고, uvm_sequencer 그대로 사용하겠다 선언.

arbitor 로 쓰기 위해 연결.

판단을 어떻게 할지 생각하기위해 일단 보류.

DB에 넣어놨던걸 빼는중.

빼와서 axi_mem_intf 에 넣는다.

이 부분도 어떻게 할지 seq_item을 처리하고 와서 한다.

요기 실행부분 코드.

driver 동작 해야하는데 seq_item 에 따라서 결정되기 때문에 보류.

sequence에 써라.????????

field 값 넣기.

 

그리고 메모리에 값을 넣어줘야 한다.

interface 선언했으니 메모리에 접근을 해야 한다. 그래야 읽든 쓰든 한다. --> axi 말고 기본적인 메모리로 생각한다면??

이런식의 선언. wdata, rdata, address, 그리고 신호구분 --> write

sequence 에서 rand 값을 넘기는건데

쓰는건 랜덤 읽는건 순차적으로 하기로 함.

task body 가 이렇게 정리되었다.

 

이젠 driver의 빈칸으로.

interface맞춘대

@ posedge로 받아줄애들과 rand로 들어오는 애들 빼고 나머지를 처리했다.

memory 가 정상적이다를 가정하고 함.

 

monitor 는 빨간 부분을 캡쳐.

AWVALID 기준으로 볼 거다.