Vivado CLI로 UVM 사용하기

2024. 5. 27. 01:04System Verilog

UVM은 요즘 Verification을 하면서 많이 사용하지만, 집에서 따로 실습하기 어렵다. 사용하려면 매우 비싼 상용 컴파일러가 필요하다. (Cadence 사의 Xcelium, Synopsys 사의 VCS 등등..) 아직 icarus verilog는 systemverilog 컴파일 자체를 지원하지 않는 것으로 알고 있다. 

EDA playground를 사용하는 방법도 있지만, UVM을 지원하는 툴(Xcelium, VCS 등) 을 사용하려면 학교, 또는 회사 메일이 필요하고, 기본 웨이브폼 툴 자체가 살짝 거지같다는 단점이 있다. 

 

그러던 중 최근 Vivado에 uvm을 사용할 수 있는 점을 발견하였다. 하지만 Vivado는 GUI가 매우 무거워 터미널 환경(cli)에서 사용할 수 있는 방법을 찾아왔다. 

 

나는 리눅스(우분투) 환경이기 때문에 , 리눅스를 기준으로 설명하겠다. 윈도우의 powershell에서도 크게 다르지 않겠지만, makefile이나 zsh 사용하는 법을 모른다. 

 

Xcelium 같은 경우 

xrun -c -f "파일리스트 경로"
xrun -R "top모듈"

같이 사용하게 되는데, Vivado에서도 비슷하게 사용한다. 

xvlog -f "파일리스트" -sv
xelab -R "탑모듈 이름"

 

1. 환경 변수

 사용하는 쉘에서 환경변수를 export를 해준다. 우분투 사용자의 경우 기본 bash이기 때문에 ~/.bashrc에 PATH에 vivado의 xvlog 경로를 입력해준 후 source 해주면 된다.

 export PATH=$PATH:/tools/xlinx/Vivado/2023.2/bin/xvlog

 

윈도우의 경우

이쪽 환경 변수를 사용하면 될 것이다. 

 

2. file_list를 작성한다. 파일리스트는 꼭 작성할 필요 없이, 명령어 컴파일할 파일을 입력해주면 되지만, 컴파일 할 파일의 개수가 많아지면 매우 번거롭기 때문에 작성해주는 편이 좋다.

 

tb
|- top.sv
|- file_list.f
|- :run
sv 
|- yapp_packet.sv
|- yapp_pkg.sv

디렉토리 구조가 다음과 같이 되어 있기에, 파일리스트를 다음과 같이 입력한다. 

../sv/yapp_pkg.sv
top.sv

xcelium처럼 따로 incdir를 할 필요는 없는 것으로 보인다. 이 때 순서가 중요한데, top.sv에서 yapp_pkg.sv를 import하는데, yapp_pkg가 밑에 위치하면 yapp_pkg를 찾지 못한다는 에러 메시지가 뜬다. 따라서 class 또는 module 등이 작성된 파일이 먼저 와야 하는 것으로 보인다. 

 

3. :run 스트립트이다. 마찬가지로 위의 명령어들을 직접 쳐도 되지만, 번거롭기 때문에 하나의 스크립트를 사용하는게 일반적이다. Makefile을 사용해도 되고, csh나 bash 등 익숙한 shell을 사용해도 될 것이다. 

 

#!/bin/zsh

xvlog -f file_list.f -sv -L uvm 
xelab -R top -L uvm

-f 는 filelist를 사용하겠다는 명령어, -sv는 Systemverilog, -L uvm은 uvm 라이브러리를 사용하겠다는 옵션이다.   

기본은 1.2 버젼이다. 

-R은 시뮬레이션도 같이 진행하겠다는 명령어로 보인다. (확실하지 않음)

더 자세한 옵션은 --h를 주면 명령어 도움말이 뜨니 그것을 참고하면 좋다. 

 

xsim -g top 을 사용하면 웨이브폼을 볼 수 있을 것으로 생각하는데, 실제로 해보진 못했다. 

 

gui에서 UVM을 사용하고 싶으면 동일하게 compile option과 elaboration 옵션에서-L uvm을 사용하면 된다.

더보기

#-----------------------------------------------------------
# xsim v2023.2 (64-bit)
# SW Build 4029153 on Fri Oct 13 20:13:54 MDT 2023
# IP Build 4028589 on Sat Oct 14 00:45:43 MDT 2023
# SharedData Build 4025554 on Tue Oct 10 17:18:54 MDT 2023
# Start of session at: Mon May 27 00:59:17 2024
# Process ID: 13595
# Current directory: /home/jyoon422/project/dv/uvm_training_1.2/uvm/lab01_data/tb
# Command line: xsim -mode tcl -source {xsim.dir/work.top/xsim_script.tcl}
# Log file: /home/jyoon422/project/dv/uvm_training_1.2/uvm/lab01_data/tb/xsim.log
# Journal file: /home/jyoon422/project/dv/uvm_training_1.2/uvm/lab01_data/tb/xsim.jou
# Running On: jyoon422-X470-AORUS-ULTRA-GAMING, OS: Linux, CPU Frequency: 3591.677 MHz, CPU Physical cores: 16, Host memory: 33558 MB
#-----------------------------------------------------------
source xsim.dir/work.top/xsim_script.tcl
# xsim {work.top} -autoloadwcfg -runall
Time resolution is 1 ps
run -all
UVM_INFO /tools/xlinx/Vivado/2023.2/data/system_verilog/uvm_1.2/xlnx_uvm_package.sv(18601) @ 0: reporter [UVM/RELNOTES] 
----------------------------------------------------------------
UVM-1.2
(C) 2007-2014 Mentor Graphics Corporation
(C) 2007-2014 Cadence Design Systems, Inc.
(C) 2006-2014 Synopsys, Inc.
(C) 2011-2013 Cypress Semiconductor Corp.
(C) 2013-2014 NVIDIA Corporation
----------------------------------------------------------------

  ***********       IMPORTANT RELEASE NOTES         ************

  You are using a version of the UVM library that has been compiled
  with `UVM_NO_DEPRECATED undefined.

  You are using a version of the UVM library that has been compiled
  with `UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR undefined.

      (Specify +UVM_NO_RELNOTES to turn off this notice)


PACKET 0
packet: (yapp_packet@338) {
  length: 'h21 
  addr: 'h2 
  payload: {
    [0]: 'h61 
    [1]: 'hcc 
    [2]: 'h6d 
    [3]: 'hc5 
    [4]: 'hed 
    ...... 
    [28]: 'he0 
    [29]: 'h0 
    [30]: 'h47 
    [31]: 'hc7 
    [32]: 'h3e 
  }
  parity: 'hf0 
  parity_type: BAD_PARITY 
  packet_delay: 'd9 
}
----------------------------------------------
Name            Type          Size  Value     
----------------------------------------------
packet          yapp_packet   -     @338      
  length        integral      6     'h21      
  addr          integral      2     'h2       
  payload       da(integral)  33    -         
    [0]         integral      8     'h61      
    [1]         integral      8     'hcc      
    [2]         integral      8     'h6d      
    [3]         integral      8     'hc5      
    [4]         integral      8     'hed      
    ...         ...           ...   ...       
    [28]        integral      8     'he0      
    [29]        integral      8     'h0       
    [30]        integral      8     'h47      
    [31]        integral      8     'hc7      
    [32]        integral      8     'h3e      
  parity        integral      8     'hf0      
  parity_type   parity_t      1     BAD_PARITY
  packet_delay  integral      32    'd9       
----------------------------------------------
packet: (yapp_packet@338) { length: 'h21  addr: 'h2  payload: { [0]: 'h61  [1]: 'hcc  [2]: 'h6d  [3]: 'hc5  [4]: 'hed  ......  [28]: 'he0  [29]: 'h0  [30]: 'h47  [31]: 'hc7  [32]: 'h3e  } parity: 'hf0  parity_type: BAD_PARITY  packet_delay: 'd9  } 

PACKET 1
packet: (yapp_packet@342) {
  length: 'h16 
  addr: 'h1 
  payload: {
    [0]: 'h82 
    [1]: 'he7 
    [2]: 'h44 
    [3]: 'h7d 
    [4]: 'h40 
    ...... 
    [17]: 'ha9 
    [18]: 'h11 
    [19]: 'hfd 
    [20]: 'h24 
    [21]: 'h7b 
  }
  parity: 'hda 
  parity_type: GOOD_PARITY 
  packet_delay: 'd15 
}
-----------------------------------------------
Name            Type          Size  Value      
-----------------------------------------------
packet          yapp_packet   -     @342       
  length        integral      6     'h16       
  addr          integral      2     'h1        
  payload       da(integral)  22    -          
    [0]         integral      8     'h82       
    [1]         integral      8     'he7       
    [2]         integral      8     'h44       
    [3]         integral      8     'h7d       
    [4]         integral      8     'h40       
    ...         ...           ...   ...        
    [17]        integral      8     'ha9       
    [18]        integral      8     'h11       
    [19]        integral      8     'hfd       
    [20]        integral      8     'h24       
    [21]        integral      8     'h7b       
  parity        integral      8     'hda       
  parity_type   parity_t      1     GOOD_PARITY
  packet_delay  integral      32    'd15       
-----------------------------------------------
packet: (yapp_packet@342) { length: 'h16  addr: 'h1  payload: { [0]: 'h82  [1]: 'he7  [2]: 'h44  [3]: 'h7d  [4]: 'h40  ......  [17]: 'ha9  [18]: 'h11  [19]: 'hfd  [20]: 'h24  [21]: 'h7b  } parity: 'hda  parity_type: GOOD_PARITY  packet_delay: 'd15  } 

PACKET 2
packet: (yapp_packet@346) {
  length: 'hf 
  addr: 'h1 
  payload: {
    [0]: 'heb 
    [1]: 'he 
    [2]: 'hd5 
    [3]: 'ha4 
    [4]: 'h5f 
    ...... 
    [10]: 'hee 
    [11]: 'h3d 
    [12]: 'h70 
    [13]: 'hb9 
    [14]: 'h87 
  }
  parity: 'h44 
  parity_type: GOOD_PARITY 
  packet_delay: 'd11 
}
-----------------------------------------------
Name            Type          Size  Value      
-----------------------------------------------
packet          yapp_packet   -     @346       
  length        integral      6     'hf        
  addr          integral      2     'h1        
  payload       da(integral)  15    -          
    [0]         integral      8     'heb       
    [1]         integral      8     'he        
    [2]         integral      8     'hd5       
    [3]         integral      8     'ha4       
    [4]         integral      8     'h5f       
    ...         ...           ...   ...        
    [10]        integral      8     'hee       
    [11]        integral      8     'h3d       
    [12]        integral      8     'h70       
    [13]        integral      8     'hb9       
    [14]        integral      8     'h87       
  parity        integral      8     'h44       
  parity_type   parity_t      1     GOOD_PARITY
  packet_delay  integral      32    'd11       
-----------------------------------------------
packet: (yapp_packet@346) { length: 'hf  addr: 'h1  payload: { [0]: 'heb  [1]: 'he  [2]: 'hd5  [3]: 'ha4  [4]: 'h5f  ......  [10]: 'hee  [11]: 'h3d  [12]: 'h70  [13]: 'hb9  [14]: 'h87  } parity: 'h44  parity_type: GOOD_PARITY  packet_delay: 'd11  } 

PACKET 3
packet: (yapp_packet@350) {
  length: 'h3a 
  addr: 'h0 
  payload: {
    [0]: 'hef 
    [1]: 'hde 
    [2]: 'h66 
    [3]: 'h6e 
    [4]: 'h20 
    ...... 
    [53]: 'hac 
    [54]: 'h72 
    [55]: 'h9 
    [56]: 'ha4 
    [57]: 'h49 
  }
  parity: 'hf1 
  parity_type: GOOD_PARITY 
  packet_delay: 'd3 
}
-----------------------------------------------
Name            Type          Size  Value      
-----------------------------------------------
packet          yapp_packet   -     @350       
  length        integral      6     'h3a       
  addr          integral      2     'h0        
  payload       da(integral)  58    -          
    [0]         integral      8     'hef       
    [1]         integral      8     'hde       
    [2]         integral      8     'h66       
    [3]         integral      8     'h6e       
    [4]         integral      8     'h20       
    ...         ...           ...   ...        
    [53]        integral      8     'hac       
    [54]        integral      8     'h72       
    [55]        integral      8     'h9        
    [56]        integral      8     'ha4       
    [57]        integral      8     'h49       
  parity        integral      8     'hf1       
  parity_type   parity_t      1     GOOD_PARITY
  packet_delay  integral      32    'd3        
-----------------------------------------------
packet: (yapp_packet@350) { length: 'h3a  addr: 'h0  payload: { [0]: 'hef  [1]: 'hde  [2]: 'h66  [3]: 'h6e  [4]: 'h20  ......  [53]: 'hac  [54]: 'h72  [55]: 'h9  [56]: 'ha4  [57]: 'h49  } parity: 'hf1  parity_type: GOOD_PARITY  packet_delay: 'd3  } 

PACKET 4
packet: (yapp_packet@354) {
  length: 'h29 
  addr: 'h2 
  payload: {
    [0]: 'h54 
    [1]: 'hb8 
    [2]: 'hf 
    [3]: 'hee 
    [4]: 'h78 
    ...... 
    [36]: 'ha7 
    [37]: 'h82 
    [38]: 'hb1 
    [39]: 'h94 
    [40]: 'h4e 
  }
  parity: 'h9f 
  parity_type: GOOD_PARITY 
  packet_delay: 'd11 
}
-----------------------------------------------
Name            Type          Size  Value      
-----------------------------------------------
packet          yapp_packet   -     @354       
  length        integral      6     'h29       
  addr          integral      2     'h2        
  payload       da(integral)  41    -          
    [0]         integral      8     'h54       
    [1]         integral      8     'hb8       
    [2]         integral      8     'hf        
    [3]         integral      8     'hee       
    [4]         integral      8     'h78       
    ...         ...           ...   ...        
    [36]        integral      8     'ha7       
    [37]        integral      8     'h82       
    [38]        integral      8     'hb1       
    [39]        integral      8     'h94       
    [40]        integral      8     'h4e       
  parity        integral      8     'h9f       
  parity_type   parity_t      1     GOOD_PARITY
  packet_delay  integral      32    'd11       
-----------------------------------------------
packet: (yapp_packet@354) { length: 'h29  addr: 'h2  payload: { [0]: 'h54  [1]: 'hb8  [2]: 'hf  [3]: 'hee  [4]: 'h78  ......  [36]: 'ha7  [37]: 'h82  [38]: 'hb1  [39]: 'h94  [40]: 'h4e  } parity: 'h9f  parity_type: GOOD_PARITY  packet_delay: 'd11  } 

COPY
-----------------------------------------------
Name            Type          Size  Value      
-----------------------------------------------
copy_packet     yapp_packet   -     @334       
  length        integral      6     'h29       
  addr          integral      2     'h2        
  payload       da(integral)  41    -          
    [0]         integral      8     'h54       
    [1]         integral      8     'hb8       
    [2]         integral      8     'hf        
    [3]         integral      8     'hee       
    [4]         integral      8     'h78       
    ...         ...           ...   ...        
    [36]        integral      8     'ha7       
    [37]        integral      8     'h82       
    [38]        integral      8     'hb1       
    [39]        integral      8     'h94       
    [40]        integral      8     'h4e       
  parity        integral      8     'h9f       
  parity_type   parity_t      1     GOOD_PARITY
  packet_delay  integral      32    'd11       
-----------------------------------------------
CLONE
-----------------------------------------------
Name            Type          Size  Value      
-----------------------------------------------
packet          yapp_packet   -     @358       
  length        integral      6     'h29       
  addr          integral      2     'h2        
  payload       da(integral)  41    -          
    [0]         integral      8     'h54       
    [1]         integral      8     'hb8       
    [2]         integral      8     'hf        
    [3]         integral      8     'hee       
    [4]         integral      8     'h78       
    ...         ...           ...   ...        
    [36]        integral      8     'ha7       
    [37]        integral      8     'h82       
    [38]        integral      8     'hb1       
    [39]        integral      8     'h94       
    [40]        integral      8     'h4e       
  parity        integral      8     'h9f       
  parity_type   parity_t      1     GOOD_PARITY
  packet_delay  integral      32    'd11       
-----------------------------------------------
exit
INFO: [Common 17-206] Exiting xsim at Mon May 27 00:59:20 2024...
 

위 접은글과 같이 로그가 정상적으로 나온 모습을 볼 수 있다.