WindowsでVHDLのSimulation環境作成
WSL2
- WSL2上でVHDLのSimulation環境を作成します。最初にWindows 11でコマンドプロンプト(又はPowerShell)を管理者権限で起動し下記コマンドを実行します。
>wsl --install -d Ubuntu-24.04
- Ubuntu-24.04がインストールされなかったら、再起動後にもう一度実行して下さい(*1)。
GHDL
GTKWave
Visual Studio Code: 本体インストール
Visual Studio Code: VHDL用拡張機能インストール
- VHDL用の拡張機能としてTerosHDLをインストールします。VSCode左側の拡張機能アイコンをクリックして下さい。

- 検索Boxに
TerosHDLと入力し、現れた拡張機能をインストールして下さい。

GHDL:Analyze⇒Simulation
GTKWave:波形確認
- FSTファイルを見ることで、波形から動作を確認できます。Linuxシェル上のコマンド入力なので、最後の
&(バックグラウンド実行)を忘れないで下さいね。$ gtkwave FSTファイル名 &
- では、一度VHDL作成から波形確認まで一通りやってみましょう。
まずはUbuntuを実行
- WindowsのメニューからUbuntuを実行します。コマンドプロンプトっぽい画面が出てくればOKです。
ユーザー名@PC名:~$
- 以降はシェル上の
ユーザー名@PC名~を省略して$と表記します。
作業ディレクトリの作成
VHDLの回路記述
回路記述のAnalyze確認
VHDLのテストベンチ記述
- 4bit加算回路の入力に値を加えるテストベンチ(VHDL)を編集します。
$ code tb.vhd
- VSCodeで下記のように編集して下さい。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity tb is
end tb;
architecture SIM of tb is
constant CYC : Time := 100 ns;
signal w_a : unsigned(3 downto 0) := "0000";
signal w_b : unsigned(3 downto 0) := "0000";
signal w_q : std_logic_vector(3 downto 0);
begin
dut : entity work.adder_4bit port map (
a => std_logic_vector(w_a),
b => std_logic_vector(w_b),
q => w_q
);
process begin
wait for CYC; w_a <= "0001"; w_b <= "1000";
wait for CYC; w_a <= "0010"; w_b <= "1100";
wait for CYC; w_a <= "1110"; w_b <= "0011";
wait;
end process;
end SIM;
configuration cfg_tb of tb is
for SIM
end for;
end cfg_tb;
テストベンチ記述のAnalyze確認
回路構造のElaborate
- 回路記述とテストベンチ記述の構造認識/組み上げ実行です。最上位となるテストベンチのentity名
tbを指定します。何も表示されずに、Elaborateコマンドが終了すればOKです。$ ghdl -e --std=08 tb
$
Simulation実行
波形ビューアによる波形確認
Appendix: MakefileでAnalyze〜Simulation
- VHDLファイルを修正した後、Analyze/Elaborate/Runをいちいちコマンドで入れるのは面倒ですよね。そんな場合は
Makefileを用意しましょう。makeで必要な操作をしてくれます。下記はMakefile例ですが、上部のdesign_rtl変更だけで汎用的に使えます。
# =============================================================================
# Makefile for VHDL simulation with ghdl
# =============================================================================
# you can modify design_rtl, name_top and name_fst for your design
design_rtl = \
adder_4bit.vhd
name_top = tb
name_fst = wave.fst
# =============================================================================
# design and test bench files
list_rtl = \
$(design_rtl) \
$(name_top).vhd
# simulator commands and options
sim_ana = ghdl -a --std=08 $(list_rtl)
sim_elb = ghdl -e --std=08 $(name_top)
sim_run = ghdl -r --std=08 $(name_top) --fst=$(name_fst)
# flag definitions
flag_folder = flag
flag_ana = $(flag_folder)/analyze
flag_elb = $(flag_folder)/elaborate
flag_run = $(flag_folder)/run
# final process
all: $(flag_run)
# process definitions
$(flag_ana): $(list_rtl)
mkdir -p $(flag_folder)
$(sim_ana)
touch $(flag_ana)
$(flag_elb): $(flag_ana)
$(sim_elb)
touch $(flag_elb)
$(flag_run): $(flag_elb)
$(sim_run)
touch $(flag_run)
# clean
clean:
rm -rf $(name_fst) work-*.cf $(flag_folder)
|