2018年12月17日月曜日

SystemVerilog~モデリングの文法~

SystemVerilogの書式など、備忘用にメモする。

logic

SystemVerilogで追加されたデータ型の一つ。regと似た型で、概ねregと同じ使い方ができる。regとの違いはポートリストの型として使う場合。1995/2001では入力はwire、出力はreg、入出力はwireだが、logicは入力にも使える。SystemVerilogでは入出力の型を合わせる必要があり、接続相手がlogicであれば、入力ポートであってもlogicとする。ただし、1995/2001と同様にwireはreg型など別の型と接続でき、インスタンス間の接続はwireで行う。SystemVerilogでも双方向ポートはwireで宣言する。


function

functionはその名の通り関数なので、引数と戻り値を持つ。1995/2001では戻り値としてビット幅を指定できるが、型は呼び出し側で指定する。SystemVerilogでは型の指定ができる。戻り値を持たないvoid型もある。void型以外は1995/2001同様に呼び出し側に代入して使う。void型では引数に出力を指定することでデータを渡す。


Verilog HDL 1995

wire [31:0] IFStage;

function [31:0] FUNC_IF;
  input [31:0] PC;
  begin
    FUNC_IF = mem[PC];
  end
endfunction // FUNC_IF

assign IFStage = FUNC_IF(PC);

  • 戻り値の型は指定できない。型は呼び出し時に決定する。
  • functionは関数定義なので、呼び出し側でwireやregに戻り値を代入する定義分が必要。
  • ステートメントが複数行ある場合、begin~endで括る必要がある

Verilog HDL 2001

wire [31:0] IFStage;

function [31:0] FUNC_IF(
  input [31:0] PC
);
  begin
    FUNC_IF = mem[PC];
  end
endfunction // FUNC_IF

assign IFStage = FUNC_IF(PC);

  • 引数をANSI Cのようにfunction名の後の丸括弧内に記述できる。
あとは、Verilog95と同じ。

SystemVerilog

bit [31:0] IFStage;
function bit [31:0] FUNC_IF(
  input [31:0] PC
);
  return mem[PC];
endfunction : FUNC_IF

IFStage = FUNC_IF(PC);

  • 戻り値の型(function [<型>] [<ビット幅>] <名前>(<ポート宣言>) を指定できる
  • 戻り値を関数名とせず、retrunで指定できる
  • ステートメントが複数行あってもbegin~endは必要ない
  • function~endfinction : [<コメント>] とラベルが貼れる
  • 呼び出して使うのは従来通り。



0 件のコメント:

コメントを投稿