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
#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 ;
}
}