Open4

Verilog文法を勉強しよう

fastriverfastriver

数字(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に準拠

fastriverfastriver

モジュール(IEEE 1364 12.1)

module [モジュール名] ( [ポート宣言] );
// netとかmoduleとかintとかtaskとかparameterとかたくさん
[色々宣言]

// moduleの初期化処理
initial [文]

// クロックやポート変化で行う処理
always [文]

endmodule

無視したもの

  • attribute instances: moduleの前に()で括って書く
  • parameter declarations: モジュール名とポート宣言の間に(と)で括って書く
fastriverfastriver

ネットと変数(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];