System verilog 文法メモ
前置き
どの部分が並列に実行されているか(always)
どの部分は常に繋がっているか(alwaysの外)
値はどのように初期化するか(initial)
C言語でいう変数はどうやって作るか(regとかlogic,幅を忘れずに)
計算で意識することは何か(幅を合わせて計算すること)
デバッグはどうする(テストベンチとシミュレータ(vivado, verilator ...))
テストベンチはどう書く(timescale, $display, #時間)
数字の指定は(ビット数,クウォーテーション,フォーマット,値)
vivadoのシミュレータは?(xvlog, xelob, xsim)
文法
reg
regはクロックと同期して値が変化
regはinitialで初期化(for文でも可能,ただし同時に実行される)
regはalways, function, taskなどで代入処理し値を更新可能
regは代入は <=
regは定義の時は値を指定しない
regは1クロックにつき1回しか代入できない(並列処理のため)
regはalways文の場合,読み出しが書き込みより先に起こる
regは多次元配列も可能
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と>>>を組み合わせて使用