LRM読解(Chap.3 データタイプ~型の種類)

2008/09/02Verilog::文法import

データタイプ~型の種類[LRM Chap.3]

値 [3.1]

Verilog-HDLには下記の4つの値しか存在しません. *1ただし,NET型では論理値に強度(Strength)を与えることができます.(LRM Chap.7)

文字説明
0論理値0,もしくはfalse状態を示す
1論理値1,もしくはtrue状態を示す
x論理値不定を示す
zHigh Impedance状態を示す

NET型とVariable型 [3.2]

NET

値を保持することは無く,PAD間をつなぐための配線材相当である.syntaxを引用する.

net_declaration ::= (From Annex A - A.2.1.3)
    net_type [ signed ] [ delay3 ] list_of_net_identifiers ;
  | net_type [ drive_strength ] [ signed ] [ delay3 ] list_of_net_decl_assignments ;
  | net_type [ vectored | scalared ] [ signed ] range [ delay3 ] list_of_net_identifiers ;
  | net_type [ drive_strength ] [ vectored | scalared ] [ signed ] range [ delay3 ] list_of_net_decl_assignments ;
  | trireg [ charge_strength ] [ signed ] [ delay3 ] list_of_net_identifiers ;
  | trireg [ drive_strength ] [ signed ] [ delay3 ] list_of_net_decl_assignments ;
  | trireg [ charge_strength ] [ vectored | scalared ] [ signed ] range [ delay3 ] list_of_net_identifiers ;
  | trireg [ drive_strength ] [ vectored | scalared ] [ signed ] range [ delay3 ] list_of_net_decl_assignments ;

net_type ::= (From Annex A - A.2.2.1)
    supply0 | supply1
  | tri | triand | trior | tri0 | tri1
  | wire | wand | wor

drive_strength ::= (From Annex A - A.2.2.2)
   ( strength0 , strength1 )
  | ( strength1 , strength0 )
  | ( strength0 , highz1 )
  | ( strength1 , highz0 )
  | ( highz0 , strength1 )
  | ( highz1 , strength0 )

strength0 ::= supply0 | strong0 | pull0 | weak0

strength1 ::= supply1 | strong1 | pull1 | weak1

charge_strength ::= ( small ) | ( medium ) | ( large )

delay3 ::= (From Annex A - A.2.2.3)
  # delay_value | # ( delay_value [ , delay_value [ , delay_value ] ] )

delay2 ::=
  # delay_value | # ( delay_value [ , delay_value ] )

delay_value ::=
    unsigned_number
  | parameter_identifier
  | specparam_identifier
  | mintypmax_expression

list_of_net_decl_assignments ::= (From Annex A - A.2.3)
  net_decl_assignment { , net_decl_assignment }

list_of_net_identifiers ::=
  net_identifier [ dimension { dimension }]
  { , net_identifier [ dimension { dimension }] }

net_decl_assignment ::= (From Annex A - A.2.4)
  net_identifier = expression

dimension ::= (From Annex A -A.2.5)
  [ dimension_constant_expression : dimension_constant_expression ]

range ::=
  [ msb_constant_expression : lsb_constant_expression ]

(かなりテキトウな理解)
要は,配線と思えばよい?.

  • wire - 単純に端子?間を結ぶ
  • tri - tri-state?何に使うんだろうな...

Variable

syntaxを引用する.値を保持できる器となります.

integer_declaration ::= (From Annex A - A.2.1.3)
  integer list_of_variable_identifiers ;

real_declaration ::=
  real list_of_real_identifiers ;

realtime_declaration ::=
  realtime list_of_real_identifiers ;

reg_declaration ::=
  reg [ signed ] [ range ] list_of_variable_identifiers ;

time_declaration ::=
  time list_of_variable_identifiers ;

real_type ::= (From Annex A - A.2.2.1)
    real_identifier [ = constant_expression ]
  | real_identifier dimension { dimension }

variable_type ::=
    variable_identifier [ = constant_expression ]
  | variable_identifier dimension { dimension }

list_of_real_identifiers ::= (From Annex A - A.2.3)
  real_type { , real_type }

list_of_variable_identifiers ::=
  variable_type { , variable_type }

dimension ::= (From Annex A - A.2.5)
  [ dimension_constant_expression : dimension_constant_expression ]

range ::=
  [ msb_constant_expression : lsb_constant_expression ]

変数としては,下記の種類がある.integer, real, realtime, reg, time.



Vector [3.3]

NET/Variable宣言時に,型とシンボルの間に記述する.書式では'range'と記していたもの.VectorのReg/Netは,2を法とする,2^nの演算に従う.(n=ベクタのビット長)

range ::=
  [ msb_constant_expression : lsb_constant_expression ]

MSB>LSBである必要は無い.,2^(abs(MSB-LSB)).Noteにて,ここで確保可能なサイズについて記されている.

1) Implementations may set a limit on the maximum length of a vector, but they will at least be 65536 (216) bits.
2) Implementations do not have to detect overflow of integer operations.

1)最低でも,ベクタ長は 2^16(65536) をサポートすること.
2)整数演算のオーバフローは検出する必要は無い.



Arrays [3.10]

net/variable宣言時に,シンボル名の後ろに"[mm:ll]"で指定する.また,LRM 3.10.noteより,

Implementations may limit the maximum size of an array, but they shall at least be 16777216 (224).

Parameters [3.11]

Parametersは,variable型にも,net型にも属さない.また,変数ではなく,定数である.
module parameters と specify parameters とがある.Parameter宣言は,net型/parameter型/variable型で,既に宣言された名称で再定義することはできない.

Parameters

syntax

local_parameter_declaration ::= (From Annex A - A.2.1.1)
  localparam [ signed ] [ range ] list_of_param_assignments ;
  | localparam integer list_of_param_assignments ;
  | localparam real list_of_param_assignments ;
  | localparam realtime list_of_param_assignments ;
  | localparam time list_of_param_assignments ;

parameter_declaration ::=
  parameter [ signed ] [ range ] list_of_param_assignments ;
  | parameter integer list_of_param_assignments ;
  | parameter real list_of_param_assignments ;
  | parameter realtime list_of_param_assignments ;
  | parameter time list_of_param_assignments ;

list_of_param_assignments ::= (From Annex A - A.2.3)
  param_assignment { , param_assignment }

param_assignment ::= (From Annex A - A.2.4)
  parameter_identifier = constant_expression

range ::= (From Annex A - A.2.5)
  [ msb_constant_expression : lsb_constant_expression ]
  • list_of_param_assignmentsは,module itemの中か,module_parameter_port_list*2の中のみ記述可能.
  • param_assignmentsが,module_parameter_port_list内に存在しない場合,param_assignmentsはlocal parameterとなり,どんな手段でもoverride不可能となる.

Parameterの定数再定義について

runtimeに書き換えることはできません.しかし,module parameterは,compilation時に,module定義時の値と異なる値に書き換えることは可能です.これはmodule instanceのカスタムを許容します.
parameterの修正は,defparam文か,module instance文で修正可能です.

parameter文の代表的な使い方は,delay(遅延時間)や変数のビット幅(width)を定義するのに使います.Chap..12で詳細に記します.


module parameterはタイプ指定とrange指定(range)を持つことができます。以下の規則に従って、module parameterのタイプとrange(range)があるものとします.

  • タイプもrange指定もないparameter宣言は,すべての値のオーバーライドも適用された後の,パラメタに割り当てられた最終値のタイプとrangeをデフォルトとするものとします。
  • range指定はあるが,タイプ指定のないパラメタは,符号なしのパラメタ定義rangeになるでしょう.
    符号とrangeは,値のオーバーライドによる影響を受けさせないものとします.
  • range指定が無い,タイプ指定を伴うパラメタは,タイプ指定になるでしょう。
  • 符号ありparameterは,全ての値のオーバーライドを適用した後に,パラメタに割り当てられた最終値のrangeをデフォルトとするものとします、。
  • 符号あり,型指定ありかつrange指定ありのparameterは,符号あり・定義されたrangeとなるでしょう.符号・rangeは,値のオーヴァーライドによる影響を受けない.
  • range指定が無く,かつ,(符号あり型指定されているか,型指定が無い)parameter宣言は,LSB=0, MSBは最終的にparametaにアサインされた値が収まる大きさ以下となるでしょう.
  • range指定が無く,かつ,(符号あり型指定されているか,型指定が無い),かつ最終的にparametaにアサインされた値が符号なしとなるようなparameter宣言は,LSB=0, MSBは31となるでしょう.

// an implied range with an lsb equal to 0 and an msb equal to an implementation-dependent value of at least 31.

※直訳すぎてスミマセン.宣言時に省略した場合や上書きしたときのコンパイラの挙動について仕様が切られているようです.



Local parameters - localparam [3.11.2]

Verilog HDL localparamについて.local parameterは,defparam文や,並び順または名前付きの直接書き換えができません.local parameterは, - local parameter(s) are identical to parameters except that they can not directly be modified with the defparam statement or by the ordered or named parameter value assignment.

Local parameters can be assigned to a constant expression containing a parameter which can be modified with the defparam statement or by the ordered or named parameter value assignment.

See 12.1.3 for details. The syntax for local parameter declarations is given in Syntax 3-4.


Specify parameters[3.11.3]
specparam_declaration ::= (From Annex A - A.2.2.1)
  specparam [ range ] list_of_specparam_assignments ;

list_of_specparam_assignments ::= (From Annex A- A.2.3)
  specparam_assignment { , specparam_assignment }

specparam_assignment ::= (From Annex A - A.2.4)
  specparam_identifier = constant_mintypmax_expression
  | pulse_control_specparam

pulse_control_specparam ::=
  PATHPULSE$ = ( reject_limit_value [ , error_limit_value ] ) ;
  | PATHPULSE$specify_input_terminal_descriptor$specify_output_terminal_descriptor
  = ( reject_limit_value [ , error_limit_value ] ) ;

error_limit_value ::=
  limit_value

reject_limit_value ::=
  limit_value

limit_value ::=
  constant_mintypmax_expression

range ::= (From Annex A - A.2.5)
  [ msb_constant_expression : lsb_constant_expression ]

Table 8. Differences between specparams and parameters

Specparams(specify parameter)Specparams(specify parameter)
Use keyword specparamUse keyword parameter
Shall be declared inside a module or specify blockShall be declared outside specify blocks
May only be used inside a module or specify blockMay not be used inside specify blocks
May be assigned specparams and parametersMay not be assigned specparams
Use SDF annotation to override valuesUse defparam or instance declaration parameter value passing to override values


Name spaces [3.12]

*1 : 例外としてevent型(LRM9.7.3)があります.

*2 : referto SS.12