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);