9.インターフェース

NSLでは通常、順序回路で用いるクロック信号とリセット信号を記述しません。
そして、コンパイル過程でクロック信号はm_clock、
リセット信号はp_resetという名前で入力データ端子を自動生成します。

インターフェース構文を使用すると、
m_clock、p_resetの入力データ端子の自動生成を取りやめることが可能です。

この機能は他言語で記述されたモジュールを再利用する場合や、
クロック信号、リセット信号を明示的に制御したい場合などに用います。

注意:
interfaceの有無にかかわらず、モジュール内で順序回路を記述した場合、
生成する回路のリセット信号名、クロック信号名は、
処理系で決められた名前を用いて自動合成します。
なお、リセット名・クロック名はコンパイラ側のオプションで名前を変更することができます。
デフォルトではp_reset,m_clockで自動合成します。

インターフェースの記述方法は以下の通りです。

declare モジュール名 interface {
// 入出力構成要素
}
module モジュール名 {
// 内部構成要素
// 動作記述部分
}

インターフェース構文の例として、例題40を見てみましょう。

【例題40.インターフェースの使用例】
declare	ex40_adder4 interface {
	input	clkin ;				// Clock input
	input	reset ;				// Reset input

	input	add_a[4] ;			// Add value A
	input	add_b[4] ;			// Add value B

	output	result_q[4] ;		// Result value Q
}

// #include	"ex40_adder4.def"

declare ex40 {
	input	sysclk ;			// Clock input
	input	sysrst ;			// Reset input

	input	add_a[4] ;			// Add value A
	input	add_b[4] ;			// Add value B

	output	result_q[4] ;		// Result value Q
}

module	ex40 {

	ex40_adder4		adder4 ;

	{
	// ******** Input signals ********
		adder4.clkin	= sysclk ;
		adder4.reset	= sysrst ;

		adder4.add_a	= add_a ;
		adder4.add_b	= add_b ;

	// ******** Output signals ********
		result_q		= adder4.result_q ;
	}


}
【例題41.インターフェースの使用例2】
#include      "ex41_synchronize.nsl"

declare	ex41 {
      input      LowerCLK ;

      input      Access_REQ ;
      output     Access_ACK ;
      input      Access_FIN ;
}

      module	ex41 {

      reg		internal_REQ[3] = 0 ;

      /* ******** Declare lower module ******** */

      EX41_Synchronize	sync_func ;

      {
      internal_REQ := { internal_REQ[1:0], Access_REQ } ;      // 3stage shift-register

      sync_func.m_clock	= LowerCLK ;            // Explicit CLOCK define.
      // BusREQ_in will be asserted at 3clock delayed from Access_REQ is asserter.
      sync_func.BusREQ_in      = internal_REQ[2] ;
      sync_func.BusACK_in      = Access_FIN ;

            Access_ACK      = sync_func.BusBUSY_out ;
      }
}