手を上げるチップくんゆるふわ半導体
考え中のチップくん

Verilog入門|Icarus Verilogで回路を書いて動かす

2026-11-03 ・ 実践

#Verilog#HDL#Icarus Verilog#RTL#実践

Verilogとは、回路の「動作」や「つながり」をテキストで記述するハードウェア記述言語(HDL)です。チップ設計の流れで触れたRTL記述に使われる言語そのもので、実際のチップ設計はこの言語から始まります。この記事では、無料のシミュレータIcarus Verilogを使い、ANDゲートと4ビット加算器のVerilogコードを実際に書いて動かします。

この記事で分かること

  • Verilogは回路の動作をテキストで記述するハードウェア記述言語(HDL)で、チップ設計のRTL工程で使われること
  • 無料のIcarus Verilog(iverilog)をインストールすれば、専用の設計ツールがなくてもVerilogを書いて動かせること
  • Verilogは「並行して動くハードウェア」を書く言語で、Pythonのような逐次実行のプログラミング言語とは考え方が違うこと
  • 全加算器を4つ繋いだ4ビット加算器をVerilogで書き、256パターン全てが正しく動くことをシミュレーションで確認できること

対象読者:Pythonで論理回路を試した後、実際のHDLに触れてみたいエンジニアの方

執筆:ゆるふわ半導体編集部 最終更新日:2026年11月3日

Verilogは何のための言語か

Verilog(ばりろぐ)

回路の構造や動作をテキストで記述するハードウェア記述言語(HDL)のひとつ。1984年に開発され、現在はIEEE 1364として標準化されている。もう一つの主要なHDLがVHDL。チップ設計では、仕様をVerilogやVHDLで書き(RTL記述)、論理合成ツールでゲートの集まりに変換し、最終的に製造データ(GDS)を作る1。

Verilogコードができるまで

⌨️

RTL記述

Verilogで動作を書く

→
🧪

シミュレーション

正しく動くか検証

→
⚙️

論理合成

実際のゲートへ変換

この記事で扱うのは最初の2段階、RTL記述とシミュレーションです。実際のチップ製造まではいきませんが、エンジニアが日常的に使っているのと同じ言語・同じ考え方に触れられます。

なぜPythonではなくVerilogを書くのか

4ビット加算器をPythonで実装した記事では、全加算器を順番にループで繋いで計算しました。Verilogで同じ回路を書くと、考え方が大きく変わります。

🐍

Python

  • コードは上から順に1行ずつ実行される
  • 変数はメモリ上の値。1つずつ書き換わる
  • 「このビットが欲しい時に計算する」という発想
  • 実際の回路にはならない(考え方の確認用)
VS
🧩

Verilog

  • moduleの中の回路はすべて同時に(並行に)動く
  • wireは回路の配線。電圧が常にそこに流れている
  • 「この配線をこう繋ぐ」という回路図そのものの記述
  • 論理合成すれば実際のチップの回路になる

Pythonの for ループで全加算器を4つ呼び出すのは「計算の便宜上の順番」でしたが、Verilogで4つの full_adder を並べて書くと、それは実際に4つの回路が同時に存在して動くという意味になります。ここがHDLとプログラミング言語の決定的な違いです。

準備:Icarus Verilogをインストールする

Icarus Verilogは、Verilogのコードをコンパイルしてシミュレーションできる無料のオープンソースツールです2。専用の商用EDAツール(Synopsys・Cadenceなど)を持っていなくても、手元のPCでVerilogを動かせます。

ターミナル
# Ubuntu / Debian
sudo apt-get install iverilog
 
# macOS(Homebrew)
brew install icarus-verilog

執筆時点でUbuntuのパッケージはv12系、公式の最新安定版はv13系です。どちらでもこの記事のコードは動きます。

ターミナル
iverilog -V
Icarus Verilog version 12.0 (stable) ()

バージョン情報が表示されれば準備完了です。

① ANDゲートを書いて動かす

いちばん簡単な回路、ANDゲートから始めます。Verilogでは、回路本体(module)と、それに信号を与えて結果を確認する「テストベンチ」を分けて書くのが基本です。

and_gate.v
Verilog
module and_gate(input a, input b, output out);
  assign out = a & b;   // aとbのAND。常にこの配線が成立している
endmodule
 
module tb;
  reg a, b;      // テストベンチ側から値を入れる「レジスタ」
  wire out;      // 回路からの出力を受ける「配線」
  and_gate uut(a, b, out);   // 回路を1つ、配置する
 
  initial begin
    $display("a b | out");
    a=0; b=0; #1 $display("%b %b | %b", a, b, out);
    a=0; b=1; #1 $display("%b %b | %b", a, b, out);
    a=1; b=0; #1 $display("%b %b | %b", a, b, out);
    a=1; b=1; #1 $display("%b %b | %b", a, b, out);
  end
endmodule

iverilog でコンパイルし、vvp で実行します。

ターミナル
iverilog -g2012 -o and_gate.out and_gate.v
vvp and_gate.out
a b | out
0 0 | 0
0 1 | 0
1 0 | 0
1 1 | 1

AND・ORなどの論理回路と同じ真理値表が、実際のシミュレータ上で確認できました。assign out = a & b; の1行が、そのまま「aとbをANDするゲート」を表しています。

💡

#1は時間の単位

#1 は「1単位時間だけ進める」という意味です。a・b に値を代入してから #1 待つことで、回路の出力 out が確定するのを待っています。実物の回路では、ゲートを信号が通過するのにわずかな時間(遅延)がかかるため、この「時間」の概念がVerilogには組み込まれています。

② 全加算器と4ビット加算器を書く

次はPythonで作った全加算器と4ビット加算器を、Verilogで書き直します。計算の内容は同じですが、full_adder を4つ並べて繋ぐ書き方そのものが、配置配線される回路の構造になります。

adder4.v
Verilog
module full_adder(input a, input b, input cin, output s, output cout);
  assign s = a ^ b ^ cin;                    // 和
  assign cout = (a & b) | (b & cin) | (a & cin);  // 桁上がり
endmodule
 
module adder4(input [3:0] a, input [3:0] b, output [3:0] s, output cout);
  wire c1, c2, c3;   // 桁上がりを次の桁へ渡す配線
  full_adder fa0(a[0], b[0], 1'b0, s[0], c1);
  full_adder fa1(a[1], b[1], c1,   s[1], c2);
  full_adder fa2(a[2], b[2], c2,   s[2], c3);
  full_adder fa3(a[3], b[3], c3,   s[3], cout);
endmodule

full_adder を4つ、下の桁の桁上がり(c1〜c3)を次の桁へ繋ぐ形で並べています。Pythonのforループでやっていた「桁上がりを引き継ぐ」処理が、ここでは配線の接続そのものとして表現されています。

③ テストベンチで256パターンを検証する

Pythonで書いた「全256パターンで検算」も、Verilogのテストベンチで同じように書けます。

tb_adder4.v
Verilog
module tb_adder4;
  reg [3:0] a, b;
  wire [3:0] s;
  wire cout;
  integer i, j, errors;
  adder4 uut(a, b, s, cout);
 
  initial begin
    errors = 0;
    for (i = 0; i < 16; i = i + 1) begin
      for (j = 0; j < 16; j = j + 1) begin
        a = i; b = j;
        #1;
        if ((s + (cout << 4)) !== (i + j)) errors = errors + 1;
      end
    end
    a = 4'd6; b = 4'd5; #1;
    $display("%0d + %0d = %0d (cout=%b)", a, b, s, cout);
    if (errors == 0) $display("4bit adder 256 patterns: OK");
    else $display("4bit adder: %0d errors", errors);
  end
endmodule
ターミナル
iverilog -g2012 -o adder4.out adder4.v tb_adder4.v
vvp adder4.out
6 + 5 = 11 (cout=0)
4bit adder 256 patterns: OK

Python版と同じ「6 + 5 = 11」、そして全256パターンの検算も OK。テストベンチの中では for ループが使えるので、検証の考え方自体はPythonとそう変わりません。違うのは、検証している対象(adder4 の中身)が「実際に合成できる回路」である点です。

⚠️

testbenchは回路にならない

tb_adder4 モジュールの中の reg・forループ・$display は、あくまでシミュレーション用の仕掛けです。論理合成(実際のチップに変換する工程)の対象になるのは full_adder と adder4 だけで、テストベンチはシミュレータの中だけに存在します。

まとめ

  • Verilogは回路の動作・接続をテキストで記述するHDLで、チップ設計のRTL工程で使われる
  • 無料のIcarus Verilogをインストールすれば、商用EDAツールなしでVerilogを書いて動かせる
  • Verilogの回路(module)は並行して動く。Pythonの逐次実行とは発想が違う
  • 全加算器を4つ並べて繋ぐと4ビット加算器になり、テストベンチで256パターンを検証できる

よくある質問

Q. VerilogとVHDLはどちらを学ぶべきですか?

A. どちらも回路を記述するHDLで、できることは近いです。Verilogは文法がC言語に近く学びやすいとされ、北米系の企業や教育現場で広く使われています。VHDLは記述が厳格で、欧州の一部企業や宇宙・防衛分野で好まれる傾向があります。どちらか一方を学べば、もう一方への移行は比較的スムーズです。

Q. Icarus Verilogだけで実際のチップは作れますか?

A. 作れません。Icarus Verilogはシミュレータで、書いたコードが意図通りに動くかを確認する段階までを担います。実際のチップにするには、Synopsys・Cadenceなどの論理合成ツールでゲートに変換し、配置配線を経て製造データ(GDS)を作る工程が必要です。学習や検証の第一歩として使うツールです。

Q. 波形を目で見て確認する方法はありますか?

A. あります。Verilogのテストベンチに `$dumpfile` と `$dumpvars` を書いてVCD形式のファイルを出力し、無料の波形ビューア(GTKWaveなど)で開くと、信号の変化をグラフで確認できます。本記事では `$display` によるテキスト出力だけで確認しましたが、回路が複雑になるほど波形表示が役立ちます。

📚 もう少し詳しく(背景)気になる人向け・タップで開く

Verilogは1984年にGateway Design Automation社で開発され、1995年にIEEE 1364として標準化されたハードウェア記述言語です1。もう一つの主要なHDLであるVHDLは、米国国防総省の主導で1980年代に作られた経緯があり、記法がより厳格で冗長な傾向があります。現在は両言語とも、より抽象度の高い書き方ができるSystemVerilog(Verilogの拡張)へ発展的に統合されつつあります。

HDLで書いたコードが実際のチップになるまでには、大きく2つの変換があります。まず論理合成で、RTL記述が具体的な論理ゲート(AND・OR・フリップフロップなど)の集まりに変換されます。次に配置配線で、それらのゲートが実際のシリコン上のどこに置かれ、どう配線されるかが決まります。チップ設計の流れで触れたこの一連の工程を支えるのが、Synopsys・CadenceといったEDAツールです。

本記事で使ったシミュレーションは、この論理合成よりも前の段階——「書いたコードが意図通りの動作をするか」を確かめる工程です。実務では、この検証(verification)だけを専門に担うエンジニアがいるほど、重要かつ時間のかかる工程とされています。回路が複雑になるほど、全パターンを網羅的にテストすることが難しくなるため、ランダムなテストパターンを自動生成する手法や、数学的に正しさを証明する形式検証(formal verification)も併用されます。

次の一歩 🌸

回路の作り方は全加算器・4ビット加算器をPythonで実装、記述から製造までの流れはチップ設計の流れ、設計を支えるソフトはEDAツール業界へどうぞ。

参考資料・出典

  • Icarus Verilog - WikipediaIcarus Verilogの開発経緯とバージョン履歴(2026年3月の13.0リリースなど)に関する解説。本記事で実行したバージョン(12.0)は手元での実行結果(iverilog -V)で確認
  • Verilog - WikipediaVerilogの開発経緯(1984年Gateway Design Automation社)とIEEE 1364としての標準化(1995年)に関する解説

ゆるふわポータルでは、一次情報・公的資料にもとづき、専門用語をできるだけやさしく翻訳することを心がけています。内容に誤りや古い情報がある場合は、お問い合わせからご連絡ください。

執筆:ゆるふわ半導体編集部 最終更新日:2026年11月3日

Footnotes

  1. RTL(Register Transfer Level)記述とは、クロックごとにレジスタ間でどうデータが転送されるかを表す抽象度でのハードウェア記述。VerilogはIEEE 1364として標準化されたHDLで、RTL記述に広く使われる。 ↩ ↩2

  2. Icarus Verilogは、Stephen WilliamsらによるオープンソースのVerilogコンパイラ・シミュレータ。iverilogでコンパイルしvvpで実行する2段構成。IEEE 1364-2005(Verilog)やSystemVerilogの一部機能に対応する。 ↩

この記事をシェア:𝕏 で共有LINEで送る

🔥 この分野の最新トレンドをチェック →

あわせて読みたい