Verilog ドキュメント
簡潔で実例中心の Verilog リファレンス。概念を読み、コードを見て、Coddy のジャーニーで実践しましょう。
Verilog のガイド付き学習を始めるはじめに
- Verilogとは?Verilogとは何か、何に使われ、通常のプログラミング言語とどう違うのか、そして40年経った今でもデジタル設計者が選び続ける理由を、平易な言葉で紹介します。
- ハードウェアとソフトウェアソフトウェア言語の後だとVerilogが混乱して見える理由:デフォルトの並行性、第一級概念としての時間、上から順に実行されない文。
- VerilogのインストールIcarus VerilogとGTKWaveをインストールしてVerilogをローカルでコンパイル・シミュレートします。インストールを省略してブラウザエディタを使ってもこのドキュメントはすべて学べます。
- 最初のmodule最初の完全なVerilog moduleをゼロから書きます。宣言、ポート、ちょっとした組み合わせ論理、そしてそれを駆動するtestbench。ブラウザで実行可能です。
- コメントVerilogでの1行コメントと複数行コメントの書き方、そしてmoduleが大きくなっても読みやすく保つためにデジタル設計者が使うドキュメンテーションパターン。
データ型と数値
- wireとregVerilogの2つの主要なデータ型 - 連続接続の`wire`と手続きストレージの`reg` - そして毎回どちらを選ぶかのルール。
- Vectorと配列`[7:0]`でマルチビットsignalを宣言し、スライスし、組み合わせる方法、そしてpacked vectorとmemory配列の違い。
- Parameter`parameter`と`localparam`でコンパイル時の定数を定義し、幅や深さをparameter化し、moduleをインスタンス化するときに値をオーバーライドする方法。
- 数値リテラルVerilogが定数をどう書くか:sized vs unsized、`'b`/`'h`/`'d`/`'o`のbase、signed数、可読性のためのアンダースコア、初心者を引っかける罠。
- XとZの値Verilogのsignalは2つではなく4つの値を持ちます。シミュレーションにおける`x`(未知)と`z`(ハイインピーダンス)の意味と、デバッグ方法。
演算子
モジュールと構造
手続き型ブロック
- always block`always`ブロックの動作、組み合わせ`always @(*)`とクロック同期`always @(posedge clk)`の違い、各々がどんなハードウェアを生成するかを決めるルール。
- initial block`initial`ブロックが`always`とどう異なるか、シミュレーションでしか存在しない理由、そしてそれが使われる一般的なパターン(刺激、波形セットアップ、ログヘッダ)。
- Blocking vs 非blocking初心者Verilogで最も混同される話題。`always`ブロック内で`=`と`<=`が実際に何を意味するか、そしてほとんどの競合状態を防ぐルール。
制御フロー
順序論理とFSM
テストベンチとシミュレーション
- testbenchの基礎Verilog testbenchの書き方。クロック生成、resetシーケンス、刺激、観察、そして実行するすべてのシミュレーションを駆動する標準骨格。
- DisplayとMonitor`$display`、`$write`、`$monitor`の動作。使うフォーマット指定子、それらの違い、どれがどんな場面で正しいツールか。
- DumpfileとVCDtestbenchにVCD波形出力を追加する方法。`$dumpfile`、`$dumpvars`、スコープ選択、そして結果ファイルをGTKWaveやブラウザエディタで表示する方法。
- Timescaleと遅延`` `timescale ``ディレクティブが`#delay`の単位を設定する方法、ファイル間で異なる単位を組み合わせるルール、遅延がクロック同期ロジックとどう作用するか。