開発日記

Erlangをダラダラ書きます。

System verilog 文法メモ

前置き

  • どの部分が並列に実行されているか(always)

  • どの部分は常に繋がっているか(alwaysの外)

  • 値はどのように初期化するか(initial)

  • C言語でいう変数はどうやって作るか(regとかlogic,幅を忘れずに)

  • 計算で意識することは何か(幅を合わせて計算すること)

  • デバッグはどうする(テストベンチとシミュレータ(vivado, verilator ...))

  • テストベンチはどう書く(timescale, $display, #時間)

  • 数字の指定は(ビット数,クウォーテーション,フォーマット,値)

  • vivadoのシミュレータは?(xvlog, xelob, xsim)

yuyargon.hatenablog.com

文法

reg
  • regはクロックと同期して値が変化

  • regはinitialで初期化(for文でも可能,ただし同時に実行される)

  • regはalways, function, taskなどで代入処理し値を更新可能

  • regは代入は <=

  • regは定義の時は値を指定しない

  • regは1クロックにつき1回しか代入できない(並列処理のため)

  • regはalways文の場合,読み出しが書き込みより先に起こる

  • regは多次元配列も可能

wire
  • wireは常に値が変化(するかも)

  • wireは一度定義(配線)したら変更することはない

  • wireはmoduleの入出力に関しては,assignで配線を指定可能

  • wireは定義(配線)は =

  • wireは一文で必ず定義(三項演算子多用)

logic
  • logicはwireにもregにもなれる
parameter, localparam
  • parameterとlocalparamはパラメータ(定数)設定に用いる

  • parameterは外部のmoduleからも参照可能(localparamは参照不可)

  • parameterはモジュール間で受け渡し可能(#(...))

struct
  • structは構造体を作成する(typedef struct { } 名前;)

  • structは . でメンバ変数にアクセス可能

module
  • moduleはポート宣言が必要

  • moduleはparameterの設定も可能

task
  • taskは複数の処理をまとめて記述できる(always内で使用可能)

  • taskは引数を指定可能

  • taskはoutput(返り値)は指定できない

function
  • functionは複数の処理をまとめて記述できる(always内で使用可能)

  • functionは引数を指定可能

  • functionはoutput(返り値)を指定可能

  • functionは中でtaskを呼び出しは不可

演算
  • 演算はビット長を常に意識

  • 演算はビット演算などを行うときは桁数に余裕を持たせる(繰り上がり注意)

  • 括弧を常に使用(優先順位を間違えないように)

符号あり
  • 符号ありは$signedを使用
算術右シフト
  • 算術右シフトは$signedと>>>を組み合わせて使用