NSLにはC言語のようなディレクティブをいくつか用意しています。
本章ではNSLのディレクティブについて解説します。
includeディレクティブ
includeディレクティブは外部のソースコードファイルを展開するディレクティブです。
includeディレクティブの表記方法は以下の様になっています。
#include <ファイルパス名>
ファイルパス名はincludeディレクティブを表記したモジュールを基点として記述します。
includeディレクティブの例として以下の例題??を見てみましょう。
例としてまず、sub_ex42.nslというファイル名で以下のsub_ex42というモジュールを作ります。
declare sub_ex42 {
input a[4], b[4] ;
output o[4] ;
func_in exec(a, b) ;
}
module sub_ex42 {
function exec {
o = a + b ;
}
}
#include "sub_ex42.nsl"
declare ex42 {
input inA[4], inB[4] ;
output outF[4] ;
}
module ex42 {
reg result[4] ;
sub_ex42 U_SUB ;
result := U_SUB.exec(inA, inB).o ;
}
defineディレクティブ
NSLで記述したモジュールを下位モジュールとして呼び出す場合、パラメータを与えるためにdefineディレクティブがあります。
(Verilog-HDL/VHDL/System-C で記述されたモジュールにパラメータを与える場合はパラメータ構文を利用します)
defineディレクティブはC言語と同じように、文字列や式を別の文字列などに置換するディレクティブです。
例えば、”0′b0″ を”ZERO” と置き換えることが可能となります。ただし、NSL 予約語は置き換えられません。
記述法としては、
#define < マクロ定義する文字列> < 置き換えられる定数および式>
となります。文字列は大文字小文字を区別します。
定義した文字列はNSL のソース中で使うことができます。
定義した文字列をモジュール名などの識別子中で利用するには、文字列を%%で囲います。
また、定義した文字列に対して+/- で定数を加算、減算するように記述することが可能です。
define ディレクティブの記述例題を以下に示します。
#define VAL_ZERO 0b00000000
#define VAL_ONE 0b00000001
#define VAL_MAX 0b00010000
declare test_define {
func_out cnt_end_call ;
}
module test_define {
reg cnt[8] ;
any {
cnt == VAL_MAX : {
cnt := VAL_ZERO ;
cnt_end_call() ;
}
else : cnt := VAL_ONE + cnt ;
}
}
ifdef / ifndef / else / endif ディレクティブ
NSL では、C 言語と同じifdef やendif といったディレクティブを使うことができます。NSL の標準プリプロセッサ
では以下のディレクティブがサポートされています。
.. ifdef
.. ifndef
.. else
.. endif
使い方は以下の通りです。
#ifdef < マクロ>
シンボル名が定義されていた時に、else またはendif ディレクティブまでが有効になります。
#ifndef < マクロ>
シンボル名が定義されていなかった時に、else またはendif ディレクティブまでが有効になります。
#else
ifdef/ifndef ディレクティブの条件が成立しなかった時、endif ディレクティブまでが有効になります。
#endif
ifdef/ifndef/else ディレクティブの効果範囲を終了させます。
また、C 言語のプリプロセッサを使うこともできます。
#ifdef < マクロ>
シンボル名が定義されていた時に、else またはendif ディレクティブまでが有効になります。