モジュールの構造
前節ではモジュールの要素を動作の主体と客体で分類しましたが,ここではさらに別の観点で分類し,全体で何があるのかを説明します(表3.2).モジュールの記述は,
外部端子は,動作の主体か客体かによってさらに制御端子とデータ端子とに分けることができます.
外部端子の制御端子には外からの制御をあらわす制御入力端子と外への制御をあらわす制御出力端子があります.
外部端子のデータ端子には外からのデータ入力のためのデータ入力端子,外へのデータ出力のためのデータ出力端子,データの方向が双方向であるデータ双方向端子があります.
一方,構成要素には,モジュール内部の要素ということで,制御内部端子,ステージ,データ内部端子,レジスタ,メモリ,サブモジュールがあります.制御内部端子,ステージが動作の主体で,データ内部端子,レジスタ,メモリが動作の客体です.サブモジュールはその外部端子の種類毎に動作の主体か客体となります.
<表3.2> 外部端子と構成要素
構成要素定義の基本形式
外部端子と構成要素(ステージを除く)は,ともに次のような形式で定義されます.
タイプ名 インスタンス名{,インスタンス名};
なお.ここでタイプ名とは,組み込みのタイプ名か,他のモジュール名です.
たとえば,
reg flg ;
reg pc<32> ;
mem array[1024]<32> ;
は,おのおの「flg という名前の 1ビットのレジスタ」,「pc という名前の 32ビットのレジスタ」,「array という名前の 1024ワ−ド,32ビットのメモリ」の定義を表しています.このように <数> でビット幅を,[数] でワード数を指定できます.ただしワード数を指定できるのはタイプ名が mem の場合だけです.
4種類あるデータ内部端子の定義
データ内部端子定義用のタイプ名には sel,bus,sel_v,bus_v の四つがあります.ここではこれらの使い分けを説明します.まず sel と bus ですが,これらは
sel:論理ゲートによるセレクタをあらわします.これらのタイプ名で定義したデータ内部端子では,SFLEXPによる論理合成時にそのデータ内部端子の前後が別々に論理圧縮されます.つまり,データ内部端子はSFLEXPの合成結果に含まれます.bus:3ステートによるセレクタ
次に sel_v と bus_v ですが,これらはSFLEXPによる論理合成時に,可能であれば,このデータ内部端子を含む全体の論理が圧縮されます.つまり,これらのタイプ名で定義されたデータ内部端子自体が,論理圧縮の対象となります.ちなみに v は virtual の v です.もし,論理圧縮が困難であれば,おのおの sel,bus と同じ扱いとなります.
レジスタ,メモリの定義
レジスタ定義用のタイプ名には,レジスタの初期値の扱い方によって次の三つがあります.
reg :パワーオンによってレジスタ内容がセットもリセットもされないレジスタメモリは機能回路の中でのみ使えます.さらに次の制限があります.reg_ws :パワーオンによってレジスタ内容がセットされるレジスタ (with set)
reg_wr :パワーオンによってレジスタ内容がリセットされるレジスタ (with reset)
メモリのワ−ド数は 227 (134217728) までで,かつ 2のべき乗でなければなりません.またワード数を省略することはできません.なおメモリのアドレスは 0 から始まります.
また,レジスタやメモリ,データ端子のビット幅は 1ビットから 256ビットまでです.ビット幅の指定が省略されると,1ビットと見なされます.