본문 바로가기

전체 글

(12)
Monitor에서 SB으로 packet 보내기 Monitor에서 packet화한 값을 SB으로 보내기 위해서는 1) monitor에서 작업2) scoreboarding에서 작업두개를 진행해주면된다.1. monitor 사이드1) packet packet_collect -> packet을 선언해준다. 2) uvm_analysis_port#(packet) collect_port; ->. Analysis. port 를 만들어준다. 3) ... -> packet을 모아주는 작업을 한다. ( protocol 사이드를 만들어서 데이터를 모아준다. ) 4) collect_port.write(packet_collect); 로 data를 push 한다. 2. Scoreboarding 사이드1) uvm_tlm_analysis_fifo #(packet) fifo[];uv..
sequence 에서 scorebording으로 data값 넘겨주기 이전 코드에서 사용할 때는 virtual interface를 양쪽에 달아놔서, sequence에서 값을 써주고, scoreboarding에서 읽는 방법으로 진행하였다. 이렇게 하면 단점으로, virtual interface를 다 달아줘야하는 단점이 있다.(?)chat gpt에서 추천한 방법은 uvm_analysis_export 로 통로를 뚫어서 데이터를 전달하는 방식이다. 1) incr_tb에서는 모든 uvc와 top의 env들이 들어있다. 제일 top이므로, 이 안에 ‘uvm_analysis_export#(int) reg_export’ 로 출력할 port를 만들어준다.그리고 vseqr.reg_ap.connect(reg_export) 로 연결해준다.reg_export.connect(ip_env.sb.re..
DPI ( Direct Programming Interface ) * DPI (Direct Programming Interface) :System verilog와 C/C++과 연결해주는 표준 인터페이스 SystemVerilog testbench ↔ C/C++ 함수를 직접 호출할 수 있게 해준다. SV코드에서 C의 함수를 호출하거나, C에서 systemverilog 의 함수나 task를 호출 할 수 있다. * 인자 전달 방식 (1) pass(call) by value : 값이 복사되어서 넘어감(2) pass(call) by reference: sv변수의 포인터가 넘어감C에서 값을 바꾸면 그게 SV에서도 바뀌는지 안바뀌는지 차이 - 스칼라 타입(int, bit, byte등)로 쓰면 값이 복사되어서 넘어감. ex) import "DPI-C" function int add_..
UVM Factory 란? * 내가 생각하는 FactoryFactory란 말 그대로 공장이다. 내가 설계도를 Factory(공장)에 넣으면 그 설계도랑 동일한 물건을 찍어줄 수 있다. 예를들어, Factory가 없다면 new를 통해서 설계도를 내가 만들고 그 설계도로 내가 계속 같은 물건을 직접 만들어야한다. 하지만 create를 쓰면 동일한 물건을 만들 수 있다. 결국 factory한테 만들어달라고 부탁할 수 있다. 결국 Class를 factory에 uvm_object(component)_utils로 등록하면, create로 무한으로 찍어낼 수있다. 여기에 추가기능으로, overwrite도 가능해진다. 1. 일반적인 의미 (OOP에서)Factory = “객체를 대신 만들어주는 공장(Factory method pattern)..
UVM RAL * RAL (Register Abstraction Layer):레지스터 모델링과 접근을 추상화하기 위해 제공되는 UVM 패키지.DUT의 bus protocol로만 접근해서 검증을 진행하면 번거롭게 되어, sw처럼 이름으로 접근할 수있게 해준다. *기본 구성(1) uvm_reg_block: register model의 최상위 container(2) uvm_reg: 하나의 register 단위. 여러 field로 구성된다. (3) uvm_reg_field: 레지스터내의 여러 bit field. access type(R/W, RO, WO)이 정의된다.(4) uvm_mem: memory 공간 모델링(5) uvm_reg_map: 실제 RTL과 매칭. base address + offset으로 구성(6) uvm_..
UVM에서의 OOP * OOP ( object oriented programming ) :객체 지향 프로그래밍이라는 뜻으로, 객체라는 단위로 나누어서 설계하는 것을 의미한다. 객체는 데이터 + 동작을 나타낸다.결국 class라는 설계도 안에 객체인 변수와 메써드가 존재한다. 메써드는 function과 task가 될 수 있다. * 4가지의 특성을 갖는다.(1) 추상화: 불필요한 부분을 숨기고 필요한 부분만 보인다.(2) 캡슐화: 데이터와 메서드를 하나의 객체로 묶는다.(3) 상속: 기존의 class의 속성을 자식이 물려받아서 사용할 수 있다. (4) 다형성: 같은 이름의 메써드가 다르게 동작 할 수 있다. 이를 통해서 코드의 재사용성과 유지보수성이 크게 향상된다.UVM역시 OOP를 기반으로 만들어져있기때문에 새로운 시나리오..
new와 create의 차이 new는 그냥 자기 자신만 만드는 생성자 호출이고, create는 UVM factory를 거쳐서 override까지 반영되는 객체 생성이다. SystemVerilog의 new는 단순히 생성자를 호출해서 해당 클래스만 생성합니다.반면 UVM의 create는 factory를 통해 생성하기 때문에, type override나 instance override 같은 기능이 적용될 수 있어요.그래서 UVM 환경에서 재사용성과 확장성을 고려할 때는 create를 쓰는 게 권장됩니다. *newclass를 intance화 할 때 사용한다. handling 하고나서 new를 통해서 oop를 생성한다. *create- UVM에서 제공하는 Factory 기반 생성 함수 - uvm_object_utils / uvm_compo..
Open array, Dynamic array, packed array, associative array in systemverilog * open array 란?function이나 task에서 인자로 전달되는 배열의 크기를 고정되지 않고 사용할 수 있게 하는 문법. task automatic print_array(input int arr[]); foreach (arr[i]) begin $display("arr[%0d] = %0d", i, arr[i]); endendtask 다차원 array 도 가능하다.task print_mat(input int mat[][]); foreach (mat[i,j]) $display("mat[%0d][%0d] = %0d", i, j, mat[i][j]);endtask 다차원 array는 "int mat[][]; " 와 같이 변수 선언으로는 사용 불가능하다. 1차원 array는 사용가능한데..
UVM에서 시퀀스 실행 방법 UVM에서 시퀀스 실행 방법 요약  #### 1. `uvm_test` Class에서 Sequence 실행 방법`uvm_test` 클래스에서 `run_phase` 내에서 시퀀스를 직접 인스턴스화하고 실행하는 방법:```systemverilogclass my_test extends uvm_test;  `uvm_component_utils(my_test)    uvm_sequencer #(my_sequence_item) my_sequencer;    function new(string name, uvm_component parent);    super.new(name, parent);  endfunction    function void build_phase(uvm_phase phase);    super.b..
[UVM] Class와 Factory 이해하기 UVM환경에서 클래스 생성과 활용: Randomization 및 Factory Mechanism 이해해보자! UVM에서 random constraint를 작성하는 class를 만들 때, 그냥 class를 쓸지, uvmobject에서 상속받아 쓸지, uvm_component에서 상속 받아서 쓸지 고민하게 된다. 보통 uvm_object를 상속받아서 작성한다. 그 이유는 uvm_object는 uvm의 기본적인 class로, 어떤 class든 상속받아서 쓰지 않을 때보다 더 많은 기본 코드들을 사용할 수 있다. uvm_component의 경우, 주로 Testbench의 구조를 정의하는데 사용한다. 즉, uvm_object의 경우 데이터 관리에 더 초점을 맞추고 있으므로 randomization이나 contra..
[Systemverilog] Function 과 Task 차이 Function과 Task의 차이는 뭘까?검증엔지니어가 코드를 짜다보면 Task 와 Function의 차이를 잘 모르고 사용하는 경우가 많다.나 역시도 코드를 복사해서 사용하거나, 수정해서 사용하는 것에 익숙해지다보니 두가지 차이점에 대해 잘 알지 못했다.그렇다면, Task와 Function의 가장 큰 차이점은 뭘까?시간 개념 이다.Function은 시간의 흐름이 있지 않다.하지만, Task의 경우 시간의 흐림이 들어가게 된다.Task 를 보게 되면, fork ~ join 과 같은 구문이 들어가고, 시간에 흐름에 따른 코드를 작성하게 된다.하지만 그에 비해 function에서는 시간의 흐름을 생각하지 않고 코드를 작성하게 된다.Task에서 따로 begin ~ end를 쓰지 않고 사용해도 되며, 랑니바이 ..
[UVM] UVM Testbench 환경 구조 UVM 에 대한 전체적인 환경구조를 작성할 때, 전형적인 구조는 아래와 같이 나타낼 수 있다.  크게 Testbench 와 DUT(RTL) 로 나눌 수 있다. 두개 모두 module로 구성된다.Testbench 의 내부를 살펴보면, 위의 그림처럼 나타날 수 있다.내부의 파일을 선언 할 때는 pkg로 되어있는 묶여있는 파일은 import를 통해 선언할 수 있고, (ex. import tb_pkg::*;, import uvm_pkg::*;) handle를 통해서도 선언 할 수 있다. ( ex. scoreboard sb; )handle 을 하기 위해서는 handle하려는 파일이 같은 계층에 존재해야한다. 예를 들어, testbench는 base test 에서 핸들링이 되었으므로, 두개의 파일은 같은 계층에 존..