10.システムタスク
NSLはVerilog HDLへのシンセサイズに限り、
Verilog HDL互換のシステムタスクを使用することが可能です。
システムタスクは主にデバッグの補助を行う構文で、シミュレーションに用います。
以下の表10がNSLで使用可能なシステムタスクの一覧です。
NSLの場合は、シンセサイズの関係で”$”の代わりに”_”アンダーバーをつけます。
システムタスクコマンド | 対応するVerilog-HDLのシステムタスク | 意味 |
---|---|---|
_display _monitor _finish _readmemb _readmemh |
$display $minitor $finish $readmemb $readmemh |
コマンドラインに値を表示 コマンドラインに値を表示 シミュレーションの終了 メモリファイル(2進数)の読み出し メモリファイル(16進数)の読み出し |
システムタスクの使用方法はVerilog-HDLと変わりません。
“$”の代わりに”_”アンダーバーをつけることで、
後はVerilog-HDLと同じようにシステムタスクを使用することが可能です。
また、この構文はシミュレーション用であるため、
システムタスクを含むモジュールを論理合成した場合、
システムタスク部分は実回路に反映しません。
システムタスクの使用例として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 の記述例を提示します。
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 の記述例を提示します。
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); } |