11.ディレクティブ

NSLにはC言語のようなディレクティブをいくつか用意しています。
本章ではNSLのディレクティブについて解説します。

includeディレクティブ

includeディレクティブは外部のソースコードファイルを展開するディレクティブです。
includeディレクティブの表記方法は以下の様になっています。

#include <ファイルパス名>

ファイルパス名はincludeディレクティブを表記したモジュールを基点として記述します。
includeディレクティブの例として以下の例題??を見てみましょう。

例としてまず、sub_ex42.nslというファイル名で以下のsub_ex42というモジュールを作ります。

【ディレクティブ例1】

	declare sub_ex42 {
		input a[4], b[4] ;
		output o[4] ;

		func_in exec(a, b) ;
	}
	module sub_ex42 {
	    function exec {
	        o = a + b ;
	    }
	}

	
【ディレクティブ例1】

	#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 ディレクティブの記述例題を以下に示します。

【ディレクティブ例2】

 #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 言語のプリプロセッサを使うこともできます。