Verilogポートを理解する:入力、出力、モジュール間通信
ポートは、特定のモジュールへの入力および出力として機能する一連の信号であり、モジュールと通信する主要な手段です。モジュールをPCB上に実装された製造済みチップと見なせば、チップと通信する唯一の手段がそのピンであることは明らかです。ポートはピンのようなもので、設計が外部と信号を送受信するために使われます。
ポートの種類
| ポート | 説明 |
|---|---|
| Input | 設計モジュールは input ポートを通じてのみ外部から値を受信可能 |
| Output | 設計モジュールは output ポートを通じてのみ外部へ値を送信可能 |
| Inout | 設計モジュールは inout ポートで値を送受信両方可能 |
wire タイプのネットと見なされます。構文
inout 宣言されたポートは入力と出力の両方として機能します。
input [net_type] [range] list_of_names; // 入力ポート
inout [net_type] [range] list_of_names; // 入出力ポート
output [net_type] [range] list_of_names; // ワイヤで駆動される出力ポート
output [var_type] [range] list_of_names; // 変数で駆動される出力ポート
例
以下のコードでは、3つの input ポート、1つの output ポート、1つの inout ポートがあります。
module my_design (
input wire clk,
input en,
input rw,
inout [15:0] data,
output int
);
// 設計振る舞いをVerilogコードで記述
endmodule
複数のポートに同じ 名前 を使うことは違法です。
input aport; // 最初の宣言 - 合法
input aport; // Error - 既に宣言済み
output aport; // Error - 既に宣言済み
符号付きポート
signed 属性はポート宣言、またはネット/reg宣言、または両方に付加できます。暗黙的なネットはデフォルトで 符号なし です。
module (input a, b, output c); // a, b, cはデフォルトで符号なし
endmodule
ネット/reg宣言のいずれかに signed 属性があれば、もう一方も符号付きと見なされます。
module (input signed a, b, output c);
wire a, b; // ポート宣言からa, bは符号付き
reg signed c; // reg宣言からcは符号付き
endmodule
ポート宣言のバリエーション
Verilog 1995
オリジナルのIEEE 1995版では、ポート宣言を以下のように行いました。モジュール宣言でまずポート名を括弧内にリストし、その方向をモジュール本体内で後から定義します。
module test (a, b, c);
input [7:0] a; // 入力"a"と"b"はワイヤ
input [7:0] b;
output [7:0] c; // 出力"c"はデフォルトでワイヤ
// それでもワイヤとして再宣言可能(混乱防止)
wire [7:0] a;
wire [7:0] b;
wire [7:0] c;
endmodule
module test (a, b, c);
input [7:0] a, b;
output [7:0] c; // デフォルトでcはワイヤタイプ
// ポート"c"をregタイプに変更
reg [7:0] c;
endmodule
Verilog 2001以降
2001年にANSI-Cスタイルのポート命名が導入され、ポートリスト内で型を指定できるようになりました。
module test (
input [7:0] a, b, // "b"は8ビット入力と見なされる
output [7:0] c
);
// 設計内容
endmodule
module test (
input wire [7:0] a,
input wire [7:0] b,
output reg [7:0] c
);
// 設計内容
endmodule
ポート宣言にネットまたは変数型が含まれる場合、そのポートは完全に宣言されたと見なされます。同じポートをネットまたは変数型宣言で再宣言することは違法です。
module test (
input [7:0] a, // a, eは暗黙的にワイヤタイプで宣言完了
output reg [7:0] e
);
wire signed [7:0] a; // 違法 - aの宣言は完了済み → シミュレータ依存
wire [7:0] e; // 違法 - eの宣言は完了済み
// 設計コードの残り
endmodule
ポート宣言にネットまたは変数型が含まれない場合、そのポートをネットまたは変数型宣言で再宣言できます。
module test (
input [7:0] a,
output [7:0] e
);
reg [7:0] e; // OK - net_typeが以前に宣言されていない
// 設計コードの残り
endmodule
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示
- VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ