240619_ UVM _ axi_ slave _ mem
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 기준으로 볼 거다.