|
Verilog HDL 簡易マニュアル
|
|
Verilog HDL 簡易マニュアル
|
|
========
|
|
========
|
|
|
|
|
|
|
|
## はじめに
|
|
|
|
|
|
|
|
Verilogは、ハードウェア設計のための記述言語(HDL: Hardware Description Language)です。C言語などの手続き型プログラミング言語と異なり、**物理的な回路構造とその振る舞いを記述するための言語**です。手続き型言語では「命令を順に実行する」ことが基本となっていますが、HDLでは**同時に動作する回路構造(並列性)**を表現するのが特徴です。回路図をテキストとして記述していると考えると分かりやすいと思います。
|
|
|
|
|
|
|
|
Verilogでの基本構成は以下のようになります:
|
|
|
|
|
|
|
|
- `module`:回路の構造ブロック(部品)
|
|
|
|
- `input` / `output`:端子
|
|
|
|
- `wire` / `reg`:信号線やレジスタ(信号の種類)
|
|
|
|
- `wire` は常に接続されている線、と考えるとよいと思います、モジュール間の接続、ピンの入出力など、の用途に使います
|
|
|
|
- `reg` は記憶を持つ変数であり、フリップフロップ、状態変数など、クロックなどに応じて値が変化するような用途に使います
|
|
|
|
|
|
|
|
例:
|
|
|
|
```verilog
|
|
|
|
wire a, b, y;
|
|
|
|
assign y = a & b; // wire への assign
|
|
|
|
|
|
|
|
reg state;
|
|
|
|
always @(posedge clk) begin
|
|
|
|
state <= next_state; // reg への代入(順序回路)
|
|
|
|
end
|
|
|
|
|
|
|
|
reg sum;
|
|
|
|
always @(*) begin
|
|
|
|
sum = in1 + in2; // 組合せ回路の記述にも reg は使用可能
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
- `assign`:**組合せ回路の論理式を記述するための代入文**。`wire` 型の信号に対して使用され、常に右辺の論理式に応じて出力が変化します。
|
|
|
|
- `always`:**条件に基づく処理(順序回路や条件に基づいた組み合わせ回路)を記述するブロック**。
|
|
|
|
- `always @(posedge clk)` などクロックを指定して、**フリップフロップを使った順序回路の動作**を記述することができます。
|
|
|
|
- `always @(*)` のようにセンシティビティリストに `*` を使って、**条件に基づいた組み合わせ回路**を記述することができます。
|
|
|
|
|
|
|
|
ここでは Verilog の基本的な module の書き方や testbench の作成方法を簡潔に解説します。
|
|
|
|
|
|
## 代入
|
|
## 代入
|
|
|
|
|
|
```
|
|
```
|
... | | ... | |