回路を記述するための言語
これまで触れたほとんどの言語(Python、JavaScript、Go)は、CPUが実行する命令の流れを記述します。Verilogは 回路 を記述します。どんなwireがあり、どんなregisterがあり、信号がどう流れるかを書き下します。シミュレータはその回路の挙動を再生でき、合成ツールは同じテキストを実際のチップのgateとflip-flopにコンパイルできます。
これが1行で表した定義です。その含意を理解するにはもう少し時間がかかります。
このスニペットは小さなプログラムのように見えます。module、initialブロック、$displayシステムタスク。Runを押すとhello from verilogが表示されます。ただし内部では、シミュレータは関数を実行しているわけではなく、時間が経過しているふりをして回路を進めているのです。だから$finishがあちこちに登場します。誰かがシミュレータに止まるよう指示しなければなりません。
「ハードウェア記述」が実際に意味するもの
Cの1行はプログラムカウンタがそこに到達したときに実行されます。Verilogの1行は 常に 存在する回路の一部を記述します。次を考えてみてください:
assign y = a & b;
これは「yを1回計算する」ではありません。「yというwireがあり、どの時点でもそれはa AND bに等しい」という意味です。aやbが変われば、yはすぐに追従します。1つのmodule内の複数のassign文は順序ではなく、回路の別々の部分を並列に記述したものです。
これがVerilogを特徴づける性質であり、初心者のバグの源泉です。書く内容のほとんどは 同時に 起こることを記述しており、順序付き文に見える数少ない構文(initialやalwaysブロックの中)も、シミュレータがそう見せかけているだけです。
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 Verilog(iverilog)を使っています。あなたのソースをシミュレータ用にコンパイルし、サンドボックス内で実行します。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週間は混乱する覚悟をしておいてください、そのうち腑に落ちます。