Open4
Verilog文法を勉強しよう
Verilog仕様書
IEEE 1364で策定されている
IEEE/IEC 62530ではSystemVerilogと共に定義され直しているが、どこまでがVerilogなのかがわからない
数字(IEEE1364 3.5)
整数(IEEE1364 3.5.1)
普通の数字(10進数)
659
[1-9][0-9|_]*
- 普通の数字を書くと、10進数として扱われる
- 数字の間には
_
アンダースコアを入れても良い(無視される)
ビット幅と基数付きの数字
ビット幅なし
'h 837FF : 16進数 = 538623
'o7460 : 8進数 = 3888
ビット幅あり
4'b1001 : 4ビットバイナリ 1001
5 'D 3 : 5ビット10進数
3'b01x : 3ビットバイナリ 01x。最右ビットは不定
12'hx : 12ビット全て不定
16'hz : 16ビット全てハイインピーダンス
-8 'd 6 : 8ビット6の2の補数
4 'shf : 4ビット符号あり16進数1111 = 0001
-4 'sd15 : 4ビット符号あり15の2の補数 = 0001
16'sd? := 16'sbz
[ビット幅] '[基数] [基数表示された数字]
- ビット幅はなくても良い
- 32bitに満たない場合は32bitになる
- 足りない場合、左を0埋めされる
- 最左がx|zの場合は、それで埋められる
- 基数はアルファベット大文字小文字区別なし
- b|B: 2進数
- o|O: 8進数
- d|D: 10進数
- h|H: 16進数
- 基数の前に's'をつけると後ろの数字が符号付きで扱われる(付けない場合は符号なし)
- アポストロフィと基数の間にスペースを空けてはいけない
- プラスマイナスはビット幅より前につける
- 基数の後の数字には付けられない
- 数字内のx|Xは不定、z|Z|?はハイインピーダンスを表現
- 数字の間には
_
アンダースコアを入れても良い(無視される)
実数(IEEE 1364 3.5.2)
IEEE 754に準拠
モジュール(IEEE 1364 12.1)
module [モジュール名] ( [ポート宣言] );
// netとかmoduleとかintとかtaskとかparameterとかたくさん
[色々宣言]
// moduleの初期化処理
initial [文]
// クロックやポート変化で行う処理
always [文]
endmodule
無視したもの
- attribute instances: moduleの前に(と)で括って書く
- parameter declarations: モジュール名とポート宣言の間に(と)で括って書く
ネットと変数(IEEE 1364 4.2)
ネット定義(IEEE 1364 4.2.1)
wire [ワイヤー名];
wire [ビット幅] [ワイヤー名];
wire [ワイヤー名1], [ワイヤー名2], ...;
wire [ビット幅] [ワイヤー名1], [ワイヤー名2], ...;
wire a;
wire [3:0] b;
wire c,d,e;
wire [7:0] f, g, h, i;
変数定義(IEEE 1364 4.2.2)
レジスタだけ
reg [変数名];
reg [ビット幅] [変数名];
reg [ビット幅] [変数名] [次元];
reg [ビット幅] [変数名1], [変数名2], ...;
reg [ビット幅] [変数名1] [次元1], [変数名2] [次元2], ...;
reg a;
reg [31:0] b; // 32bitのレジスタ
reg [31:0] c [3:0]; // 32bitのレジスタ16個の配列
reg [31:0] d,e,f;
reg [31:0] g,h [3:0];