はじめての実験:AND回路を動かしてみよう
HDLは回路の働きを記述する言語です。ここでは、2つの入力が両方1のときだけ出力が1になるAND回路を作ります。FPGAボードは使わず、パソコン上のシミュレーションで4通りの入力を確かめます。
このページでできること
- 回路本体と、動作を確認するテストベンチを区別する
- 配布した2ファイルをコンパイルして実行する
- 表示された結果を真理値表と照合する
初めての方はここから進めます。体系的な目次は教科書の目次にあります。
1. 必要なものを用意する
コンパイルを行う iverilog と、シミュレーションを実行する vvp を使います。導入方法はIcarus Verilogのインストール案内で、お使いのOSに対応する手順を確認してください。
WindowsではPowerShellまたはコマンドプロンプトを開き、次のコマンドを入力します。macOSやLinuxではターミナルを使います。
iverilog -V
vvp -V
バージョンが表示されれば準備ができています。「コマンドが見つからない」と出る場合は、導入したツールの bin フォルダがPATHに含まれているか確認し、端末を開き直します。波形を見るGTKWaveは任意です。まずは文字で結果を確認しましょう。
Windows:MSYS2 UCRT64を使う例
64ビットWindowsでは、MSYS2公式の導入手順を済ませ、UCRT64ターミナルを開く方法があるよ。MSYS2本体の更新は同サイトの案内に従い、その後、次を入力する。
pacman -S mingw-w64-ucrt-x86_64-iverilog
iverilog -V
vvp -V
パッケージ名は MSYS2の公式一覧 で確認できるよ。以降の実行コマンドも同じUCRT64端末で使えば、PowerShellへPATHを追加せずに進められる。たとえばWindowsの C:hdlirst-and は、ここでは cd /c/hdl/first-and で開けるよ。
すでにWindows版Icarusを導入している場合は、二重に入れず、PowerShellで Get-Command iverilog と Get-Command vvp を確認しよう。配布物のbinだけを別の場所へ移すと補助プログラムやDLLが見つからなくなることがあるので、配布時のフォルダ構成を保ってね。
macOS:Homebrewを導入済みの場合
brew install icarus-verilog
iverilog -V
vvp -V
このコマンドと対応OSは Homebrewの公式Formula で確認できるよ。Homebrew自体がまだ無い場合は 公式サイト の導入手順を先に確認してね。
Ubuntu:パッケージを使う例
sudo apt update
sudo apt install iverilog
iverilog -V
vvp -V
Ubuntuのパッケージ一覧に掲載されているパッケージを使う方法だよ。OSの版により導入されるIcarusの版も異なる。パッケージが見つからない場合は、使っているUbuntuの版と有効なリポジトリを確認しよう。
導入手順の公式資料は2026年10月26日に確認しました。教材の実行確認はWindows / Icarus Verilog 13.0で行っています。MSYS2の新規インストール、macOS、Ubuntuでの実機確認は行っていません。導入後はこのページの4入力がPASSするところまで、自分の環境で確かめてください。
2. サンプルをダウンロードする
ZIPを展開し、中の first-and フォルダを開きます。and_gate.v と tb_and_gate.v が同じフォルダにあることを確認してください。端末の作業場所をこのフォルダに移します。
回路本体:and_gate.v
assign y = a & b; が、入力aとbのANDを出力yへつなぎます。
`timescale 1ns/1ps
`default_nettype none
module and_gate(input wire a, input wire b, output wire y);
assign y = a & b;
endmodule
`default_nettype wire
確認役:tb_and_gate.v
テストベンチは入力を変え、出力が期待どおりか確認する記述です。下のコードは00・01・10・11の4通りを順に試します。!== を使うことで、不定値Xが出た場合も失敗として検出します。
テストベンチの完全なコードを見る
`timescale 1ns/1ps
`default_nettype none
module tb_and_gate;
reg a, b;
wire y;
integer i;
reg expected;
and_gate dut(.a(a), .b(b), .y(y));
initial begin
$dumpfile("and_gate.vcd");
$dumpvars(0, tb_and_gate);
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i[1:0];
expected = (i == 3);
#1;
if (y !== expected)
$fatal(1, "FAIL: a=%b b=%b y=%b expected=%b", a, b, y, expected);
$display("a=%b b=%b y=%b", a, b, y);
end
$display("PASS: AND truth table (4 cases)");
$finish;
end
endmodule
`default_nettype wire
3. コンパイルして実行する
iverilog -g2012 -Wall -s tb_and_gate -o sim.vvp and_gate.v tb_and_gate.v
vvp sim.vvp
1行目で実行用の sim.vvp を作り、2行目で実行します。-s は一番上のテストベンチ名、-g2012 はこの教材のテストベンチで使う構文に合わせた言語設定です。1行目でエラーが出た場合は、先に修正してから2行目へ進みます。
4. 結果を確かめる
確認環境:Windows、Icarus Verilog 13.0。2026年10月25日にコンパイルとシミュレーションを実行し、次の出力を確認しました。VCD作成・終了通知を省略し、主要な出力を抜粋しています。
a=0 b=0 y=0
a=0 b=1 y=0
a=1 b=0 y=0
a=1 b=1 y=1
PASS: AND truth table (4 cases)
最後のPASSは、今回の4ケースが一致したという意味です。FPGA実機や合成後の速度を検証した結果ではありません。
実行後に and_gate.vcd が生成されます。GTKWaveが使える環境では gtkwave and_gate.vcd で開き、a・b・yを選ぶと波形を追えます。本ページで確認したのはVCDの生成までです。
うまく動かないとき
- ファイルが見つからない:端末の現在位置と、ファイル名に余分な
.txtが付いていないかを確認します。 - Unknown module type:回路本体とテストベンチの両方をコンパイルに指定したか確認します。
- FAILと表示される:入力・出力・期待値を読み、配布コードから変更した箇所を比べます。
確認問題
回路本体の a & b を a | b に変え、再びコンパイルすると、どの入力で失敗するでしょうか。
答えと理由
最初に失敗するのはa=0、b=1です。OR回路では出力が1になりますが、AND回路を確認するテストは0を期待しています。回路を変えたときに、確認役が違いを検出できることも大切です。試したあとは元のANDへ戻しましょう。