11.ディレクティブ
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 言語のプリプロセッサを使うこともできます。