[Verilog] VScode-WSL: Verilog Setting
[Verilog] VScode-WSL: Verilog Setting
Abstract
verilog 복습을 위해 구성한 WSL+VSCode 환경에서 Verilog 개발 환경 설정 및 자동화 과정을 정리한다.
Extensions
VScode 확장 프로그램으로 Verilog Format과 Verilog-HDL/SystemVerilog/Bluespec SystemVerilog를 설치한다.
WSL 환경이므로 Verilog Format의 Linux 설치 방식을 따른다. 안내된 대로 쭉 따라가면 된다.
Setting for Auto Compile & Simulate
컴파일 및 시뮬레이션 파형까지 한번에 실행할 수 있는 자동화 스크립트를 작성한다. simulation은 GTKWave를 사용한다.
먼저 필요한 tool을 설치한다.
1
2
3
4
sudo apt update
sudo apt install -y iverilog gtkwave
iverilog -V
gtkwave --version
다음으로 자동화 스크립트를 작성한다.
1
2
3
4
5
6
7
8
9
# GTKWave 설정 디렉터리와 Tcl 파일 생성
mkdir -p ~/.gtkwave
touch ~/.gtkwave/add_all.tcl # 파형 자동 append
# 전역 실행 스크립트 파일 생성
sudo touch /usr/local/bin/vsimwave
# 실행 권한 부여
sudo chmod +x /usr/local/bin/vsimwave
각 파일에 다음 내용을 작성한다.
~/.gtkwave/add_all.tcl
1
2
3
4
5
6
set nf [gtkwave::getNumFacs]
for {set i 0} {$i < $nf} {incr i} {
set facname [gtkwave::getFacName $i]
gtkwave::addSignalsFromList [list $facname]
}
gtkwave::/Time/Zoom/Zoom_Full
/usr/local/bin/vsimwave
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<USAGE
Usage: $(basename "$0") -t <TOP_MODULE> [options] -- <verilog_files...>
Required:
-t TOP Testbench top module name (예: tb, tb_counter)
Optional:
-g STD SystemVerilog 표준: 2012(기본) 또는 2005-sv
-o OUT 출력 실행파일 이름 (기본: sim)
-v VCD VCD 파일 이름 (기본: wave.vcd)
-S SAV GTKWave .sav 레이아웃 파일 지정 시 사용
-q 조용히 실행(gtkwave stdout/stderr 숨김)
-- 이후는 소스 파일 목록(글롭 허용: *.v, **/*.v)
Examples:
$(basename "$0") -t tb_counter -- tb_counter.v counter.v
$(basename "$0") -t tb -- testbench/*.v rtl/**/*.v
USAGE
}
TOP=""
STD="2012"
OUT="sim"
VCD="wave.vcd"
SAV=""
QUIET="0"
while (( $# )); do
case "$1" in
-t) TOP="$2"; shift 2;;
-g) STD="$2"; shift 2;;
-o) OUT="$2"; shift 2;;
-v) VCD="$2"; shift 2;;
-S) SAV="$2"; shift 2;;
-q) QUIET="1"; shift;;
--) shift; break;;
-h|--help) usage; exit 0;;
-*) echo "[ERR] Unknown option: $1" >&2; usage; exit 1;;
*) break;;
esac
done
[[ -n "$TOP" ]] || { echo "[ERR] -t <TOP_MODULE> is required."; usage; exit 1; }
[[ $# -ge 1 ]] || { echo "[ERR] Need verilog sources after --"; usage; exit 1; }
case "$STD" in
2012) GFLAG="-g2012";;
2005|2005-sv) GFLAG="-g2005-sv";;
*) echo "[ERR] Unknown -g $STD (use 2012 or 2005-sv)"; exit 1;;
esac
FILES=()
shopt -s nullglob globstar
for f in "$@"; do
matches=( $f )
if (( ${#matches[@]} )); then
FILES+=( "${matches[@]}" )
else
echo "[WARN] No match: $f" >&2
fi
done
(( ${#FILES[@]} )) || { echo "[ERR] No input sources found."; exit 1; }
echo "[1/3] iverilog $GFLAG -s $TOP -o $OUT <${#FILES[@]} files>"
iverilog "$GFLAG" -s "$TOP" -o "$OUT" "${FILES[@]}"
echo "[2/3] vvp $OUT"
vvp "$OUT" || true
if [[ ! -f "$VCD" ]]; then
CAND=$(ls -t *.vcd 2>/dev/null | head -1 || true)
[[ -n "${CAND:-}" ]] && VCD="$CAND"
fi
[[ -f "$VCD" ]] || { echo "[ERR] VCD not found. Ensure TB has \$dumpfile/\$dumpvars."; exit 1; }
echo "[3/3] gtkwave $VCD"
CMD=( gtkwave "$VCD" )
if [[ -n "$SAV" && -f "$SAV" ]]; then
CMD=( gtkwave "$VCD" "$SAV" )
elif [[ -f "$HOME/.gtkwave/add_all.tcl" ]]; then
CMD=( gtkwave -S "$HOME/.gtkwave/add_all.tcl" "$VCD" )
fi
if [[ "$QUIET" == "1" ]]; then
"${CMD[@]}" >/dev/null 2>&1 &
else
"${CMD[@]}" &
fi
echo "[DONE]"
Compile & Simulate
설정이 완료되면 다음과 같이 테스트용 프로젝트를 구성한다.
1
2
3
4
5
6
7
8
verilog
└── test
├── sim
├── src
│ └── counter.v
├── tb
│ └── tb_counter.v
└── wave.vcd
sim과 wave.vcd는 각각 시뮬레이션과 파형 파일로 명령어 실행 결과 생성된다.
test는 프로젝트 루트가 되며, src에는 module을, tb에는 testbench 코드를 작성한다. 여기서는 예제로 counter simulation을 작성한다.
src/counter.v1 2 3 4 5 6 7 8 9
module counter #(parameter W = 4) (input wire clk, rst_n, output reg [W-1:0] q); always @(posedge clk or negedge rst_n) begin if (!rst_n) q <= {W{1'b0}}; else q <= q + 1'b1; end endmodule
tb/tb_counter.v1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
`timescale 1ns/1ps module tb_counter; reg clk = 0, rst_n = 0; wire [3:0] q; counter #(.W(4)) dut(.clk(clk), .rst_n(rst_n), .q(q)); // 파형 덤프 initial begin $dumpfile("wave.vcd"); $dumpvars(0, tb_counter); end // 클럭 10ns 주기 always #5 clk = ~clk; initial begin #12 rst_n = 1; // reset deassert #200 $finish; end endmodule
Executions 프로젝트 root에서 명령어 실행:
vsimwave -t <최상위 tb module name> -- tb/<testbench name>.v src/**/*.v1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
zerogod@WIN-KICA6EUHAVM:~/verilog/test$ vsimwave -t tb_counter -- tb/tb_counter.v src/**/*.v [1/3] iverilog -g2012 -s tb_counter -o sim <2 files> [2/3] vvp sim VCD info: dumpfile wave.vcd opened for output. [3/3] gtkwave wave.vcd [DONE] zerogod@WIN-KICA6EUHAVM:~/verilog/test$ GTKWave Analyzer v3.3.104 (w)1999-2020 BSI (gtkwave:61675): dconf-WARNING **: 19:44:10.063: failed to commit changes to dconf: Could not connect: No such file or directory [0] start time. [212000] end time. GTKWAVE | Executing Tcl script '/home/zerogod/.gtkwave/add_all.tcl' (gtkwave:61675): dconf-WARNING **: 19:44:10.141: failed to commit changes to dconf: Could not connect: No such file or directory (gtkwave:61675): dconf-WARNING **: 19:44:10.142: failed to commit changes to dconf: Could not connect: No such file or directory (gtkwave:61675): dconf-WARNING **: 19:44:10.142: failed to commit changes to dconf: Could not connect: No such file or directory
dconf-WARNING는 무시해도 된다.
위 설정으로 compile → simulatation → GTKWave 파형 로딩 및 SST/Signals 자동 Append까지 한번에 실행된다.
This post is licensed under CC BY 4.0 by the author.