SV
モジュール名の後に、( ) で括ってポート宣言を記述する。ポートが複数ある場合は、',' (コンマ)で区切る
module test (
input [7:0] a,
input signed [15:0] b, c,
output y );
...
endmodule
module_ansi_header ::=
{ attribute_instance } module_keyword [ lifetime ] module_identifier { package_import_declaration }
[ parameter_port_list ] [ list_of_port_declarations ] ;
入出力方向は、input, output, inout のいずれか。
input [3:0] p0 // wire (記憶しない)
, output p1 // wire (記憶しない)
, output int p2 // 32-bit wire
// 記述順序は、方向、wire(net), reg, range, 名前
上記のような宣言では、ポートは wire と同じ扱いになる。つまり値を記憶しない。
reg をつけると reg 扱いになる。reg は入出力方向とビット範囲の間に記述する。
, output reg [7:0] p2 // reg (記憶する)
// 記述順序は、方向、wire(net), reg, range, 名前
通常はこれ。下を参照
[ net_port_header | interface_port_header ] port_identifier { unpacked_dimension } [ = constant_expression ]
[ variable_port_header ] port_identifier { variable_dimension } [ = constant_expression ]
[ port_direction ] . port_identifier ( [ expression ] )
入出力と port_kind は、前のポートの属性が引き継がれる
data_type は logic になる
特別な場合としてポートが存在しない場合がある。この場合、( ) の中に何も書かない。あるいは ( ) そのものを省略できる。
module test ( ) ; // ポート無しのモジュール
module test ; // ポート無しのモジュール
ansi のモジュールヘッダの構成要素。ansi_port_declaration は上を参照。
list_of_port_decl ::= ( [ {attr} ansi_port_decl {, {attr} ansi_port_decl } ] )
[net_port_header | interface_port_header ] port_id { unpacked_dimenstion } [ = constant_expression ]
module mod_00 (
....
, port_000 // 名前のみ。種類等は直前ポートにより決まる
// 最初のポートで名前以外が省略されたときは、non-ANSI型のポート並びとみなされる
// net 型
, integer port_100 // 型 or 暗黙型(符号有無+次元)
// 入出力方向、net/var は直前のポートを引き継ぐ
// 最初のポートのときは、inout と wire
, [5:0] port_102 // 同上
, signed [5:0] port_104 // 同上。構文的に1-bitのsignedも書けるが無意味
, [ ] port_d_103 // unsized dimension
, wire port_105 // 暗黙型がデフォルト
// 入出力方向は直前のポートを引き継ぐ。データ型はlogic
// 最初のポートの時は inout と logic
, wire integer port_106 // 方向は同上
, wire [6:0] port_107 // 方向は同上
, wire unsigned [6:0] port_108 // 方向は同上
, net_type_id port_109
, interconnect [5:0] port_110
, input integer port_120 // 型 or 暗黙型(符号有無+次元)
// wire/var は直前のポートを引き継ぐ
// 最初のポートの時、output なら var、input/inout なら wire
, input [5:0] port_122
// wire/var は直前のポートを引き継ぐ
// 最初のポートの時、wire (output で 暗黙型の時)
, input signed [5:0] port_124 // 同上。構文的に1-bitのsignedも書けるが無意味
, input [ ] port_d_123 // unsized dimension
, input wire port_125 // 暗黙型がデフォルト
, input wire integer port_126
, input wire [6:0] port_127
, input wire unsigned [6:0] port_128
// interface 型
, if_00 port_200 // if_00 は定義済み interface
, if_01.mod_A port_201
, interface port_202
, interface port_203
// 配列
, port_300 [3]
, port_301 [P_NUM-1] // 定数式
, output wire [3:0] port_310 [10]
// 定数
, port_400 = 0
, port_401 = -2
. port_402 = P_NUM-3
, port_403 = (P_NUM) ? 1 : 0
, output wire p_410 = 0
ポート名のみ : 2
net/interface ポート名 : 1 2
net ポート名
netポート型 ポート名
ポート方向 netポート型 ポート名
interface ポート名
interface 名付
インターフェイス名 ポート名
インターフェイス名 . modport名 ポート名
interface 宣言付き
interface ポート名
interface . modport名 ポート名
配列ポート : 2 3 unpack の次元
多次元配列ポート
ポート名 = 定数 : 2 4
net_port_header ::= [port_direction] net_port_type
port_direction ::= input | output | inout | ref
net_port_type ::= [ net_type ] data_type_or_implicit // net_type は通常 wire
| net_type_id
| interconnect implicit_data_type
interface_port_header ::=
interface_id [ . modport_id ]
| interface [ . mod_id ]
以下は別の場所に移す予定
data_type_or_implicit ::= data_type | implicit_data_type
data_type ::= いろいろ
implicit_data_type ::= [ signing ] { packed_dimension }
signing := singed | unsigned
packed_dimension ::= [ constant_range ] | unsized_dimension
unpacked_dimension ::= [ constant_range ] | [ constant_expression ]
constant_range ::= constant_expression : constant_expression
constant_expression ::= constant_primarry
| unary_op { attr } constant_primary
| constant_exp binary_op { attr } constant_exp
| constant_exp ? { attr } constant_exp : constant_exp
unsized_dimension ::= [ ]
[variable_port_header] port_id { variable_demenstion } [=constant_expression]
variable_port_header ::= [port_direction] var_data_type
var_data_type ::= data_type | var data_type_or_implicit
[ 1 ] 2 { 3 } [ 4 ]
module mod_00 (
....
, port_000 // 名前のみ。種類等は直前ポートにより決まる
// 最初のポートで名前以外が省略されたときは、non-ANSI型のポート並びとみなされる
// 変数型
, integer port_100
// 入出力方向、net/var は直前のポートを引き継ぐ
// 最初のポートのときは、inout と wire
, var port_101 // ERROR. inout cannot be var
, input var port_102 // 暗黙型のデフォルト
, input var integer port_103
, input var [3:0] port_104
, output integer port_105
// 配列
, output integer port_205 [8]
// 定数
, output integer port_300 = 0
ポート名のみ : 2
variable ポート名 : 1 2
var型 ポート名
ポート方向 var型 ポート名
配列ポート : 2 3 variable の次元
多次元配列ポート
ポート = 定数 : 2 4
[port_demension] . port_id ( [expression] )
[ 1 ] 2 3 4 [5] 6
module mod_00 (
output .P1 ( r[3:0 )
, input .Y (x )
);
( ) 内省略
ポート次元をつける。( ) 内は省略
( ) 内に式を書く
入出力方向などは省略できる。基本的に直前のポートの設定を引き継ぐ。
最初のポート
入出力方向を省略した時は、inout とみなされる
データ型を省略した時は、logic とみなされる(interface の場合を除く)
port_kind を省略した時
input/inout のときはデフォルト ( `default_nettype で変更可能 )
output のとき、データ型が指定されていれば同様にデフォルト。そうでないときはややこしいので省略
ref のときは variable
全部省略されたときは、non-ANSI スタイルのポートリストとみなされる
2番目以降のポート
入出力と port_kind は、前のポートの属性が引き継がれる
data_type は logic になる
その他
ポートにデフォルト値を指定できるが、あまり使われないので省略。