2024. 5. 27. 01:04ㆍSystem 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...
위 접은글과 같이 로그가 정상적으로 나온 모습을 볼 수 있다.
'System Verilog' 카테고리의 다른 글
ERROR: [XSIM 43-3409] Failed to compile generated C file xsim.dir/work.top/obj/xsim_22.c. 에러 고치기 (0) | 2024.09.02 |
---|---|
vivado xsim 사용하기 (0) | 2024.08.13 |