Post

[Verilog] VScode-WSL: Verilog Setting

[Verilog] VScode-WSL: Verilog Setting

Abstract

verilog 복습을 위해 구성한 WSL+VSCode 환경에서 Verilog 개발 환경 설정 및 자동화 과정을 정리한다.

Extensions

Image

VScode 확장 프로그램으로 Verilog FormatVerilog-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

각 파일에 다음 내용을 작성한다.

  1. ~/.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
  1. /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

simwave.vcd는 각각 시뮬레이션과 파형 파일로 명령어 실행 결과 생성된다.
test는 프로젝트 루트가 되며, src에는 module을, tb에는 testbench 코드를 작성한다. 여기서는 예제로 counter simulation을 작성한다.

  1. src/counter.v
    1
    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
    
  2. tb/tb_counter.v
    1
    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
    
  3. Executions 프로젝트 root에서 명령어 실행: vsimwave -t <최상위 tb module name> -- tb/<testbench name>.v src/**/*.v

    1
    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까지 한번에 실행된다.

Image

This post is licensed under CC BY 4.0 by the author.