Overtone NSL Support

NSLサポートページ



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

#ifdef < マクロ>

シンボル名が定義されていた時に、else またはendif ディレクティブまでが有効になります。

PAGE TOP