10.システムタスク

NSLはVerilog HDLへのシンセサイズに限り、
Verilog HDL互換のシステムタスクを使用することが可能です。

システムタスクは主にデバッグの補助を行う構文で、シミュレーションに用います。
以下の表10がNSLで使用可能なシステムタスクの一覧です。
NSLの場合は、シンセサイズの関係で”$”の代わりに”_”アンダーバーをつけます。

【表10.NSLのシステムタスク】
システムタスクコマンド 対応するVerilog-HDLのシステムタスク 意味
_display
_monitor
_finish
_readmemb
_readmemh
$display
$minitor
$finish
$readmemb
$readmemh
コマンドラインに値を表示
コマンドラインに値を表示
シミュレーションの終了
メモリファイル(2進数)の読み出し
メモリファイル(16進数)の読み出し

システムタスクの使用方法はVerilog-HDLと変わりません。
“$”の代わりに”_”アンダーバーをつけることで、
後はVerilog-HDLと同じようにシステムタスクを使用することが可能です。

また、この構文はシミュレーション用であるため、
システムタスクを含むモジュールを論理合成した場合、
システムタスク部分は実回路に反映しません。

システムタスクの使用例としてdisplayとmonitorを用いた例を以下に示します。

【例題43.システムタスク displayとmonitorの例】
declare ex43 {
    input a[4], b[4] ;
    output f[4] ;
}
module ex43 {
    reg trigger[4] = 0 ;
    reg r1[4] = 0 ;
    proc_name proc1, proc2 ;

    trigger := { trigger[3:1], 0b1 } ;
    if(trigger == 0b0111) proc1() ;

    proc proc1 {
        r1 := r1 + 0x1;

        if(r1 > 10) proc2() ;

        _display("a = %d, b = %d", a, b) ;
        _monitor("r1 = %d", r1) ;
    }
    proc proc2 {
        f = r1 ;
        finish() ;
    }
}

システムタスク finish はシミュレーションを終了するコマンドです。
以下にシステムタスク finish の記述例を提示します。

【記述例題.44 システムタスク finish の例】
declare ex44 {
    func_in exec_add ;
}
module ex44 {
    reg sum[8] = 0 ;
    reg cnt[4] = 0 ;

    function exec_add seq {
        for(cnt:=0; cnt<10; cnt++) {
            sum := sum + 0x01 ;
            if(cnt==0b0110) _finish() ;
        }
    }
}

システムタスク readmemh, readmembは外部ファイルを参照し、
シミュレーション結果に反映するコマンドです。
このコマンドにより、シミュレーション内におけるメモリのデータを、
外部のテキストファイルなどで初期値を与えることができます。
次にシステムタスク readmemh の記述例を提示します。

【例題.45 システムタスク readmemh の例】
declare ex45 {
    input in_adr[8], in_data[8] ;
    output outdata[8] ;
    func_in write(in_adr, in_data) ;
    func_in read(in_adr) ;
}
module ex45 {
    mem memory[256][8] ;

    alt {
        write : memory[in_adr] := in_data ;
        read  : outdata = memory[in_adr] ;
    }

    _readmemh("neko.txt", memory);
}