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つずつ書き換わる
- 「このビットが欲しい時に計算する」という発想
- 実際の回路にはならない(考え方の確認用)
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 -VIcarus Verilog version 12.0 (stable) ()バージョン情報が表示されれば準備完了です。
① ANDゲートを書いて動かす
いちばん簡単な回路、ANDゲートから始めます。Verilogでは、回路本体(module)と、それに信号を与えて結果を確認する「テストベンチ」を分けて書くのが基本です。
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
endmoduleiverilog でコンパイルし、vvp で実行します。
iverilog -g2012 -o and_gate.out and_gate.v
vvp and_gate.outa b | out
0 0 | 0
0 1 | 0
1 0 | 0
1 1 | 1AND・ORなどの論理回路と同じ真理値表が、実際のシミュレータ上で確認できました。assign out = a & b; の1行が、そのまま「aとbをANDするゲート」を表しています。
#1は時間の単位
#1 は「1単位時間だけ進める」という意味です。a・b に値を代入してから #1 待つことで、回路の出力 out が確定するのを待っています。実物の回路では、ゲートを信号が通過するのにわずかな時間(遅延)がかかるため、この「時間」の概念がVerilogには組み込まれています。
② 全加算器と4ビット加算器を書く
次はPythonで作った全加算器と4ビット加算器を、Verilogで書き直します。計算の内容は同じですが、full_adder を4つ並べて繋ぐ書き方そのものが、配置配線される回路の構造になります。
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);
endmodulefull_adder を4つ、下の桁の桁上がり(c1〜c3)を次の桁へ繋ぐ形で並べています。Pythonのforループでやっていた「桁上がりを引き継ぐ」処理が、ここでは配線の接続そのものとして表現されています。
③ テストベンチで256パターンを検証する
Pythonで書いた「全256パターンで検算」も、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
endmoduleiverilog -g2012 -o adder4.out adder4.v tb_adder4.v
vvp adder4.out6 + 5 = 11 (cout=0)
4bit adder 256 patterns: OKPython版と同じ「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日
