図2には本発明に係るデータ処理装置が適用されたシングルチップマイクロコンピュータのブロック図が例示される。
同図に示されるシングルチップマイクロコンピュータ1は、全体の制御を司るCPU2、バスコントローラ(BSC)3、割込コントローラ(INT)4、CPU2の処理プログラムなどを格納するメモリであるROM5、CPU2の作業領域並びにデータの一時記憶用のメモリであるRAM6、タイマ7、シリアルコミュニケーションインタフェース(SCI)8、A/D変換器9、第1乃至第9入出力ポート(IOP1〜IOP9)10A〜10I、クロック発振器(CPG)11の機能ブロック若しくはモジュールから構成され、公知の半導体集積回路製造技術により1つの半導体基板(半導体チップ)上に形成される。
前記シングルチップマイクロコンピュータ1は、電源端子として、グランドレベル(Vss)、電源電圧レベル(Vcc)、アナロググランドレベル(AVss)、アナログ電源電圧レベル(AVcc)、の印加端子を有し、更に専用制御端子として、リセット(RES)、スタンバイ(STBY)、モード制御(MD0、MD1)、クロック入力(EXTAL、XTAL)の各端子を有する。
各入出力ポート10A〜10Iは、アドレスバス、データバス、バス制御信号あるいはタイマ7、SCI8、A/D変換器9の入出力端子と兼用されている。
CPG11の端子EXTAL、XTALに接続される水晶発振子またはEXTAL端子に入力される外部クロックに基づいて生成される基準クロック(システムクロック)に同期して、シングルチップマイクロコンピュータ1は動作を行う。この基準クロック1周期をステートと呼ぶ。
シングルチップマイクロコンピュータ1の機能ブロックは、内部バス12によって相互に接続さる。内部バス12はアドレスバス、データバス、及びコントロールバスから成る。コントロールバスは、リード信号・ライト信号・バスサイズ信号をエンコードしたバスコマンド等を伝達する。
上記機能ブロック若しくはモジュールは内部バス12を介して、CPU2によってリード/ライトさる。内部バス12のデータバス幅は、例えば32ビットとする。内蔵ROM5、RAM6は1ステートでリード/ライト可能とされる。尚、バスコントローラ3、割込みコントローラ4、タイマ7、SCI8、A/D変換器9、入出力ポート10A〜10I、及びCPG11が有する制御レジスタを総称して、内部I/Oレジスタと呼ぶ。
前記バスコントローラ(BSC)3は、CPU2からバスコマンドBCMD、アドレスバスIABからアドレス信号を入力して、所要のバス制御を行う。アドレスバスIABで指定されるアドレスに対して、それぞれ固有若しくは選択されたバス幅、アクセスステート数が与えられるので、これに対応して、CPU2が要求した命令リードまたはデータリード/ライトを実現する。このとき、CPU2が要求した命令リードまたはデータリード/ライト(バスコマンド)に対する応答信号して、レディ信号readyを返す。即ち、レディ信号readyが非活性の場合は、CPU2はウェイトされる。
前記バスコントローラ3は、内部I/Oレジスタとして、制御ビットbmode16を持つ。bmode16=0のとき、32ビット命令フェッチモード、bmode16=1のとき、16ビット命令フェッチモードであり、制御信号bmode16がCPU2に与えられる。制御ビットbmode16は、リセット後に0にクリアされるようにする。32ビット命令フェッチモードにおいて、16ビットバスで接続されたメモリをリードしても、分岐命令や割込みなどでプログラムの流れを変えなければ、無駄は生じない。通常、リセット後には割込みはマスク或は禁止されているため、初期化処理に先立って、前記制御ビットbmode16を設定すればよい。
上記シングルチップマイクロコンピュータ1にリセット信号RESが与えられると、CPU2を始めとし、シングルチップマイクロコンピュータ1はリセット状態になる。このリセットが解除されると、CPU2は所定のアドレス(リセットベクタ)からスタートアドレスをリードして、このスタートアドレスから命令のリードを開始するリセット例外処理を行う。この後、CPU2は逐次、ROM5などから命令をリードし、解読して、その解読内容に基づいてデータの処理或はRAM5、タイマ7、SCI8、入出力ポート10A〜10I等とのデータ転送を行う。
タイマ7、SCI8、外部信号などの状態を割込み信号として、CPU2に伝達することができる。即ち、割込信号13は、A/D変換器9、タイマ7、SCI8、入出力ポート10A〜10Iの所定の回路が出力し、割込コントローラ4はその割込信号13を入力して、所定のレジスタなどの指定に基づいて、CPU2に割込要求信号intfと受付けた割込みに対応したベクタvecを与える。割込要因が発生すると、CPU2割込要求が発生され、CPU2は実行中の処理を中断して、例外処理状態を経て、前記ベクタvecに対応したアドレスから、分岐先アドレスをリードして、所定の処理ルーチンに分岐し、所望の処理を行い、割込要因をクリアしたりする。所定の処理ルーチンの最後には、通常復帰命令が置かれ、この命令を実行することによって前記中断した処理を再開する。
図3にはCPU2に内蔵されている汎用レジスタ及び制御レジスタの構成例(プログラミングモデル)が示される。
CPU2は、32ビット長の8本の汎用レジスタER0〜ER7を持っている。汎用レジスタER0〜ER7は、全て同じ機能を持っており、アドレスレジスタとしてもデータレジスタとしても使用することができる。
データレジスタとしては32ビット、16ビットおよび8ビットレジスタとして使用きる。アドレスレジスタおよび32ビットレジスタとしては、一括して汎用レジスタER(ER0〜ER7)として使用する。16ビットレジスタとしては、汎用レジスタERを分割して汎用レジスタE(E0〜E7)、汎用レジスタR(R0〜R7)として使用する。これらは同等の機能を持っており、16ビットジスタを最大16本まで使用することができる。8ビットレジスタとしては、汎用レジスタRを分割して汎用レジスタRH(R0H〜R7H)、汎用レジスタRL(R0L〜R7L)として使用する。これらは同等の機能を持っており、8ビットレジスタを最大16本まで使用することができる。各レジスタ独立に使用方法を選択することができる。
汎用レジスタER7には、汎用レジスタとしての機能に加えて、スタックポインタ(SP)としての機能が割り当てられており、例外処理やサブルーチン分岐などで暗黙的に使用される。例外処理は前記割込み処理を含む。
プログラムカウンタPCは32ビットのカウンタで、CPU2が実行中の命令のアドレスを示す。特に制限されないもののCPU2の命令は、全て2バイト(ワード)を単位としているため、最下位ビットは無効であり、命令リード時には最下位ビットは0とみなされる。
コンディションコードレジスタCCRは8ビットのレジスタで、CPU2の内部状態を示している。割込みマスクビット(I)とハーフキャリ(H)、ネガティブ(N)、ゼロ(Z)、オーバフロー(V)、キャリ(C)の各フラグを含む8ビットで構成されている。
ベクタベースレジスタVBRは32ビットのレジスタで、下位12ビットは0とされ、上位20ビットが例外処理ベクタ等とされる。
図4にはCPUのアドレス空間が例示される。CPU2のアドレス空間は4ギガ(G)バイトあり、8つのエリアに分割されている。これらのエリアは、バスコントローラ3の設定によって、独立して、バス幅、アクセスステート数を設定可能にされている。
一方、マイクロコンピュータ2内部のROM5、RAM6、内部I/Oレジスタは、前記バスコントローラ3の設定にかかわらず、固有のバス幅、アクセスステート数で動作する。前記の通り、内蔵ROM5、RAM6は、32ビットバスで接続され、1ステートでリード/ライトを行う。かかるアドレス空間やエリアの設定については、特開平5−307519号などに記載されている。
また、図4には、バスモードの切替えの好適な例が示される。16ビットバスで接続され、2ステートでアクセス可能な外部ROM5が、エリア1に接続されている場合の例である。内蔵ROM5上でプログラムを実行している場合、32ビットバスで接続されているため、32ビットモードで動作すればよく、bmode16=0とし、命令リードをロングワード単位で行う。単位リードサイクルでロングワード(2ワード)の命令をリードできるので、後の命令を実行しないことになっても、無駄は生じない。内蔵ROM5上の分岐命令によって、外部ROMに分岐し、外部ROM上のプログラム実行によって前記制御ビットbmode16を1にセットする。以降、命令リードをワード単位で行う。
制御ビットbmode16=0であっても、分岐命令や割込みなどプログラムの流れを変えなければ、無駄は生じないので、制御ビットbmode16の切替えは、外部ROMに分岐してから行えばよい。割込みが発生する可能性があり、割込み応答時間の増加が許容できない場合には、外部ROMへの分岐の直前に、制御ビットbmode16を1にセットすればよい。
外部ROMから内蔵ROM5へ分岐する場合は逆の動作を行えばよい。
図4では、内蔵ROM5上のプログラム実行後、外部ROMへ分岐し、外部ROMのプログラム実行後、内蔵ROM5に分岐するように表記しているが、分岐は随時行うことができる。メインプログラムを外部ROMに配置し、高速処理が必要なサブルーチンプログラム(関数)を内蔵ROM5に配置して、外部ROMと内蔵ROM5の間を随時、サブルーチン分岐/サブルーチンリターンすればよい。高速処理が必要なサブルーチンプログラム(関数)を内蔵RAM6に配置することも可能である。また、内蔵RAM、外部RAMにおいても同様の動作が可能となる。
図5にはCPU2の機械語の命令フォーマットの一例が示される。CPU2の命令は、2バイト(ワード)を単位にしている。各命令はオペレーションフィード(op)、レジスタフィールド(r)、EA拡張部(EA)、およびコンディションフィールド(cc)を含む。
オペレーションフィールド(op)は、命令の機能を表し、アドレッシングモードの指定オペランドの処理内容を指定する。命令の先頭4ビットを必ず含む。2つのオペレーションフィールドを持つ場合もある。
レジスタフィールド(r)は汎用レジスタを指定する。レジスタフィールド(r)はアドレスレジスタのとき3ビット、データレジスタのとき3ビット(32ビットレジスタ)または4ビット(8または16ビットレジスタ)である。2つのレジスタフィールドを持つ場合、またはレジスタフィールドを持たない場合もある。
EA拡張部(EA)は、イミディエイトデータ、絶対アドレスまたはディスプレースメントを指定する。8ビット、16ビット、または32ビットである。コンディションフィールド(cc)は条件分岐命令(Bcc命令)の分岐条件を指定する。
図6には本発明の命令フォーマットの例(後述する命令)を示す。
[MOV命令]
MOV.W @rs,rdは、1ワードの命令で、ビット6〜4でアドレスレジスタ(rs)を、ビット3〜0でデータレジスタ(rd)を指定する。MOV.W @aa:16,rdは、2ワードの命令で、第1ワードのビット3〜0でデータレジスタ(rd)を指定し、第2ワードに絶対アドレス(aa)を含む。
[JMP命令]
JMP @aa:32は、3ワードの命令で、第2、第3ワードに絶対アドレス(aa)を含む。
[通常分岐命令/遅延分岐命令]
通常分岐命令BRA d:8、遅延分岐命令BRA/S d:8は、1ワードの命令で、ビット6〜1でディスプレースメント(d)を指定する。ディスプレースメント(d)は最下位ビットを0とし、上位を符号拡張して使用される。命令コードのビット0が0のとき、通常分岐命令とされ、命令コードのビット0が1のとき、遅延分岐命令とされる。
[シフト命令]
SHLL.L #xx,rdは、1ワードの命令で、ビット8〜4でシフトビット数を示すイミディエイト(xx)を、ビット3〜0でデスティネーションレジスタ(rd)を指定する。
[乗算命令]
16ビット×16ビットで積の下位16ビットを得る命令MULU.W rs,rd、32ビット×32ビットで積の下位32ビットを得る命令MULU.L rs,rd、32ビット×32ビットで積の上位32ビットを得る命令MULU/UP.L rs,rd、は、夫々1ワードの命令で、ビット7〜4でソースレジスタ(rs)を、ビット3〜0でデスティネーションレジスタ(rd)を指定する。同様に、ソースレジスタの代わりにイミディエイト4ビットを乗数として使用する、MULU.W #x:4,rd、MULU.L #x:4,rd、MULU/UP.L #x:4,rd、は、1ワードの命令で、ビット7〜4でイミディエイトデータ(xx)を、ビット3〜0でデスティネーションレジスタ(rd)を指定する。
図1にはCPU2の詳細な一例が示される。CPU2は制御部(CNT)2Aと実行部(EXEC)2Bを有する。制御部2Aは、命令バッファ部IBUF、命令変更部CHG、命令デコーダDEC、レジスタセレクタRESL、割込み制御部INTCを含む。
前記レディ信号readyは、CPU2が要求した命令リードまたはデータリード/ライト(バスコマンド)に対する、バスコントローラ3からの応答信号であり、CPU2の状態遷移のイネーブル信号とされる。
前記命令バッファ部IBUFは、リードした命令を一旦格納する回路であって、8ワード分のFIFOバッファFBと2ワード分の命令レジスタIRを持つ。命令レジスタIRは、分岐命令時に使用する。命令デコーダDECから初期化信号clrFIFOを入力する。
実行すべき命令は、前記命令バッファ部IBUFから命令デコーダDECに出力される。命令リード直後に実行する場合には、命令バッファ部IBUFのFIFOバッファFBを使用せず、直接データバスIDBからの入力が命令デコーダDECに供給される。
前記命令変更部CHGは、リードした命令以外の命令コードを、命令デコーダDECに与える場合に動作し、そのほかの場合は、命令バッファ部IBUFの内容を命令デコーダDECに与える。リードした命令以外の命令コードは、割込み制御部INTCの指示によって、割込みなどの例外処理を実行するとき、などに用いる。
割込み制御部INTCは、図2の割込みコントローラ4の出力する割込み要求信号intfを受付ける。また、命令デコーダDECの出力する割込みマスク信号(図示せず)を参照して、割込みがマスクされていなければ、命令変更部CHGに制御信号intrqによって、割込みを指示する。後述の遅延分岐と遅延スロット命令の間、複数ビットシフト命令実行時は割り込みを禁止する。割り込み例外処理を実行する信号chg_intの論理記述は、
assign chg_int=intrq & 〜(|sftcnt) & 〜mod_dbである。ここで、|sftcntはsftcntの全ビットの論理和、&は論理積記号、〜は反転記号である。制御信号sftcnt、修飾信号mod_dbの論理記述については後述する。
命令デコーダDECは、例えば、マイクロROM或はPLA(Programmable Logic Array)または布線論理で構成され、制御信号を出力する。制御信号は第1乃至第3の3種類に大別され、それぞれ、有効となるタイミングが異なる。第1の制御信号(制御信号A)は当該ステートで有効になる。第2の制御信号(制御信号B)は次のステートで、第3の制御信号(制御信号C)は次のステートで、それぞれ有効になる。
命令デコーダDECの出力の一部(第2の制御信号)が命令デコーダDECにフィードバックされている。これは各命令コード内の遷移に用いるステージコード(tmg)と複数ビットシフト制御信号sftcnt、遅延スロットを示す修飾信号mod_dbを含む。
CPU2には、バスモードを示す信号bmode16が与えられる。この信号はフリップフロップFFに入力され、その出力信号mode16は命令デコーダDECに供給される。
命令デコーダDECは、実行シーケンスの制御部SCNT、バスアクセスの制御(バスコマンドBCMD:第1の制御信号)部BCNTと実行部の制御部ECNTなどを有する。バスアクセスの制御部BCNTの命令リードに関する論理記述は概略以下のようにできる。即ち実行シーケンスの制御部SCNTで命令フェッチを示す制御信号if又はifwを活性状態にしたとき、図7の論理記述(ケース文)に従って、バスコマンドが与えられる。図7の論理記述は、RTL(Register Transfer Level)若しくはHDL(Hardware Description Language)記述と呼ばれ、公知の論理合成ツールによって、論理回路に論理展開できる。HDLはIEEE1364として標準化されている。これに示される論理記述の構文は、ケース(case)文に準拠しており、always@の次の()内で定義された値若しくは信号に変化が有ったとき、それ以下の記述行の処理を行う、という記述内容になっている。「4’b1000」は4ビット長のバイナリコード1000を意味する。制御信号ifはロングワードまたはワードの命令リードを示す。制御信号ifwは強制的なワードの命令リードを意味する。`longread、`wordreadは別に定義された定数である。iab1はアドレスバスIABのビット1である。命令はワード(16ビット)単位であり、必ず、偶数番地に配置されるから、iab1=0のときは、4の倍数番地であり、ロングワードアクセスが1回で実行可能であることになる。即ち、命令フェッチのとき、16ビットバスモードでなく、4の倍数番地であれば、バスコマンドBCMDを、ロングワードリード`longreadにする。命令フェッチで、16ビットバスモードか、4の倍数番地でないとき、バスコマンドBCMDを、ワードリード`wordreadにする。
図8には同様に、後述のインクリメンタINCによるプリフェッチカウンタpfcの制御内容が論理記述で示される。`inc4、`inc2は別に定義された定数である。
入力(条件)はBCMDと同様であり、ロングワードで命令リードを行ったとき、制御信号c_incは+4を意味する`inc4状態になる。ワードで命令リードを行ったとき、制御信号c_incは+2を意味する`inc2状態になる。
特に制限はされないものの、制御信号ifwの場合は、分岐が行われることを前提にし、プリフェッチカウンタpfcのインクリメントを行わないものとする。ここで、前記図7及び図8の論理記述(ケース文)の入力(条件)は適宜増やすことができ、例えば、ポストインクリメントレジスタ間接のアドレッシングモードによるデータアクセス時と共通化できる。データサイズによって、+1/+2/+4を選択する制御を、含めればよい。例えば、ポストインクリメントレジスタ間接の実行を示す制御信号pstincとデータサイズを示す制御信号size(バイト:01、ワード:10、ロングワード:11)を用いて、図9の論理記述のようにすればよい。
シフタの制御は、第1のシフタの制御、第2のシフタの制御、制御信号sftcntの出力を含む。複数ビットシフト命令は、最大3ステート(S1〜S3)で実行されるが、第1ステート(S1)では、命令コード上のシフトビットフィールドを参照してシフトを行う。第2、第3ステート(S2、S3)は、制御信号Bであるsftcntを参照する。
第1のシフタの制御は図10に例示される論理記述に従って実現することができる。ここでopcodeは、命令デコーダDECに入力されている命令コード(16ビット)である。図10において`S1、`S2は複数ビットシフト命令の第1、第2ステートを示す別に定義された定数または制御信号である。即ち、第1のシフタの制御は、第1ステート(S1)では、1ビットまたは2ビットまたはシフトなしを、この順序で判定して制御信号sft1、sft2を生成する。第1ステートで1ビットシフトを実行した場合で、第2ステート(S2)で、2ビットシフトが必要であれば、2ビットの制御信号sft2を生成する。
同様に、第2のシフタの制御は図11に例示される論理記述に従って実現することができる。制御信号sftcntの機能は、上位3ビットと下位2ビットに分けて、図12に例示された論理記述で特定することができる。sftcntが全ビット0となったとき、終了と判定される。
レジスタセレクタRESLは、命令デコーダDECの指示と、命令コード中に含まれるレジスタフィールドの情報に基づいて、レジスタ選択信号rdgb[n]、wbrd[n]などを出力し、汎用レジスタの入出力を制御する。[n]は汎用レジスタに対応した0〜7の番号を意味する。
実行部2Bには、汎用レジスタER0〜ER7、プログラムカウンタPC、プリフェッチカウンタpfc、コンディションコードレジスタCCR、テンポラリレジスタTR、算術論理演算器ALU、インクリメンタINC、リードデータバッファDBR、ライトデータバッファDBW、アドレスバッファAB、乗算器MULTを含む。これらのブロックは内部バスab、gb、db、wb1、wb2によって相互に接続されている。
算術論理演算器ALUは、命令によって指定される各種の演算や実効アドレスの計算などに用いる。インクリメンタINCは、主にプログラムカウンタPCの加算に用いられる。インクリメンタINCには、前記の通り、制御信号c_incによって、プリフェッチカウンタpfcに対する+1/+2/+4の指示が与えられる。
図3に示される汎用レジスタER0〜ER7、プログラムカウンタPC、コンディションコードレジスタCCR以外は、プログラミング上は参照できず、マイクロコンピュータ1内部の動作にのみ用いられる。即ち、リードデータバッファDBR、ライトデータバッファDBW、アドレスバッファABなどは、内部アドレスバスIAB及び内部データバスIDBとのインタフェースをとるために、一時的にデータをラッチしたり、バッファリングしたりする。テンポラリレジスタTRは、マイクロコンピュータ1内部の動作に適宜用いられる。前記内部アドレスバスIAB及び内部データバスIDBは前記内部バス12に含まれる。
リードデータバッファDBRは、ROM5、RAM6、内部I/Oレジスタ、或は図示はされない外部メモリから、リードしたデータを一時的に格納する。ライトデータバッファDBWはROM5、RAM6、内部I/Oレジスタ、或は外部メモリへのライトデータをバッファリングする。アドレスバッファABは、CPU2がリード/ライトするアドレスを一時的に格納するほか、ベクタや分岐テーブルリードアドレスを生成する。アドレスバッファABは、割込みコントローラから入力されたベクタ、および内部バスabから情報を入力して、アドレスバスIABにアドレス出力を行う。通常は、内部バスabの内容が選択される。乗算器MULTは、命令デコーダDECから制御信号、内部バスgb、dbからデータを入力し、乗算結果を内部バスwb2に出力する。
図13には前記命令バッファ部IBUFの詳細が例示される。命令バッファ部IBUFは、命令コードを保持する為に第1の保持手段としてのFIFOバッファFBと第2の保持手段である命令レジスタIRを有する。
前記命令レジスタIRはIDBLに接続する下位側命令レジスタIRL、IDBHに接続する上位側命令レジスタIRHから構成される。IR/WはIRHが有効であることを示すためのワードイネーブルレジスタ、IR/LはIRH、IRLの双方が有効であることを示すためのロングワードイネーブルレジスタである。
前記FIFOバッファFBは、特に制限されないが、16ビット×8段の記憶エリアBUF0〜BUF7を有する。記憶エリアBUF0〜BUF7には内部データバスIDB上の命令又は前記命令レジスタIRからの命令を格納可能にされる。IDBHは上位16ビット、IDBLは下位16ビットを意味する。TLPはデータが格納されている後尾の記憶エリアを指す2ビットの後尾ポインタ(リードポインタ)、HDPはデータが格納されている先頭の記憶エリアを指す2ビットの先頭ポインタ(ライトポインタ)、NBPはFIFOバッファFBに格納されているデータ数を計数するデータ数ポインタである。記憶エリアに格納すべき命令コードの入力経路は信号IRHenb、IRLenb、Henb、Lenbによって選択される。信号IRHenbはIRHからの入力を選択指示し、IRLenbはIRLからの入力を選択指示し、HenbはIDBHからの入力を選択し、LenbはIDBLからの入力を選択指示する。前記記憶エリアBUF0〜BUF7の出力に対する選択はマルチプレクサMUXが行なう。マルチプレクサMUXは後尾ポインタTLPが指す記憶エリアのデータをout0に、後尾ポインタTLPが指す次の記憶エリアのデータをout1に、後尾ポインタTLPから3番目の記憶エリアのデータをout2に出力する。
前記出力out0、IDBL,IDBH、IRH,IRLはセレクタISELによって選択されたものが出力rslt0とされ、変更回路CHGを経て命令デコーダDECに供給される。前記出力out1はrslt1、前記出力out2はrslt2として、実効アドレス等の演算に供される。
バッファ制御回路FCNTは前記命令バッファ部IBUFを全体的に制御する。clkはクロック信号、rstはリセット信号である。LIR/Wはワード長読み出し指示信号、LIR/Lロングワード長読み出し指示信号、LIDは命令実行完了信号、LID_NUMは実行完了した命令のワード長を示すデータ、stkIRは内部データバスIDBの命令を命令レジスタIRに退避することを指示する信号、pfb(clrFIFOと等価)は分岐することを示す信号である。前記信号stkIRは遅延分岐命令実行中に分岐先命令が内部データバスIDBに出力されたとき論理値“1”に活性化される。バッファ制御回路FCNTは、stkIRが活性化されると、内部データバスIDBの命令を命令レジスタIRに退避する。その後、信号pfbが活性化されるとFIFOバッファFBをクリアする。FIFOバッファFBのクリアはポインタTIPとHDPを初期値にリセットすることで行われる。前記信号LIR/W、LIR/L、LID、LID_NUM、stkIR、pfbは命令デコーダDECから出力される。
上記命令バッファ部IBUFにおいて、遅延分岐命令での分岐先命令は、一旦、レジスタIRに保持される。遅延スロット命令の終了時に、FIFOバッファFBのクリアが行われる。このとき、分岐アドレスは一旦、一時的なレジスタ手段例えばテンポラリレジスタTRに保持し、プリフェッチカウンタpfcの値を保存するようにし、遅延スロットの命令の命令コード長が長い場合も、プリフェッチカウンタpfcに基づいて、継続して命令リードを行うことができるようにしている。遅延スロットの命令は複数ステートでよいようにする。遅延スロットに配置する命令を増やし、遅延分岐を利用し易くし、使い勝手を向上し、資源の利用効率を向上するとともに、高速化を実現できる。
パイプラインの乱れを抑止する課題とは別に、分岐時に分岐命令リードのレイテンシを隠蔽する意味で、複数ステートで実行する命令を遅延スロットに配置することによって、実行ステート数を短縮することができる。
遅延スロットに配置された命令では、自命令の命令コードのリードデータを待つステートや実効アドレス計算のためのステートは命令リードを抑止することにより、利用されない命令リード(プリフェッチ)を抑止できる。ウェイトが挿入されたりして、実行ステート数が増加することを回避することができる。
図14には算術論理演算器ALUの詳細が例示される。ここでは、算術演算器20、シフタ21及び出力セレクタ22を示すが、そのほかに、図示はされない、論理演算や、ビット操作命令用などの付加的な機能を含むことは妨げられない。
算術演算器20は内部バスgb、dbに入力が接続され、シフタ21は内部バスgbに入力が接続される。算術演算器20による演算結果とシフタ21による演算結果は出力セレクタ22で選択されて、内部バスwb2、必要に応じて内部バスabに出力される。
前記算術演算器20は、入力セレクタ25とフルアダー26からなる。入力セレクタ25は、内部バスdbの入力とキャリ入力を反転する。公知の通り、減算を2の補数の加算として実行するためである。
前記シフタ21は第1シフタ27及び第2のシフタ28から成り、内部バスgbと、制御信号sftl、sftr、sft1、sft2、sft4、sft8、sft16を入力し、結果を、出力セレクタ22を介して、内部バスwb2に出力する。sftlは左シフト、sftrは右シフト、sft1は1ビットシフト、sft2は2ビットシフト、sft4は4ビットシフト、sft8は8ビットシフト、sft16は16ビットシフト、を夫々指示する制御信号とされる。
第1のシフタ27の論理記述は図15に例示される。この論理記述によれば、制御信号sft1、sft2が何れも非活性の場合はシフトを行わない。そのほかの場合は、制御信号sftl、sftr、sft1,sft2の組合せで1または2ビットの左右シフトを行う。
同様に、第2のシフタ28の論理記述は図16に例示される。
シフタ21の図15及び図16の論理記述において、例えば、制御信号sftl=1、sft1=1、sft4=1、sftr=0、sft2=0、sft8=0、sft16=0の場合は、第1シフタ27及び第2のシフタ28により左5ビットシフトが行われる。
上記論理記述では、第1シフタ27、第2シフタ28に複数のシフトビットの指定が行われないように、その制御部が構成されているものとする。或いは、第1シフタ27、第2シフタ28の論理記述に優先順位を付けて、これに対応して制御部の論理を構成してもよい。
また、シフタの論理記述においてシフトの記述を演算子「<<」などを使用しないで記述することもできる。例えば、第2シフタ28の第1ケース、第2ケースを図17に例示されるように記述してもよい。そのほか、算術シフトやローテートなどを含んだり、バイトサイズ、ワードサイズのシフトを行ったりする場合も適宜、変更が可能である。
前記出力セレクタ22は、制御信号sftlまたはsftrの何れかが活性状態の場合には、シフタの出力を選択するようにする。
算術演算器20の場合は、桁上がりがあるのに加えて、減算の場合に、一方の入力を反転するなどの処理も必要であって、論理段数が多くなってしまうから、第1シフタ27及び第2のシフタ28を直列に配置しても、算術演算の遅延より大きくはならず、最大動作周波数向上の制約にはなり難い。バレルシフタが左右64選択のセレクタ回路を要するところ、シフタ21では、シフトしない選択も含めて、第1シフタ27が5選択のセレクタ回路、第2シフタ28が7選択のセレクタ回路を採用すればよく、これによって論理規模も格段に縮小することができる。
図18には前記乗算器MULTの詳細が例示される。MULは16ビット×16ビットの演算を行なう並列乗算回路、reg1,reg2は部分積を一時的に格納するデータレジスタ、ADDは加算回路、MAC(MACH,MACL)は乗算結果が累積される積和回路(Multiply And Accumulate)、regcは出力データレジスタ、MUXはマルチプレクサである。データaは内部バスgbへ、データbは内部バスdbへ供給され、データcは内部バスwb2に供給される。乗算器MULTは状態遷移制御によりその演算動作が制御される。状態遷移制御ロジックは図示を省略するが、乗算器MULTに設けられている。
図19には図18の乗算器MULTにおける乗算演算制御の状態遷移図が例示される。状態(ステート)はtmg=0乃至tmg=8とされる。
tmg=0は待機状態(ノン・オペレーション)とされる。乗算器MULTは制御部2Aから演算要求が無い限り演算を開始しない。演算要求は制御信号start=1で可能になる。start=1と同時に演算種類を選択する信号が活性化されることで、tmgが各種演算種類に応じた値に更新可能にされて、演算が開始される。32ビット乗算を示す制御信号mul_long=1のとき、tmg=1に遷移し、そのほかのときtmg=8に遷移する。
tmg=1では、a[15:0]×b[15:0]を演算し、その結果をレジスタreg2に格納する動作が行われる。演算が符号付きのときは図示はされない制御信号sign=1、符号無しのときは制御信号sign=0とする。a[15:0]はデータaの下位側16ビットを意味する。
tmg=2では、a[31:16]×b[15:0]を演算し、その結果をレジスタreg1に格納する動作が行われる。演算が符号付きのときは制御信号sign=1、符号無しのときは制御信号sign=0とする。ここで、32ビット×32ビットによる上位32ビットが必要なときは図示はされない制御信号upper=1とし、32ビット×32ビットによる下位32ビットが必要なときは制御信号upper=0とする。次のステートは、upper=1のときはtmg=3、upper=0のときはtmg=6になる。
tmg=3では、{16‘h0000,reg2[31:16]}+reg1を演算し、その結果をreg2に格納し、a[15:0]×b[31:16]を演算し、その結果をレジスタreg1に格納する。演算が符号付きのときは制御信号sign=1、符号無しのときは制御信号sign=0とする。次のステートはtmg4となる。{16‘h0000,reg2[31:16]}は上位側16ビットが0000、下位側がreg2[31:16]の32ビットデータであることを意味する。
tmg=4では、reg2+reg1を演算し、その結果をreg2に格納し、a[31:16]×b[31:16]を演算し、その結果をレジスタreg1に格納する。次のステートはtmg5となる。演算が符号付きのときは制御信号sign=1、符号無しのときは制御信号sign=0とする。
tmg=5では、制御信号sign=1のとき、{16{reg2[15]},reg2[15:0]}+reg1を演算し、その結果をレジスタregcに保持し、制御信号sign=0のとき、{16‘h0000,reg2[15:0]}+reg1を演算し、その結果をレジスタregcが保持する。演算が符号付きのときは制御信号sign=1、符号無しのときはフラグsign=0とする。制御信号start=1のとき,tmg=0のときの状態遷移図にしたがってtmgが更新され、次の演算が実行される。次のステートでレジスタregcの内容が演算結果としてcから出力され、ディスティネーションレジスタに格納される。16{reg2[15]}は、reg2[15]を16ビット繰返したデータである。
tmg=6では、reg2+{reg1[15:0],16‘h0000}を演算し、その結果をreg2に格納し、a[15:0]×b[31:16]を演算し、その結果をレジスタreg1に格納する。演算が符号付きのときは制御信号sign=1、符号無しのときは制御信号sign=0とする。次ステートはtmg=7である。
tmg=7では、reg2+{reg1[15:0],16‘h0000}を演算し、その結果をregcに格納する。次ステートは制御信号start=0のときtmg=0、start=1のとき、tmg=0のときの状態遷移図にしたがってtmgが更新され、次の演算が実行される。次ステートで演算結果がcに出力される。
tmg=8では、a[15:0]×b[15:0]を演算し、その結果をレジスタregcに格納する。その他に、8ビット×8ビットを演算して16ビット、16ビット×16ビットを演算して16ビット、16ビット×16ビットを演算して32ビットを得る演算を行なう。演算が符号付きのときは制御信号sign=1、符号無しのときは制御信号sign=0とする。8ビット乗算を行なうときは制御信号leg=1、16ビット乗算を行なうときは制御信号leg=0とする。次ステートは制御信号start=0のときtmg=0、制御信号start=1のときはtmg=0のときの状態遷移図にしたがってtmgが更新されて演算が実行される。次ステート時にその演算結果がレジスタregcに格納される。
図19の状態遷移制御によって乗算が制御される乗算器MULTは、32ビット×32ビットの乗算による上位32ビットの結果を、tmg=1,2,3,4,5,8の順序による制御で得ることができる。また、32ビット×32ビットの乗算による下位32ビットの結果を、tmg=1,2,6,7,8の順序による制御で得ることができる。例えば前者は乗算命令MULU.Lによって実行され、後者は乗算命令MULU/UP.Lによって実行される。当該後者の乗算処理では、逆数を乗算して上位を得ることで、実質的に除算結果を得ることになり、除算処理の高速化を実現することができる。
なお、状態遷移には、適宜そのほかの演算(積和演算など)を実現するための状態を追加することもできる。
図20乃至図22には命令バッファ部IBUFの状態を主体に命令実行のフローチャートを示す。それら実行フローで示される制御内容は命令デコーダDECによる制御内容と等価と把握してよい。
図20の命令実行フローは転送命令(MOV.W @aa:16,Rd)を一例とする。図においてskipの判別は、FIFOバッファFBがフルか否かの判別であり、Yesは判別結果がフル状態であることを意味する。mod_dbの判別は現在遅延スロットにいるか否かの判別であり、Yesは判別結果が遅延スロットにいることを意味する。FIFOバッファがフル状態のとき、遅延スロットにいるとき、命令フェッチは行なわない。
第1ステート(S1)では、制御信号Aで、次命令の命令リード(if)とpfcインクリメントを行う。制御信号Bで、リードした命令を命令バッファIFIFOに格納する。
遅延スロット命令として実行する場合(mod_db=yes)は、第1ステート(S1‘)は無操作(nop)とされる。命令プリフェッチを実行しても利用されないためである。
第2ステート(S2)では、制御信号Aで、命令バッファ部IBUFの出力rslt1に基づいて、本命令のEA拡張部(aa)を符号拡張して、内部バスab、アドレスバッファAB経由で、内部アドレスバスIABに出力する。同時に、データリードのためのバスコマンドを発行する。制御信号Bで、第2ステートでリードしたデータを、第3ステートで、内部データバスIDBからリードデータバッファDBRに格納する。更に、制御信号Cで、次のステートで、リードデータバッファDBRから内部バスwb2経由で汎用レジスタに転送するとともに、データを検査し、結果をフラグレジスタCCRにセットする。
第3ステート(S3)では、制御信号Aで、次の次の命令の命令リード(if)とプリフェッチカウンタpfcのインクリメントを行う。制御信号Bで、リードした命令を命令バッファ部IBUFに格納する。
遅延スロット命令として実行する場合(mod_db=yes)は、第3ステート(S3‘)では、プリフェッチカウンタpfcの代わりに、テンポラリレジスタTRの内容を読み出す。また、FIFOバッファFBの残量に依存せず、命令リード(ifa)を発行する。
第1ステートと第3ステートは、リード済みの(FIFOに存在している)命令の量に従って、省略(スキップ)される。リード済みの命令が少なければ、第1、第3ステートを実行し、本命令の命令長(2ワード)より多い命令をリードする。リード済みの命令の量が適切であれば、第1または第3ステートの一方を実行し、本命令の命令長(2ワード)と同じ量の命令をリードする。リード済みの命令が多ければ、第1、第3ステートを実行せず、命令をリードしない。
具体的には、本命令の実行開始時の命令バッファの残量deltaが本命令の命令コード長numに対し、“delta>num”の関係があれば、第1ステートを省略する。EA拡張部も含めて、自命令がリード済みで直ちに実行可能であり、命令リードのレイテンシも考慮して、次の命令も用意されているからである。また、“delta−num>2”の関係であれば、第3ステートを省略する。次の命令の第1ワードがリード済みであり、実行開始可能であり、更に、次の命令が1ステートで終了しても、命令リードのレイテンシも考慮して、更に1ワードが用意されているからである。
前記の通り、S1では、命令バッファをオーバフローさせないために、命令の命令リード(if)とプリフェッチカウンタpfcのインクリメントは、適宜抑止されるが、これは前の命令と共通であるため、各命令については、この記述は省略されている。命令リード(ifa)は、FIFOバッファFBの残量に依存せず、抑止されない。
図21には分岐命令(JMP @aa:32)の実行フローが例示される。第1ステート(S1)では、制御信号Aで、次命令の命令リード(ifw)とプリフェッチカウンタpfcのインクリメントを行う。制御信号Bで、リードした命令を命令バッファ部IBUFに格納する。
第2ステート(S2)では、リードした命令が命令バッファ部IBUFに格納されるのを待つ。
第3ステートでは、制御信号Aで、命令バッファ部IBUFの出力rslt1,rslt2に基づいて、本命令のEA拡張部(aa)を、内部バスab、アドレスバッファAB経由で内部アドレスバスIABに出力する。この内容はインクリメンタINCでインクリメントされて、プリフェッチカウンタpfcに格納される。同時に、命令リードのためのバスコマンドを発行する。制御信号Bで、リードした命令を命令バッファ部IBUFに格納する。
第4ステートでは、制御信号Aで、次の次の命令の命令リード(if)とプリフェッチカウンタpfcのインクリメントを行う。制御信号Bで、リードした命令を命令バッファ部IBUFに格納する。
第1ステートと第2ステートは、リード済みの(FIFOバッファFBに存在している)命令の量に従って、省略(スキップ)される。
本命令の実行開始時の命令バッファの残量deltaが本命令の残量numに対し、“delta≧num”の関係であれば、第1、第2ステートを省略する。EA拡張部も含めて、自命令がリード済みで直ちに実行可能であるからである。また、本命令実行開始時に命令リード中の命令コード量ifnumも考慮して、“delta+ifnum≧num”の関係であれば、第1ステートを省略する。自命令がリード発行済みで、1ステート待てば、実行可能になり、追加で命令をリードする必要がないからである。
第1ステートを実行する場合、前記の通り、前命令が、少なくとも自命令の2ワード目までをリードしているから、不足しているのは1ワードのみである。プログラムが16ビットバスで接続されている場合には、ワードで命令をリードするのがよい。32ビットで命令リードを発行すれば、不要なワードも待ってウェイトが挿入されてしまうからである。このため、制御信号ifwを活性化して、強制的にワードの命令リードを行うようにする。
図22には複数ビットシフト命令(SHLL #xx,Rd)の実行フローが例示される。第1〜第3ステート(S1〜S3)では、制御信号Aで、命令の命令リード(if)とプリフェッチカウンタpfcのインクリメントを行う。制御信号Bで、リードした命令を命令バッファ部IBUFに格納する。制御信号Bで、更にシフタ21の演算を行う。これをdo_sftで総称している。具体的には以下の通りである。制御信号rdgb[n]で、指定されたデスティネーションレジスタRdを内部バスgbにリードし、シフタ21に供給するとともに、制御信号sftl、sftr、sft1、sft2、sft4、sft8、sft16を発行して、シフト演算を行わせる。制御信号wbrd[n]で結果をデスティネーションレジスタRdに格納する。コンディションコードレジスタCCRの所定のフラグのセットが行われる。制御信号sftcntを生成する。
前記の通り、制御信号sftcntが全ビット0となったとき、終了と判定される。制御信号sftcntが全ビット0でない場合は、割込みの挿入が抑止(図1のINTCの出力する割り込み指示信号intrqが受付けられない)される。この動作を、最大3ステート実行して、31ビットまでの任意のシフトを実行する。
前記の通り、命令バッファをオーバフローさせないために、命令の命令リード(if)とプリフェッチカウンタpfcのインクリメントは、適宜抑止されるが、これは前の命令と共通であるため、各命令については、この記述は省略されている。
図23〜図25には各バスモードによる、命令の実行タイミングが例示される。分岐命令で分岐した先で、次に示すプログラム
pc0 BTST #6,R0L
BEQ t1
...
t1 BMI t2
...
を実行した場合のタイミング図である。条件分岐命令BEQ、BMIは共に固有の分岐条件が成立したものとする。外部メモリは、16ビットバスで接続され、2ステートアクセスが可能であるものとする。なお、レディ信号readyは、CPUが要求した命令リードまたはデータリード/ライト(バスコマンド)に対する、バスコントローラから応答信号であり、CPUの状態遷移のイネーブル信号とされる。
図23には内蔵ROM上での実行タイミングを示す。つまり内蔵ROMから命令BTST(ビット操作命令)、BEQ(条件分岐命令)、BMI(条件分岐命令)をフェッチして実行する場合である。
T0で、直前の分岐命令の実行によって、CPU2のアドレスバッファABからアドレスが内部アドレスバスIABに出力される。また、命令デコーダDECから、ロングワードサイズの命令フェッチ(if−long)を示す、バスコマンドBCMDが出力される。if−longは前記`longreadと同じでよい。
T1で、T0のバスIAB上のアドレス信号とバスコマンドBCMDに従ったリードが実行され、ロングワードのリードデータが内部データバスIDBに得られる。このリードデータの先行するワード(BTST命令)は、T2で命令デコーダDECに入力されて、命令の内容が解読される。後行するワード(BEQ命令)は命令バッファ部IBUFのFIFOバッファFBに格納される。
解読結果に従って、所要の制御信号が出力されて、BTST命令の実行が行われるが、詳細は省略する。T2で、ロングワードサイズの命令フェッチを行う。
一方、T2で、T1のバスIAB上のアドレス信号とバスコマンドBCMDに従ったリードが実行され、ロングワードのリードデータが内部データバスIDBに得られる。T3で、命令バッファ部IBUFから次の命令(BEQ命令)が命令デコーダDECに入力されて、命令の内容が解読される。
解読結果に従って、実効アドレスの計算が行われて、T3およびT4で、分岐先(t1、t1+4)のロングワードサイズの命令フェッチが行われる。
同様に、T3のバスIAB上のアドレス信号とバスコマンドBCMDに従ったリードデータ(BMI命令)は、T5で命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、T5およびT6で、分岐先(t2、t2+4)のロングワードサイズの命令フェッチを行う。
図24には16ビットバスモードで外部メモリからフェッチした命令を実行する動作が例示される。T0〜T1で、直前の分岐命令の実行によって、CPU2のアドレスバッファABからアドレス信号が内部アドレスバスIABに出力される。また、命令デコーダDECから、ワードサイズの命令フェッチ(if−word)を示す、バスコマンドBCMDが出力される。if−wordは前記`wordreadと同じでよい。
T2〜T3で、T0〜T1におけるバスIAB上のアドレス信号とバスコマンドBCMDに従ったリードが外部バス(EXA、EXD)上で実行され、リードデータが内部データバスIDBに得られる。このリードデータ(BTST命令)は、T4で命令デコーダDECに入力されて、命令の内容が解読される。
解読結果に従って、所要の制御信号が出力されて、BTST命令の実行が行われるが、詳細は省略する。T4〜T5で、ワードサイズの命令フェッチを行う。
一方、T4〜T5で、T2〜T3におけるIAB上のアドレス信号とバスコマンドBCMDに従ったリードが外部バス(EXA、EXD)上で実行され、リードデータが内部データバスIDBに得られる。このリードデータ(BEQ命令)は、T6で命令デコーダDECに入力されて、命令の内容が解読される。
解読結果に従って、実効アドレスの計算が行われて、T6〜T7およびT8〜T9で、分岐先(t1、t1+2)のワードサイズの命令フェッチを行う。同様に、T8〜T9で、T6〜T7におけるバスIAB上のアドレス信号とバスコマンドBCMDに従ったリードデータ(BMI命令)は、T8で命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、T10〜T11およびT12〜T13で、分岐先(t2、t2+2)のワードサイズの命令フェッチを行う。
図24から明らかなように、図23の内蔵ROM上での実行に比べてクロック周波数は遅いが、16ビットバスモードを採用しているから、バスサイクルの数は図23と同等になっている。
図25には32ビットバスモードで外部メモリからフェッチした命令を実行する動作が例示される。T0〜T3で、直前の分岐命令の実行によって、CPU2のアドレスバッファABからアドレスがアドレスバスIABに出力される。また、命令デコーダDECから、ロングワードサイズの命令フェッチ(if−long)を示す、バスコマンド(BCMD)が出力される。
T4〜T7で、T0〜T3におけるバスIAB上のアドレス信号とバスコマンドBCMDに従ったリードが外部バス(EXA、EXD)上で、2回のワードサイズリードに分割されて実行され、T6〜T7でロングワードのリードデータが内部データバスIDBに得られる。このリードデータの先行するワード(BTST命令)は、T8で命令デコーダDECに入力されて、命令の内容が解読される。後行するワード(BEQ命令)は命令バッファ部IBUFのFIFOバッファFBに格納される。解読結果に従って、所要の制御信号が出力されて、BTST命令の実行が行われるが、詳細は省略する。T8〜T11で、ロングワードサイズの命令フェッチを行う。
一方、T8〜T11で、T4〜T7における内部アドレスバスIAB上のアドレス信号とバスコマンドBCMDに従ったリードが外部バス(EXA、EXD)上で、2回のワードサイズリードに分割されて実行され、T10〜T11でロングワードのリードデータが内部データバスIDBに得られる。T12で、命令バッファ部IBUFから次の命令(BEQ命令)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、T12〜T15およびT16〜T19で、分岐先(t1、t1+4)のロングワードサイズの命令フェッチを行う。
同様に、T18〜T19で、T12〜T15におけるバスIAB上のアドレス信号とバスコマンドBCMDに従ったリードデータ(BMI命令)は、T20で命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、T20〜T23およびT24〜T27で、分岐先(t2、t2+4)のロングワードサイズの命令フェッチを行う。
32ビットバスモードは、16ビットバスモードに比較して、T10〜T15、T20〜T23で実行される5回分の、外部バス上のワードリードでフェッチした命令は使用されず、無駄になっている。これに伴って、実行ステート数も増えている。このプログラムの実行が、分岐命令後でない場合は、命令バッファの残量によって命令リードが抑止される場合があるから、T4〜T5のバスコマンドは抑止(NOP:ノーオペレーション)され、T12〜T15の外部バス上のワードリードは実行されず、1ステートで完了する場合もある。また、BEQ命令、BMI命令で分岐条件が不成立だったりして、分岐が行われず、割込みも要求されていない場合は、命令リードをした命令コードは使用され、無駄になることはない。
図26には通常分岐命令の第1の例の実行タイミングが示される。通常分岐命令とは遅延分岐命令でないという意味である。ここで示すプログラムの例は、
MOV.W @ER1,R0
BRA target
...
target
である。
前記同様に、T2で、MOV命令が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、汎用レジスタER1の内容が、実効アドレスとして内部アドレスバスIABに出力され、ワードリードのバスコマンド(data−read)が発行される。同時に、レジスタ選択信号を含むデータリード制御信号が生成され、順次、T3、T4の制御を行う。具体的には、T3で、リードデータバッファDBRへの取り込み制御が指示される。T5では、リードデータバッファDBRの内容がデスティネーションレジスタR0への転送が指示される。
リードデータは、T3で内部データバスIDBに得られ、前記の通り、T4でリードデータバッファDBRに取り込まれ、T5で、汎用レジスタR0へ転送される。同時に、転送データの内容に従って、コンディションコードレジスタCCRの所定のフラグが更新される。また、T4では命令リードが行われる。プリフェッチカウンタpfcの内容が内部アドレスバスIABに出力され、また、インクリメンタINCでインクリメントされる。
BRA命令は、T4で命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、T4で、分岐先(target)のロングワードサイズ(targetが4の倍数でないときはワードサイズ)の命令フェッチを行う。この分岐先アドレスはインクリメンタINCでインクリメントされ、プリフェッチカウンタpfcに格納する。また、T5で、制御信号clrFIFO(制御信号pfbと等価)を活性状態にして、FIFOバッファFBの初期化を行うと共に、分岐先の命令を命令デコーダDECに供給する。
図27には通常分岐命令の第2の例の実行タイミングが示される。ここで示すプログラムの例は、
MOV.W @aa:16,R0
BRA target
...
target
である。
前記同様に、T2で、MOV命令が命令デコーダDECに入力されて、命令の内容が解読される。解読結果により、T2の第1ステート(図20のS1)は命令リードを行い、EA拡張部が入力されるのを待つ。T3の第2ステートで、命令バッファ部IBUFのout1から本命令のEA拡張部(aa)が出力され、符号拡張されて、実効アドレスとしてアドレスバッファABから内部アドレスバスIABに出力され、また、ワードリードのバスコマンド(data−read)が発行される。同時に、レジスタ選択信号を含むデータリード制御信号が生成され、順次、T4、T5の制御を行う。具体的には、T4で、リードデータバッファDBRへの取り込み制御が指示される。T5では、リードデータバッファDBRの内容をデスティネーションレジスタR0へ転送する指示が行われる。
リードデータは、T4で内部データバスIDBに得られ、前記の通り、T5でリードデータバッファDBRに取り込まれ、T6で、レジスタR0へ転送される。同時に、転送データの内容に従って、コンディションコードレジスタCCRの所定のフラグが更新される。また、T4では命令リードが行われる。
BRA命令は、T5で命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、前記同様に、T5で、分岐先(target)のロングワードサイズの命令フェッチを行う。この分岐先アドレスはインクリメンタINCでインクリメントされ、プリフェッチカウンタpfcに格納する。また、T6で、制御信号clrFIFO(pfbと等価)を活性状態にして、FIFOバッファFBの初期化を行うと共に、命令レジスタIRに格納した分岐先の命令を命令デコーダDECに供給する。
図28には遅延分岐命令の第1の例の実行タイミングが示される。ここで示すプログラムの例は、
BRA/S target
MOV.W @ER1,R0
...
target
であり、実質的な処理は、図26と同じである。BRA/Sは遅延スロット付きの分岐命令、即ち遅延分岐命令を意味する。
T2で、遅延分岐命令(BRA/S命令)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、T3で、分岐先(target)のロングワードサイズ(targetが4の倍数でないときはワードサイズ)の命令フェッチを行う。この分岐先アドレスはインクリメンタINCでインクリメントされ、テンポラリレジスタTRに格納する。また、制御信号mod_db(当該命令が遅延スロットの命令であることを示す信号)を出力し、遅延スロット命令の修飾を行う。遅延スロット命令(この例ではMOV命令)は、T3で命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、汎用レジスタER1の内容が、実効アドレスとして内部アドレスバスIABに出力され、ワードリードのバスコマンド(data−read)が発行される。同時に、レジスタ選択信号を含むデータリード制御信号が生成され、順次、T4、T5の制御を行う。具体的には、T4で、リードデータバッファDBR取り込み制御が指示される。T5では、リードデータバッファDBRの内容をデスティネーションレジスタR0へ転送する指示が行われる。
リードデータは、T4で内部データバスIDBに得られ、前記の通り、T5でリードデータバッファDBRに取り込まれ、T6で、レジスタR0へ転送される。同時に、転送データの内容に従って、コンディションコードレジスタCCRの所定のフラグが更新される。
また、T4では命令リードが行われる。このとき、制御信号mod_dbにより修飾されることにより、プリフェッチカウンタpfcの代わりに、テンポラリレジスタTRの内容を使用する。このアドレスはインクリメンタINCでインクリメントされ、プリフェッチカウンタpfcに格納する。また、T3で制御信号stkIRを活性状態にして、分岐先の命令を命令バッファ部IBUF内の命令レジスタIRに格納する。T4で、制御信号clrFIFO(pfbと等価)を活性状態にして、FIFIバッファFBの初期化を行うとともに、命令レジスタIRに格納した分岐先の命令を命令デコーダDECに供給する。
遅延分岐命令と遅延スロットの命令を組合せることによって、分岐先の命令リードのレイテンシを隠蔽し、実効的に遅延分岐命令を1ステートで実行できる。BRA命令とBRA/S命令の第1ステートの動作は基本的に同一である。インクリメンタINCの出力をプリフェッチカウンタpfcに格納するか、テンポラリレジスタTRに格納するかが相違される。
図29には遅延分岐命令の第2の例の実行タイミングが示される。ここで示すプログラムの例は、
BRA/S target
MOV.W @aa:16,R0
...
target
であり、実質的な処理は、図27と同じである。
T2で、遅延分岐命令(BRA/S命令)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、前記同様に、T3で、分岐先(target)のロングワードサイズの命令フェッチを行う。この分岐先アドレスはインクリメンタINCでインクリメントされ、テンポラリレジスタTRに格納する。また、制御信号mod_dbを出力し、遅延スロット命令の修飾を行う。遅延スロット命令(MOV命令)は、命令デコーダDECに入力されて、命令の内容が解読される。解読結果と、制御信号mod_dbにより修飾されることにより、T4の第1ステート(図20のS1)は命令リードを行わず、EA拡張部が入力されるのを待つ。要するに、リード開始済みのEA拡張部がFIFOバッファFBに入力される。T4の第2ステートで、命令バッファ部IBUFの出力out1から本命令のEA拡張部(aa)を出力し、これを符号拡張して、実効アドレスとしてアドレスバッファABから内部アドレスバスIABに出力され、更に、ワードリードのバスコマンドBCMD(data−read)が発行される。同時に、レジスタ選択信号を含むデータリード制御信号が生成され、順次、T5、T6の制御を行う。具体的には、T5で、リードデータバッファDBRへの取り込み制御が指示される。T6では、リードデータバッファDBRの内容をデスティネーションレジスタR0へ転送する指示が行われる。
リードデータは、T5で内部データバスIDBに得られ、前記の通り、T6でリードデータバッファDBRに取り込まれ、T7で、レジスタR0へ転送される。同時に、転送データの内容に従って、コンディションコードレジスタCCRの所定のフラグが更新される。
また、T5では命令リードが行われる。このとき、制御信号mod_dbにより修飾されることにより、プリフェッチカウンタpfcの代わりに、テンポラリレジスタTRの内容を使用する。このアドレスはインクリメンタINCでインクリメントされ、プリフェッチカウンタpfcに格納する。
また、T3で制御信号stkIRを活性状態にして、分岐先の命令を命令バッファ部IBUF内の命令レジスタIRに格納する。T5で、制御信号clrFIFO(pfbと等価)を活性状態にして、FIFOバッファFBの初期化を行うとともに、命令レジスタIRに格納した分岐先の命令を命令デコーダDECに供給する。T6でFIFOバッファFBを初期化するので、それまでの遅延スロット命令実行中に、例えばT4のEA拡張部(ea)等をFIFOバッファFBから任意に出力して使用することができる。
MOV命令の第1ステート(S1)の命令リードは抑止されて、無駄な命令リードを回避することができる。
図30にはシフト命令の第1の例の実行タイミングが示される。ここでは、SHLL #4,ER3による実行タイミングを示す。この命令は4ビット左シフトを指示する。
T2で、命令コード(shll4)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、T3で、デスティネーションレジスタER3の内容が内部バスgbに出力され、算術論理演算器ALUに入力される。制御信号sftl、sft4が活性状態になって、第1のシフタ27はシフトをせず、第2のシフタ28が4ビットシフト演算を行い、演算結果が内部バスwb2に出力される。同時に、内部バスwb2の内容がデスティネーションレジスタである汎用レジスタER3に格納される。また、シフト結果を判定して、コンディションコードレジスタCCRの所定のビットが更新される。例えば、演算結果が全ビットゼロであれば、Zフラグが1にセットされる。また、シフトアウトしたgb[28]の内容がCフラグに格納される。命令リードについての詳細な説明は省略する。
図31にはシフト命令の第2の例の実行タイミングが示される。ここでは、SHLL #31,ER3による実行タイミングを示す。この命令は31ビット左シフトを指示する。
T2で、命令コード(shll31)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、T3〜T5で、デスティネーションレジスタER3の内容が内部バスgbに出力され、算術論理演算器ALUに入力される。T3では、制御信号sftl(左シフト指示)、sft1(1ビットシフト指示)、sft4(4ビットシフト指示)が活性状態になって、第1のシフタ27は1ビットシフト、第2のシフタ28が4ビットシフト演算を行い(合わせて左へ5ビットシフト)、演算結果(途中結果result’)が内部バスwb2に出力される。同時に、内部バスwb2の内容がデスティネーションレジスタである汎用レジスタER3に格納される。また、シフト結果を判定して、コンディションコードレジスタCCRの所定のビットが更新される。
T4では、制御信号sftl(左シフト)、sft2(2ビットシフト)、sft8(8ビットシフト)が活性状態になって、第1のシフタ27は2ビットシフト、第2のシフタ28が8ビットシフト演算を行い(T3と合わせて、左へ15ビットシフト)、演算結果(途中結果result’ ’)が内部バスwb2に出力される。同時に、内部バスwb2の内容がデスティネーションレジスタである汎用レジスタER3に格納される。また、シフト結果を判定して、コンディションコードレジスタCCRの所定のビットが更新される。
T5では、制御信号sftl(左シフト)、sft16(16ビットシフト)が活性状態になって、第1のシフタ27はシフトをせず、第2のシフタ28が16ビットシフト演算を行い(T3、T4と合わせて、左へ31ビットシフト)、演算結果(result)が内部バスwb2に出力される。同時に、内部バスwb2の内容がデスティネーションレジスタである汎用レジスタER3に格納される。また、最終的なシフト結果を判定して、コンディションコードレジスタCCRの所定のビットが更新される。尚、命令のリードは、FIFOバッファFBの残量によって、T3、T4の命令リードが抑止されたものとして図示されている。
図32には乗算命令の第1の例の実行タイミングが示される。ここでは、MULU.L ER1,ER2の実行タイミングを示す。この命令は、32ビット×32ビットの乗算による下位32ビットの結果を得る処理を実行させる。
T2で、命令コード(mulu)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、T2で乗算器MULTにスタート信号startを与える。乗算器MULTの状態遷移が開始される。T3で、ソースレジスタER1の内容が内部バスdbに出力され、デスティネーションレジスタER2の内容が内部バスgbに出力され、乗算器MULTに入力される。T3〜T5の間、32ビット×32ビットの乗算を示すため、制御信号mul_long信号が活性化され、乗算器MULTの制御が行われる。T7では、制御信号mul_rdに従って、乗算結果が内部バスwb2に出力されると共に、内部バスwb2の内容が、T8でデスティネーションレジスタである汎用レジスタER2に格納される。また、この結果を判定して、コンディションコードレジスタCCRの所定のビットが更新される。
図33には乗算命令の第2の例の実行タイミングが示される。ここでは、MULU/UP.L #12,ER2の実行タイミングを示す。この命令は、32ビット×32ビットの乗算による上位32ビットの結果を得る処理を実行させる。
T2で、命令コード(mulu)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、T2で乗算器MULTにスタート信号startを与える。乗算器MULTの状態遷移が開始される。T3で、イミディエイトデータ(12)がゼロ拡張されて、内部バスdbに出力され、デスティネーションレジスタER2の内容が内部バスgbに出力され、乗算器MULTに入力される。T3〜T8の間、32ビット×32ビットの乗算を示すために制御信号mul_long信号が活性化され、上位を取るための制御信号upperが活性化されて、乗算器MULTの制御が行われる。
T8では、制御信号mul_rdに従って、乗算結果が内部バスwb2に出力されると共に、T9で内部バスwb2の内容がデスティネーションレジスタである汎用レジスタER2に格納される。また、この結果を判定して、コンディションコードレジスタCCRの所定のビットが更新される。
図34には前記制御ビットbmode16を生成する構成が例示される。制御ビットbmode16はフリップフロップFFbcで生成され、リセット状態(信号rstb=0、末尾のbはリセット信号rstの反転信号を示す)で初期化される。内部I/Oレジスタのライト信号iowrと、制御ビットbmode16を有する内部I/Oレジスタの選択信号bs_rselの論理積(iowr&bs_rsel)をイネーブル信号として、データバスIDBの所定のビット、例えばビット0を入力する。前記フリップフロップFFbcは前記バスコントローラ3に含まれている。図1のフリップフロップFFは前記フリップフロップFFbcの出力を受けることになる。
図35には前記制御ビットbmode16を生成する別のフリップフロップFFbcの構成が例示される。イネーブル信号は、前記に加えて、分岐の実行を示す制御信号clrFIFO(pfbと等価)との論理和((iowr&bs_rsel)|clrFIFO)とする。制御信号clrFIFOが活性状態のときは、データ入力(d)を、そのときの内部アドレスバスIABをバスコントローラが判定し、当該アドレスが16ビットバスであることを示す信号sel_b16としている。このため、分岐の実行毎に分岐先のバス幅を判定して、バスモードを自動的に切替えることができる。尚、分岐を示す信号としては前記clrFIFOのほか、専用のものを生成することもできる。
図36には前記CPU2のプログラム等の開発環境の概略を示す。開発者は、各種エディタなどを用いて、C言語乃至アセンブリ言語でプログラムを作成する。これは通常、複数のモジュールに分割して作成される。Cコンパイラ30は、開発者の作成したそれぞれのC言語ソースプログラムを入力し、アセンブリ言語ソースプログラム乃至オブジェクトモジュールを出力する。アセンブラ31は、アセンブリ言語ソースプログラムを入力し、オブジェクトモジュールを出力する。リンケージエディタ32は、上記Cコンパイラやアセンブラの生成した、複数のオブジェクトモジュールを入力して、各モジュールの外部参照や相対アドレスなどの解決を行い、1つのプログラムに結合して、ロードモジュールを出力する。ロードモジュールは、シミュレータ/デバッガ33に入力して、パーソナルコンピュータなどのシステム開発装置上で、CPUの動作をシミュレーションし、実行結果を表示し、プログラムの解析や評価を行うことができる。また、エミュレータ34に入力して、実際の応用システム上などで動作する、いわゆるインサーキットエミュレーションを行い、マイクロコンピュータ全体としての、実動作の解析や評価を行うことができる。さらに、ロードモジュールをPROMライタ35に入力して、マイクロコンピュータの内蔵ROMがフラッシュメモリなどの場合や、外部のフラッシュメモリなどに、作成したプログラムを格納することができる。必要に応じて、オブジェクトコンバータなどによって、所望のフォーマットに変換する。このほかに、ライブラリアンとして、汎用的なサブルーチンなどを提供することもできる。
Cコンパイラ30やリンケージエディタ32の最適化やオプションなどとして、遅延分岐命令の利用などを行うことができる。プログラムを解析して、分岐命令と置き換え可能な命令を解析することになるが、複数ワード命令、複数ステート実行命令も、遅延スロットに配置できれば、有効利用が可能になる。
上記各種の実施形態によれば、以下の作用効果を得るものである。
(1)[バスモード(図4)]
内部I/Oレジスタ等の設定により、16ビット命令リードと32ビット命令リードを切替え可能にすることにより、外部バスのデータバス幅が内蔵ROMのバス幅より狭い場合、マイクロコンピュータの使用方法、例えば、プログラムを内蔵ROMのみとするとき、外部ROMのみとするとき、内蔵ROMまたはRAMと外部ROMを切替えて使用するとき、などに対応し、処理性能を高くすることができる。初期値を32ビット命令リードにし、リセット後のプログラム実行が、32ビットバス、16ビットバスの何れであっても、リセット後の初期化時の処理速度を低下させることがない。
データのリード/ライトは、所要量のリード/ライトを行うようにし、選択に必要な論理を不要とするとともに、プログラムは外部ROM、データは内蔵RAMといった場合に、処理性能を高くすることができる。
(2)[バスモード(図1)]
バスコントローラ3とCPU2のモジュール間制御信号bmode16をCPU2への入力時にFFで受けて利用することにより、バスコマンドBCMDの遅延を抑止することができる。
バスモードに応じて、インクリメンタINCの加算値を制御することは、ポストインクリメントレジスタ間接などのアドレッシングモードの操作と共通化でき、資源の有効利用と論理規模の増加の抑止を図ることができる。
分岐命令が、自命令の命令コードの一部をリードする場合、必要に応じて、必ず16ビットで命令リードするようにすることにより、利用されない命令リード(プリフェッチ)を抑止できる。ウェイトが挿入されたりして、実行ステート数が増加することを回避することができる。
(3)[遅延分岐(図28、図29)]
遅延分岐のとき、分岐アドレスリード後、分岐アドレスのインクリメント結果をテンポラリレジスタTRに保持することにより、遅延スロット命令の命令コード長が長い場合も継続して命令リードを行うことができる。また、自命令の命令コードのリードデータを待つステートや実効アドレス計算のためのステートは命令リードを抑止することにより、利用されない命令リード(プリフェッチ)を抑止できる。ウェイトが挿入されたりして、実行ステート数が増加することを回避することができる。FIFOバッファFBのクリアを、遅延スロット命令がEA拡張部など、命令バッファの出力を不要とした時点で行うことにより、遅延スロットの命令実行を複数ステートにすることができる。ハーバードバスなどを利用することなく、種々の命令セットやハードウェア構成に適用できる。
(4)[遅延分岐(図6、図26〜図29)]
遅延分岐と通常分岐の命令コードを、命令コードの最下位ビットで切替えることにより、実効アドレスの計算などを共通にできる。
(5)[複数ビットシフト(図14)]
1、2、4、8、16ビットシフトを行うシフタ21を用いることにより、出現頻度の高いシフトを1ステートで実行可能にするとともに、組合せて(直列に、或いは、繰り返し使用して)任意ビットのシフトを可能にすることができ、論理規模の増加も抑止できる。
ビットシフトしない及び左右シフトビット数の組み合わせに対する5選択、7選択といったシフタのセレクタは、論理合成などで容易に実現可能である。多選択のセレクタは、論理合成によって、論理ゲートが多段に構成される場合が多いから、第1シフタ27と第2シフタ28を直列にしても大きな不都合は生じない。
(6)[複数ビットシフト(図22)]
制御信号sftcntの状態で、次命令への遷移と、次のシフトビットの制御を行うことにより、論理記述を容易にし、資源の利用効率を向上することができる。
(7)[乗算器(図18)]
32ビット×32ビットの積の上位の32ビットを得る乗算命令を除算に用いることにより、除算の効率化に寄与する。
以上本発明者等によってなされた発明を実施例に限定されるものではなく、その要旨を逸しない範囲において種々変更可能である。
命令コードは、簡単化のために、複数ビットシフトや、上位を取る乗算命令も1ワードとしているが、これらは複数ワード命令にすることができる。動作フローや動作タイミングもこれに伴って変更すればよい。簡単には、プリフィックスコードを付して、実質的な動作フローや動作タイミングを変えないで実現することもできる。そのほか、命令体系や命令セット即ち、命令の種類やアドレッシングモードの種類及びこれらの組合せなども任意にできる。命令フォーマットは任意に変形できる。
プログラムカウンタのビット数や、アドレス空間の大きさやエリア分割、そのほかの制御レジスタの構成なども任意にできる。
16ビット命令リードと32ビット命令リードの切替えは、内部I/Oレジスタの設定によるもののほか、モード信号としてのモード制御(MD0、MD1)で設定可能にしてもよい。初期値を設定可能にしてもよい。
命令バッファ部のFIFOバッファの容量も8ワードに限定されない。最小限2ワード以上あればよい。容量が大きければ、省略可能なステートを持たない命令が存在した場合にも、蓄積された命令を、続く命令実行で省略するステートを大きくして、命令の量のバランスを採ることができる。ただし、容量を大きくしても、分岐命令実行時にはリードした命令が無駄になってしまうから、通常、若しくは定常的な状態で、FIFOに存在する命令の量はあまり大きくしない方がよい。
シフタ21は2段に限定されず、3段以上でもよい。個々のシフタで実行可能なシフトビット数も任意に設定できる。シフトビット数は、命令コード中に含まれるイミディエイトデータで指定するほか、汎用レジスタの内容で指定可能にしてもよい。
乗算器の詳細な構成や、制御信号入力、状態遷移なども変形可能である。また、外部バスのバス幅は内部バスのバス幅よりも狭く固定されても良い。また、外部バスのバス幅は内部バスのバス幅よりも狭い範囲で選択可能であってもよい。そのような選択制御はCPU2によるバスコントローラ3の条件設定で行なえばよい。
以上の説明では主として本発明者によってなされた発明をその背景となった利用分野であるシングルチップマイクロコンピュータに適用した場合について説明したが、本発明はそれに限定されるものではなく、データプロセッサ、マイクロプロセッサ、システムLSI等と称される種々のデータ処理装置に広く適用することができる。本発明は少なくとも、命令を解読して処理し、演算処理を行う条件のものに適用することができる。