Menu

Verilogとは?ハードウェア記述言語の初心者向けガイド

Verilogとは何か、何に使われ、通常のプログラミング言語とどう違うのか、そして40年経った今でもデジタル設計者が選び続ける理由を、平易な言葉で紹介します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

回路を記述するための言語

これまで触れたほとんどの言語(Python、JavaScript、Go)は、CPUが実行する命令の流れを記述します。Verilogは 回路 を記述します。どんなwireがあり、どんなregisterがあり、信号がどう流れるかを書き下します。シミュレータはその回路の挙動を再生でき、合成ツールは同じテキストを実際のチップのgateとflip-flopにコンパイルできます。

これが1行で表した定義です。その含意を理解するにはもう少し時間がかかります。

このスニペットは小さなプログラムのように見えます。moduleinitialブロック、$displayシステムタスク。Runを押すとhello from verilogが表示されます。ただし内部では、シミュレータは関数を実行しているわけではなく、時間が経過しているふりをして回路を進めているのです。だから$finishがあちこちに登場します。誰かがシミュレータに止まるよう指示しなければなりません。

「ハードウェア記述」が実際に意味するもの

Cの1行はプログラムカウンタがそこに到達したときに実行されます。Verilogの1行は 常に 存在する回路の一部を記述します。次を考えてみてください:

assign y = a & b;

これは「yを1回計算する」ではありません。「yというwireがあり、どの時点でもそれはa AND bに等しい」という意味です。abが変われば、yはすぐに追従します。1つのmodule内の複数のassign文は順序ではなく、回路の別々の部分を並列に記述したものです。

これがVerilogを特徴づける性質であり、初心者のバグの源泉です。書く内容のほとんどは 同時に 起こることを記述しており、順序付き文に見える数少ない構文(initialalwaysブロックの中)も、シミュレータがそう見せかけているだけです。

Verilogで何を作るか

デジタル設計のあらゆるレベルでVerilogが使われています:

  • 組み合わせ論理。 加算器、マルチプレクサ、デコーダ、ALUのスライス。出力が現在の入力だけで決まるあらゆる回路です。
  • 順序論理。 カウンタ、shift register、有限状態機械、posedge clkでクロック動作するあらゆる回路。
  • プロセッサコア。 大学の宿題で書くCPUから、実シリコンで出荷されているオープンソースのRISC-Vコアまで、RTLは通常VerilogまたはSystemVerilogです。
  • FPGA設計。 XilinxやIntelのFPGAにロードされるロジック(ネットワーク、画像処理、組み込み制御など)の多くはVerilogで書かれています。
  • ASIC。 スマホやルータ、自動車に入っているカスタムチップのフロントエンド設計はHDLで行われ、Verilogは主流の2大選択肢の1つです。

学ぶのにこれらのハードウェアは何もいりません。これらのドキュメントの内容はすべてブラウザ内シミュレータで動きます。

SimulationとSynthesis

Verilogを「実行」する方法は2つあり、両者は同じものではありません:

  • Simulation(シミュレーション) はソフトウェアで回路の挙動を再生します。シミュレータ(Icarus Verilog、Verilator、ModelSim、商用ツール)はあなたのmoduleとtestbench(入力を駆動するコード)を読み込み、テキストログ、波形、合否レポートを出力します。
  • Synthesis(合成) はVerilogの 一部の機能 を取り、実際のgateのネットリストにコンパイルします。ベンダーツール(Vivado、Quartus、大手企業のdesign-compilerツール)がそのマッピングを行います。合成可能なVerilogには追加のルールがあります。initialブロックや$display呼び出しはシリコンには存在しません。

このページのブラウザエディタはシミュレーションを行います。実際のチップを出荷したりFPGAをプログラミングするまでは、それで十分です。

VerilogとSystemVerilog

調べていくと、両方の名前が出てきます。SystemVerilogはスーパーセットで、Verilogの構文をすべて残しつつ、主に検証向けの機能(クラス、制約付きランダムテスト、アサーション、interface、はるかに豊富な型システム)を追加しています。ここで学ぶ内容はすべて有効なSystemVerilogです。実務では両者の名前は曖昧に使われ、多くのツールはどちらも受け付け、ほとんどのファイルは拡張子に関わらず.vで終わります。このドキュメントでは通して「Verilog」と呼びます。

VerilogとVHDL

どちらもハードウェア記述言語で、どちらもIEEE標準で、どちらも1980年代から存在します。違いは以下です:

  • 構文。 VerilogはCに由来し、波括弧、簡潔なキーワード、緩めの型ルールを持ちます。VHDLはAdaに由来し、より冗長で型に厳格です。
  • 地域性。 Verilogは米国の商用設計で支配的です。VHDLはヨーロッパ、防衛分野、古いコードベースで今も一般的です。
  • 表現力。 表現できることはほぼ同等です。チームが何を使っているかで選びましょう。

HDLを初めて学ぶなら、Verilogの方がなだらかな立ち上がりです。構文が小さく、より寛容で、オンラインの標準的なサンプルライブラリも大きいからです。

このドキュメントがどうVerilogを実行しているか

下のエディタは内部で Icarus Verilogiverilog)を使っています。あなたのソースをシミュレータ用にコンパイルし、サンドボックス内で実行します。Vivadoライセンスも、Quartusのインストールも、FPGAボードも不要です。moduleと小さなtestbenchを書いてRunを押せば、出力と波形が見られます。

これが完全な4ビットカウンタとtestbenchです。counter moduleがDUT(design under test、テスト対象設計)で、test moduleがクロックを揺らし、resetを解除し、毎サイクル値を表示します。実行すればcountが0から15まで進んでラップする様子が見えます。Waveformタブを開けば、同じ動きが電圧遷移として表示されます。

次に読むもの

これで最初のmoduleを書き始めるのに十分な背景知識が揃いました。次のドキュメントハードウェアとソフトウェアは、発想の転換にもう少し時間を割きます。新しいVerilogプログラマーがつまずく最大のポイントだからです。その後、ローカルシミュレータのインストール(任意、ブラウザで十分)、最初のmoduleをゼロから書く、そして言語の残りを学んでいきます。

ペースを保ちましょう。構文は小さく、発想の転換こそが本当の仕事です。

よくある質問

Verilogを簡単に言うと何ですか?

Verilogはデジタル回路をテキストで記述するためのハードウェア記述言語(HDL)です。CPUが実行する命令を書くのではなく、wire、register、gate、そしてそれらの間を流れる信号を記述します。シミュレータがその記述を実行して挙動を検証でき、合成(synthesis)ツールが同じ記述を実際のチップレイアウトに変換できます。

Verilogは何に使われますか?

Verilogはデジタルハードウェアの設計と検証に使われます。CPU、GPU、ネットワークスイッチ、メモリコントローラ、信号処理ブロック、FPGA設計など、gateとflip-flopで構築されるあらゆるものです。実際のシリコンを作る前に、デジタル論理の教育や設計のプロトタイピング用にシミュレーションだけで動かすこともできます。

Verilogはプログラミング言語ですか?

通常の意味では違います。Verilogのコードは、CPU命令の一連の流れではなく、ハードウェアの構造と挙動(信号、gate、クロック同期のストレージ)を記述します。書いた多くの行はチップ上で同時並行に実行されるのであって、順番に実行されるわけではありません。この発想の転換が、ソフトウェアからVerilogへ移るときの最大の壁です。

VerilogとSystemVerilogの違いは何ですか?

SystemVerilogはVerilogのスーパーセットです。Verilogの構文をすべて保持し、主に検証用の機能(クラス、制約付きランダム刺激、アサーション、interface、より豊富なデータ型)を追加しています。SystemVerilogを受け付けるツールはVerilogも受け付けます。入門レベルの作業では、両者は見た目もほぼ同じです。

VerilogとVHDLの違いは何ですか?

VerilogとVHDLはどちらも同じ問題を解くハードウェア記述言語です。Verilogの構文はCに由来し、より簡潔です。VHDLはAdaに由来し、より冗長で型に厳密です。業界での使用状況は地域やチームによって異なり、どちらも現役で、どちらも標準化されています(Verilog/SystemVerilogはIEEE 1364/1800、VHDLはIEEE 1076)。

Verilogは学ぶのが難しいですか?

構文は小さく、C++よりも小さいくらいです。難しいのはソフトウェアの習慣を捨てることです。Verilogではほとんどの文が順番ではなく同時に起こるものを記述し、blocking代入と非blocking代入の使い分けを間違えると、回路がそもそも動くかどうかが変わってしまいます。最初の1週間は混乱する覚悟をしておいてください、そのうち腑に落ちます。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める