以下、図面を用いて実施形態を説明する。
図1は、一実施形態におけるプロセッサPROCの例を示している。例えば、プロセッサPROCは、DSP(digital Signal Processor)やCPU(Central Processing Unit)である。プロセッサPROCは、フェッチ部FTC、デコード部DEC、演算部EXおよびアドレスレジスタAREGを有している。プロセッサPROCは、命令メモリIMEMに接続されている。命令メモリIMEMには、実行サイクル数が動的に変化する第1の命令INS1および第1の命令以外の通常の命令INSが格納されている。以降の説明では、実行サイクル数が動的に変化する命令は、サイクル可変命令とも称する。サイクル可変命令の例は、図3から図7に示す。
例えば、命令メモリIMEMのアドレス0xXX00から0xXX4Cには、複数の通常の命令INSおよび複数の第1の命令INS1が格納されている。アドレスは、16進数で表されており、アドレスを示すxおよびXは、任意の値である。この例では、各命令INS、INS1は、32ビット(4バイト)で記述されるため、アドレスは4つずつ更新される。
第1の命令INS1等のサイクル可変命令の実行サイクル数は、プロセッサPROCの内部状態(例えば、レジスタに保持されているデータ値やアクセスアドレスなど)により変化する。このため、最大の実行サイクル数に対応する数のサイクル可変命令が、プログラムに記述される必要がある。この例では、第1の命令INS1を実行するための最大の実行サイクル数は、例えば16サイクルである。このため、命令メモリIMEMに格納されたプログラムにおいて、第1の命令INS1を実行するために、連続した16個の第1の命令INS1を有する命令群(サイクル可変命令群)が記述されている。
フェッチ部FTCは、アドレスを順次更新してサイクル可変命令INS1および通常の命令INSを命令メモリIMEMからフェッチし、フェッチした命令INS1、INSをデコード部DECに出力する。デコード部DECは、フェッチ部FTCによりフェッチされた命令INS1、INSを解読し、解読した命令を演算部EXに出力する。演算部EXは、デコード部DECにより解読された命令を受けて演算を実行する。また、演算部EXは、サイクル可変命令INS1を順次実行中に、必要な演算を全て完了したことを判断したときに終了信号ENDを出力する。
アドレスレジスタAREGは、サイクル可変命令INS1の命令群の次の命令INSが格納されている命令メモリIMEMのアドレス(この例では0xXX44)を保持している。フェッチ部FTCは、終了信号ENDに応答して、残りのサイクル可変命令のフェッチを止める。フェッチ部FTCは、アドレスレジスタAREG内のアドレス0xXX44を用いて、次の命令INSを命令メモリIMEMからフェッチし、フェッチした命令INSをデコード部DECに出力する。
例えば、デコード部DECがアドレス0xXX14に格納されている5番目のサイクル可変命令INS1の解読により、サイクル可変命令INS1の実行に必要な演算の完了を判断したとき、演算部EXは、アドレス0xXX18−0xXX40に格納されているサイクル可変命令INS1を実行する必要がない。デコード部DECは、フェッチ部FTCからの次の命令INS(アドレス0xXX44)を解読し、解読した命令を演算部EXに出力する。そして、演算部EXは、命令群内の一部のサイクル可変命令INS1を実行することなく、次の命令INSの演算を実行する。
このように、終了信号ENDにより、一部のサイクル可変命令INS1のフェッチ、デコード、実行を省略することができるため、命令の実行効率を向上できる。なお、以上の動作は、デコード部DECによるアドレスレジスタAREGへの保持、およびアドレスレジスタAREGのロック、ロックの解除を除き、図8に示すフェッチ部FTC、デコード部DECおよび演算部EXの動作と同様である。
以上、この実施形態では、実行サイクル数が動的に変化するサイクル可変命令の実行の完了が判断されるときに、フェッチ部FTCは、残りのサイクル可変命令のフェッチを止め、サイクル可変命令群の次の命令INSをフェッチする。これにより、不要なサイクル可変命令が実行されないため、命令の実行効率を向上させることができる。この結果、プロセッサPROCの演算処理の性能を向上させることができる。
図2は、別の実施形態におけるプロセッサの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。例えば、プロセッサPROCは、DSPやCPUであり、ベクトルプロセッサとして動作する。プロセッサPROCは、命令メモリIMEMおよび4バンク構成のデータメモリDMEM(DMEM0−DMEM3)に接続され、バスBUSを介して周辺回路PERIに接続されている。
例えば、プロセッサPROCは、命令メモリIMEM、データメモリDMEM0−3および周辺回路PERIとともに単一のLSI(Large Scale Integration)チップとして設計される。バスBUSは、外部端子ETMを介して、LSIチップの外部に配置される外部入出力装置に接続されてもよい。プロセッサPROC、命令メモリIMEM、データメモリDMEM0−3、周辺回路PERIおよび外部入出力装置により、システムが形成される。
プロセッサPROCは、レジスタ部REG、パイプラインPL、アドレスレジスタAREGおよびメモリ制御部MCNTを有している。レジスタ部REGは、ベクトルレジスタVR、マスクレジスタMRおよびスカラーレジスタSR等を有している。ベクトルレジスタVRは、プロセッサPROCが実行する演算に必要なベクトルデータやアクセスアドレス、演算により得られたベクトルデータが格納される。ベクトルレジスタVRの例は、図3に示す。
マスクレジスタMRは、ベクトルレジスタVRのうち使用しない格納領域を示すマスク情報が格納される。なお、マスク機能が不要なとき、レジスタ部REGはマスクレジスタMRを持たなくてもよい。スカラーレジスタSRは、汎用レジスタおよびベクトル長(図3)を示すレジスタ等を有している。なお、アドレスレジスタAREGは、スカラーレジスタSR内に形成されてもよい。
パイプラインPLは、フェッチ部FTC、デコード部DEC、演算部EX、メモリアクセス部MAおよびライトバック部WBを有している。すなわち、パイプラインPLは、5つのステージを有している。メモリアクセス部MAおよびライトバック部WBは、演算部EXによる演算の結果をデータメモリDMEM0−3またはレジスタ部REGに書き込む書き込み部の一例である。なお、フェッチ部FTCおよびデコード部DECを除く演算部EX、メモリアクセス部MAおよびライトバック部WBを、パイプラインPLと定義してもよい。
フェッチ部FTCは、命令メモリIMEMに供給するアドレスIADを管理し、順次更新するアドレスIADを命令メモリIMEMに供給し、命令メモリIMEMに格納されている命令INSを取得する。フェッチ部FTCは、演算部EXからの終了信号ENDに応答してアドレスレジスタAREGから読み出されるアドレスをアドレスIADとして命令メモリIMEMに出力する。
なお、命令メモリIMEMとフェッチ部FTCの間にプリフェッチ部を形成し、プリフェッチ部を介して命令メモリIMEMからフェッチ部FTCに命令を供給してもよい。プリフェッチ部は、図14および図17に示すVLIW型のプロセッサPROCに形成されてもよい。
デコード部DECは、アドレスIADとともにフェッチ部FTCから転送される命令INSを解析する。デコード部DECは、解析結果に応じて、命令INSを実行するために必要なレジスタにアクセスし、演算部EXに実行させる動作を指定する。デコード部DECは、命令INSが、実行サイクル数が動的に変化するサイクル可変命令であることを認識したときに、連続するサイクル可変命令であるサイクル可変命令群の次に実行される命令INSが格納されている命令メモリIMEMのアドレスIADを求め、求めたアドレスIADをアドレスレジスタAREGにセットする。サイクル可変命令の例は、図3、図4および図6に示す。デコード部DECは、演算部EXからの終了信号ENDに応答して、命令INSの解読を停止し、あるいは解読結果をマスクし、演算部EXにノーオペレーション(何もしない)を指示する。
演算部EXは、デコード部DECからの指示に基づいて、例えば、レジスタ部REGのベクトルレジスタVRに格納された値を用いて演算を実行する。演算結果は、メモリアクセス部MAに出力される。演算部EXは、ストア命令等の実行により、演算結果をデータメモリDMEMに格納する必要があるとき、格納先を示すアドレスDADを計算し、求めたアドレスDADをメモリ制御部MCNTに出力する。演算部EXは、サイクル可変命令群の実行中に、実行すべき全ての演算が完了したとき、終了信号ENDを出力する。
メモリアクセス部MAは、演算部EXの実行により得られたデータを受け、メモリ制御部MCNTまたはライトバック部WBに出力する。また、メモリアクセス部MAは、メモリ制御部MCNTを介してデータメモリDMEM0−3から出力されるデータをライトバック部WBに出力する。
ライトバック部WBは、命令の実行により得られるデータを、メモリアクセス部MAを介して演算部EXから受け、レジスタ部REG内のレジスタに書き込む。また、ライトバック部WBは、データメモリDMEM0−3から読み出されるデータをメモリアクセス部MAから受け、レジスタ部REG内のレジスタに書き込む。
メモリ制御部MCNTは、演算部EXからのアドレスDADに応じてデータメモリDMEM0−3にアクセスするためのメモリインタフェースの機能を有している。メモリ制御部MCNTは、メモリアクセス部MAから供給されるデータ(ストアデータ)をデータメモリDMEM0−3(4つのバンク)の少なくともいずれかに書き込み、データメモリDMEM0−3(4つのバンク)の少なくともいずれかから読み出したデータ(ロードデータ)を、メモリアクセス部MAに供給する。
メモリ制御部MCNTは、4つのデータメモリDMEM0−3に同時にアクセス可能である。換言すれば、1つのロード命令で、最大4つのデータメモリDMEM0−3からデータが読み出し可能であり、1つのストア命令で、最大4つのデータメモリDMEM0−3にデータが書き込み可能である。なお、データメモリDMEMの数は、4つに限定されず、一般的には、2のn乗個(nは正の整数)のデータメモリDMEMが、プロセッサPROCに接続可能である。
図3は、サイクル可変命令の例と、サイクル可変命令を実行するための演算部EXの例を示している。図3に示すサイクル可変命令は、インダイレクトロード命令およびインダイレクトストア命令である。例えば、インダイレクトロード命令は、オペレーションコードILDと3つのオペランドBASE、vr0、vr1により記述される。インダイレクトロード命令の実行では、ベクトルレジスタVR内のオペランドvr0で示されるベクトル領域(VR0、VR1、...、VR127の1つ)の16個の格納領域VR[0]、VR[1]、...、VR[15]に格納されているオフセットアドレス(相対アドレス)の配列に、オペランドBASEで示されるベースアドレス(絶対アドレス)がそれぞれ加算され、16個のアクセスアドレスA[0]、A[1]、...、A[15]が求められる。そして、アクセスアドレスA[0]−A[15]を用いてデータメモリDMEMからデータが読み出され、ベクトルレジスタVR内のオペランドvr1で示されるベクトル領域(VR0−VR127の1つ)に読み出されたデータが格納される。
例えば、インダイレクトストア命令は、オペレーションコードISTと3つのオペランドBASE、vr0、vr1により記述される。データメモリDMEMにアクセスするためのアドレスの求め方は、インダイレクトロード命令と同じである。インダイレクトストア命令では、ベクトルレジスタVR内のオペランドvr1で示されるベクトル領域(VR0−VR127の1つ)に格納されているデータVR[0]、VR[1]、...、VR[15]がデータメモリDMEMに書き込まれる。
図3に示すベクトルレジスタVRは、ベクトル長が16に設定されているときの状態を示している。例えば、ベクトルレジスタVRが2048個の格納領域を有するとき、ベクトル長に対応する16個の格納領域VR[0]、VR[1]、...、VR[15]をそれぞれ有する128個のベクトル領域VR0−VR127が割り当てられる。演算部EXは、絶対アドレス値(BASEで示す)に相対アドレス値(VR[0]−VR[15]で示す)をそれぞれ加算して、アクセスアドレスA[0]−A[15]を求める16個の演算器OP1(加算器)を有している。
なお、16個のアクセスアドレスA[0]−A[15]は、一度に求められるが、同時にアクセスできるデータメモリDMEM0−3の最大数は4であるため、インダイレクトロード命令およびインダイレクトストア命令の実行に必要なプロセッサPROCの動作サイクル数は、アクセスアドレス値に応じて変わる。すなわち、インダイレクトロード命令およびインダイレクトストア命令は、図5に示すように、命令の実行サイクル数が動的に変化する。
図4は、サイクル可変命令の別の例と、サイクル可変命令を実行するための演算部EXの例を示している。図4に示すサイクル可変命令は、ストライドロード命令およびストライドストア命令である。例えば、ストライドロード命令は、オペレーションコードSTRLDと4つのオペランドBASE、count、distance、vrにより記述される。例えば、ストライドストア命令は、オペレーションコードSTRSTと4つのオペランドBASE、count、distance、vrにより記述される。
ストライドロード命令の実行では、データメモリDMEM0−3により形成される矩形領域内の矩形のアクセス領域からデータが読み出され、ベクトルレジスタVR内のオペランドvrで示されるベクトル領域に格納される。ストライドストア命令の実行では、ベクトルレジスタVR内のオペランドvrで示されるベクトル領域に格納されているデータが、矩形のアクセス領域に書き込まれる。例えば、データメモリDMEM1−4のメモリ空間が表示装置の画面(矩形領域)に対応するとき、ストライドロード命令およびストライドストア命令により、画面に表示されている情報を取得し、あるいは画面を表示するための矩形アクセスが実施される。
矩形領域内の数値0、1、2、3は、データメモリDMEM0−3の番号を示している。矩形領域は、各データメモリDMEM0−3の1回にアクセスされる単位領域を帯状に順次つなげ、1行ずつ上から並べることで形成される。この例では、矩形領域の1行は、5つのデータメモリDMEMの単位領域を含んでいる。
ストライドロード命令およびストライドストア命令では、次のようにアクセス領域をアクセスするためのアクセスアドレスA[0]、A[1]、...、A[15]が求められる。アクセスアドレスA[0]−A[15]により、データメモリDMEM1−4のいずれかがアクセスされる。
まず、オペランドBASEで示される開始アドレス(以下、開始アドレスBASEと称する)を起点として、オペランドcountで示されるカウント数(以下、カウント数countと称する)分の1行目のアクセスアドレスが求められる。アクセスアドレスの数がカウント数countを超えた場合、開始アドレスBASEとオペランドdistanceで示される矩形領域の幅(以下、幅distanceと称する)とに基づいて次の行のアクセス開始アドレスが求められる。幅distanceは、矩形領域を1行アクセスするために必要なアクセスアドレスの数を示し、開始アドレスBASEに基づいてアクセス領域の各行の開始位置を求めるためのオフセットとなる。
そして、上述と同様に、カウント数count分の2行目のアクセスアドレスが求められる。以上を繰り返して、16個のアクセスアドレスA[0]−A[15]が求められる。これを複数回繰り返すことで、任意の大きさのアクセス領域のアクセスアドレスが順次求められる。
演算部EXは、アクセスアドレスA[0]−A[15]を一度に求めるための16個の演算器OP2を有している。アクセスアドレスA[0]を求める初段の演算器OP2は、初期値0を受け、開始アドレスBASEをアクセスアドレスA[0]として出力し、アクセスアドレスA[0]、アクセス数”1”および行数”1”を、2段目の演算器OP2に出力する。2段目以降の演算器OP2は、アクセス数がカウント数countより小さいとき、前段からのアクセスアドレスをインクリメントし、アクセスアドレスとして出力する。
一方、2段目以降の演算器OP2は、アクセス数がカウント数countと等しいとき、行数と幅distanceの積を開始アドレスBASEに加え、アクセスアドレスとして出力する。また、2段目以降の演算器OP2は、アクセス数がカウント数countと等しいとき、アクセス数を”0”にリセットし、行数をインクリメントし、アクセスアドレスとともに次段の演算器OP2に出力する。なお、各演算器OP2は、アクセス数を順次インクリメントし、アクセス数をカウント値countで割ることで、アクセス領域の行番号を求めてもよい。この場合、行数は、次段の演算器OP2に出力されなくてもよい。
図5は、図3および図4に示したサイクル可変命令の実行において、実行サイクル数が動的に変化する例を示している。演算部EXは、各実行サイクルCYC(CYC1−CY16)において、アクセスするデータメモリDMEM1−4が重複しないように、求めたアクセスアドレスA[0]−A[15]から最大4つを選択し、選択したアクセスアドレスをメモリ制御部MCNTに出力する。例えば、アクセスアドレスは、アクセスアドレスA[0]−A[15]の番号が小さい順に優先的に選択される。メモリ制御部MCNTは、演算部EXから供給されるアクセスアドレスに応じて、データメモリDMEM1−4にアクセスする。
サイクル可変命令群の実行は、例1では実行サイクルCYC1−CYC5で完了し、例2では実行サイクルCYC1−CYC4で完了し、例3では実行サイクルCYC1−CYC16で完了する。すなわち、例1では5つのサイクル可変命令が実行され、例2では4つのサイクル可変命令が実行され、例3では16個のサイクル可変命令が実行される。サイクル可変命令が最も効率的に実行されるのは例2であり、サイクル可変命令が最も非効率に実行されるのは例3である。このように、図3および図4に示したサイクル可変命令は、データメモリDMEM1−4のアクセスの重複具合により実行サイクル数が動的に変化し、終了サイクルが変化する。
実行サイクル数は、アクセスされるデータメモリDMEMに依存し、命令のコンパイル時に求めることができない。このため、サイクル可変命令は、最悪ケースである例3を考慮してプログラム中に記述される必要がある。すなわち、図5に示す例では、C言語等からアセンブリ言語(マシン語)の命令を生成するコンパイラは、連続する16個のサイクル可変命令をサイクル可変命令群として生成する。これにより、プロセッサPROCがサイクル可変命令群を実行するとき、例1では、11個の不要な命令が発生し、例2では、12個の不要な命令が発生する。
図6は、サイクル可変命令の別の例と、サイクル可変命令を実行するための演算部EXの例を示している。図6に示すサイクル可変命令は、検索命令である。例えば、検索命令は、オペレーションコードFINDと3つのオペランドRd、Rs1、Rs2により記述される。検索命令の実行では、ベクトルレジスタVR(図3)内のオペランドRs2で示されるベクトル領域(VR0−VR127の1つ)の各格納領域VR[i](iは0から15のいずれか)に格納されているデータが、オペランドRs1で示されるレジスタに格納されている参照データ(以下、参照データRs1と称する)と一致するかが検索される。そして、一致するデータが格納されている格納領域VR[i]を示す値がオペランドRdで示されるレジスタに格納される。参照データRs1と一致するデータが複数の格納領域VR[i]に格納されているとき、最も小さい番号が割り当てられている格納領域VR[i]を示す値がオペランドRdで示されるレジスタに格納される。
演算部EXは、16組の比較器CMPとセレクタSELのペアを有している。各比較器CMPは、ベクトル領域VR内の各格納領域VR[i]に格納されているデータが参照データRs1と一致するか否かを判定し、判定結果を対応するセレクタSELに出力する。
セレクタSELは、対応する比較器CMPの出力が不一致を示すときに、前段のセレクタSELから出力される不一致または一致済みを示す情報を次段のセレクタSELに出力する。「一致済み」は、比較器CMPにより一致が検出されたデータを格納している格納領域VR[i]のうち、最も番号が小さい格納領域VR[i]を示す情報を含んでいる。
セレクタSELは、対応する比較器CMPの出力が一致を示し、前段のセレクタSELの出力が不一致を示すときに、新たな一致済みを示す情報を次段のセレクタSELに出力する。「新たな一致済み」は、一致が検出されたデータを格納している格納領域VR[i]を示す情報を含んでいる。セレクタSELは、対応する比較器CMPの出力が一致を示し、前段のセレクタSELの出力が一致済みを示すときに、前段からの一致済みを示す情報を次段のセレクタSELに出力する。以上の動作により、最終段のセレクタSELから出力される検索結果RSLTは、参照データRs1と同じデータが格納されている格納領域VR[i]のうち、最も番号が小さい格納領域VR[i]を示す情報を含んでいる。
例えば、ベクトルレジスタVRが2048個の格納領域を有し、ベクトル長が256に設定されているとき、8個のベクトル領域VR0−VR7がベクトルレジスタVR内に割り当てられる。ベクトルレジスタVR、ベクトル領域VR0−7および格納領域VR[i]の関係は、図3と同様である。ベクトル領域VR0−VR7の1つにおける256個の格納領域VR[i]に格納されたデータと、参照データRs1との一致を検出する場合、演算部EXは、最小で1回、最大で16回の実行サイクルが必要である。
図7は、図6に示した検索命令のコンパイルの例を示している。例えば、C言語による記述では、While文により、格納領域VR[i]に格納されているデータが参照データDATAと一致するまで、データの検索が実施される。参照データDATAは、レジスタRs1に格納されている。検索の最大回数は、ベクトル長VL(この例では256)に対応する回数であり、ベクトル領域VR0−VR7のいずれかの全ての格納領域が検索される。
コンパイラは、C言語の記述をコンパイルし、プロセッサPROCにより実行可能なアセンブリ命令を生成する。この例では、図6で説明したように、最大で16回の実行サイクルが必要なため、連続する16個の検索命令が記述される。検索命令のオペランドRs2は、ベクトル領域VRn(VR0−VR7のいずれか)における256個の検索領域VR[0]−VR[255]をそれぞれ示す。プロセッサPROCは、他のサイクル可変命令と同様に、最小で検索命令を1回実行し、最大で検索命令を16回実行する。
図8は、図2に示したプロセッサPROCの動作の例を示している。この例では、サイクル可変命令としてインダイレクトロード命令が実行される。図8以降において、アドレスの値は16進数で示し、インダイレクトロード命令は符号ILDで示している。インダイレクトロード命令ILD等のサイクル可変命令は、太枠で示している。例えば、各命令は、32ビット(4バイト)で記述されるため、アドレスは4つずつ更新される。また、図8以降において、サイクルで示す数値は、プロセッサPROCの実行サイクルを示す。図8、図9および図10において、フェッチ部FTC、デコード部DEC、演算部EX、メモリアクセス部MAおよびライトバック部WBに示す各命令の右側の括弧内の数値は、アドレスの下位8ビットを示している。
命令メモリIMEMのアドレス0xXX00から0xXX54には、加算命令ADD、複数のインダイレクトロード命令ILD、加算命令ADDおよび複数のインダイレクトロード命令ILDが格納されている。加算命令ADDは、サイクル可変命令以外の通常の命令である。通常の命令は、加算命令ADDに限定されず、減算命令、乗算命令等でもよい。
インダイレクトロード命令ILDを実行するための最大の実行サイクル数は、図5に示したように16サイクルである。このため、命令メモリIMEMに格納されたプログラムにおいて、1回のインダイレクトロード命令ILDを実行するために、連続した16個のインダイレクトロード命令ILDを有するサイクル可変命令群が記述されている。
フェッチ部FTCは、サイクル毎に、命令メモリIMEMから命令INSを順次フェッチする。デコード部DECは、サイクル毎に、フェッチ部FTCからの命令INSを解読する。サイクル3において、デコード部DECは、命令INSの解読により、インダイレクトロード命令ILDを検出する。デコード部DECは、インダイレクトロード命令ILDとともにフェッチ部FTCから受けるアドレス(04)に16命令分の相対アドレス40を加算し、サイクル可変命令群の次の命令INSが格納されている命令メモリIMEMのアドレス44を求める。デコード部DECは、次のサイクル4において、求めたアドレス44をアドレスレジスタAREGに書き込む。
デコード部DECは、アドレス44をアドレスレジスタAREGに書き込んだ後、アドレスレジスタAREGに新たなアドレスが書き込まれることを禁止するために、アドレスレジスタAREGをロックする。デコード部DECは、インダイレクトロード命令ILDを解読する毎に、現在のアドレスに相対アドレスを加算し、加算したアドレスをアドレスレジスタAREGに書き込むために書き込み要求を出力する。しかし、アドレスレジスタAREGの書き換えは、ロック中に禁止されるため、アドレスレジスタAREG内のアドレス44はロックが解除されるまで保持される。
なお、デコード部DECは、先頭のインダイレクトロード命令ILDを解読したときのみ、サイクル可変命令群の次の命令INSが格納されているアドレスを求め、求めたアドレスをアドレスレジスタAREGに書き込んでもよい。図10、図12、図15の動作も同様である。この場合、アドレスレジスタAREGのロックおよびロックの解除の制御を不要にでき、デコード部DECの回路規模を削減できる。
演算部EXは、サイクル毎に、デコード部DECにより解読された命令INSの演算を実行する。インダイレクトロード命令ILDでは、演算部EXは、データを読み出すデータメモリDMEMのアドレスDAD(図2;最大4つ)をメモリ制御部MCNTに出力する。メモリアクセス部MAは、演算部EXの実行結果に応じて、メモリ制御部MCNTまたはライトバック部WBにデータを出力する。インダイレクトロード命令ILDでは、データメモリDMEMから読み出されたデータをメモリ制御部MCNTを介して受け、受けたデータをライトバック部WBに出力する。ライトバック部WBは、メモリアクセス部MAからのデータをレジスタ部REG内のレジスタに書き込む。
演算部EXは、サイクル8において、5つのインダイレクトロード命令ILDの演算の実行により、16個のデータをデータメモリDMEMから読み出せると判断し、終了信号ENDを出力する。すなわち、演算部EXは、次のサイクル9のメモリアクセス部MAの動作により全てのデータを得られ、インダイレクトロード命令ILDの実行が完了すると判断する。図8以降では、演算部EX、メモリアクセス部MAおよびライトバック部WBにおいて、インダイレクトロード命令ILDの実行が完了するサイクルの動作を太い破線枠で示している。
デコード部DECは、終了信号ENDを受けたサイクル8と次のサイクル9において、インダイレクトロード命令ILDを解読せずに、いわゆるNOP(No Operation)命令を演算部EXに出力する。NOP命令は、演算部EXの演算の実行を停止する命令である。なお、デコード部DECは、サイクル8−9において、インダイレクトロード命令ILDを解読し、解読したインダイレクトロード命令ILDの代わりに、NOP命令を演算部EXに出力してもよい。
フェッチ部FTCは、終了信号ENDを受けた次のサイクル9において、アドレスレジスタAREGに格納されているアドレス44を用いて、命令メモリIMEMから加算命令ADDをフェッチする。すなわち、サイクル可変命令群の次の命令がフェッチされる。終了信号ENDを受けた次のサイクル9において、デコード部DECは、アドレスレジスタAREGのロックを解除する。サイクル10において、デコード部DECは、加算命令ADDを解読する。
演算部EXは、サイクル9、10において、デコード部DECから受けるNOP命令を実行する。メモリアクセス部MAおよびライトバック部WBも、順次動作を停止し、NOP命令の実行状態になる。以上の動作により、16個のインダイレクトロード命令ILDで記述されるサイクル可変命令群の次の命令(ADD)の演算は、演算部EXにより11サイクル目で実行される。
以降、フェッチ部FTC、デコード部DEC、演算部EX、メモリアクセス部MAおよびライトバック部WBが順次動作し、命令INSが順次実行される。例えば、デコード部DECは、サイクル11において、2つ目のサイクル可変命令群(インダイレクトロード命令ILD)を受ける。デコード部DECは、アドレス(48)に相対アドレス40を加算し、16個のインダイレクトロード命令ILDで記述されるサイクル可変命令群の次の命令INSが格納されているアドレス88を求める。デコード部DECは、次のサイクル12において、求めたアドレス88をアドレスレジスタAREGに格納し、アドレスレジスタAREGをロックする。
なお、終了信号ENDは、メモリアクセス部MAまたはライトバック部WBから出力されてもよい。但し、実行の必要のない無駄なインダイレクトロード命令ILDのフェッチをできるだけ少なくするために、終了信号ENDは早いサイクルで出力された方がよい。このため、終了信号ENDは、インダイレクトロード命令ILDの実行が完了すると判断した時点で出力されることが望ましい。
図9は、図2に示したプロセッサPROCがアドレスレジスタAREGを持たないときの動作の例を示している。プロセッサPROCは、アドレスレジスタAREGを持たないとき、16個のインダイレクトロード命令ILDで記述されるサイクル可変命令群の次の命令INSが格納されている命令メモリIMEMのアドレスを保持できない。このため、演算部EXは、サイクル8においてサイクル可変命令群に対応して16個のデータをデータメモリDMEMから読み出せると判断した後も、残りのインダイレクトロード命令ILDの演算を実行する。なお、サイクル9−19では、演算部EXは、メモリアクセス部MAにデータメモリDMEMからのデータの読み出しを指示する必要がない。このため、実際には、演算部EXは、サイクル9−19では、残りのインダイレクトロード命令ILDの演算の実行を停止し、NOP命令を実行する。メモリアクセス部MAおよびライトバック部WBも、順次NOP命令の実行状態になる。
以上の動作により、16個のインダイレクトロード命令ILDで記述されるサイクル可変命令群の次の命令INS(ADD)の演算は、演算部EXにより20サイクル目で実行される。これは、図8に示した動作より9サイクル遅い。換言すれば、図2に示したプロセッサPROCは、無駄なNOP命令の実行数を削減でき、命令INSの実行効率を向上できる。
なお、図8および図9に示した動作は、図3のインダイレクトストア命令、図4のストライドロード命令およびストライドストア命令、図6の検索命令でも同様に実行される。これ等の動作は、図8および図9に示した符号「ILD」を「IST(インダイレクトストア命令)」、「STRLD(ストライドロード命令)」、「STRST(ストライドストア命令)」または「FIND(検索命令)」に置き換えることで表現される。この際、演算部EXは、16個のデータをデータメモリDMEMに対して読み出しまたは書き込みできると判断し、あるいはデータの検索が完了したと判断したときに終了信号ENDを出力する。
図10は、図2に示したプロセッサPROCの動作の別の例を示している。この例では、サイクル可変命令として検索命令が実行される。検索命令は符号FINDで示している。アドレスレジスタAREGへのアドレス44の格納動作は、図8と同じである。例えば、命令メモリIMEMは、図8に示したインダイレクトロード命令ILDの代わりに検索命令FINDを記憶している。すなわち、サイクル可変命令群は、16個の検索命令FINDで記述される。
この例では、演算部EXは、サイクル4において、サイクル可変命令群中の先頭の検索命令FINDの演算の実行時に、ベクトルレジスタVR内に保持されているデータが参照データRs1と同じであることを検出し、終了信号ENDを出力する。サイクル5−13までの動作は、サイクル可変命令の種類が異なることを除き、図8のサイクル9−17と同じである。この例では、図9の動作に比べて無駄なサイクル数を13サイクル削減できる。
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、デコード部DECは、解読した命令がサイクル可変命令のときに、サイクル可変命令群の次の命令が格納されているアドレスを計算し、計算したアドレスをアドレスレジスタAREGに書き込む。これにより、複数のサイクル可変命令群がプログラム中に存在するときにも、各サイクル可変命令群の次の命令が格納されているアドレスを確実に求めてアドレスレジスタAREGに書き込みできる。この際、アドレスレジスタAREGの書き込みのロックおよびロックの解除をすることで、サイクル可変命令を解読する毎にデコード部DECからアドレスレジスタAREGへの書き込み要求が発行される場合にも、アドレスレジスタAREGの誤書き込みを防止できる。
デコード部DECは、終了信号ENDを受けたときに、インダイレクトロード命令ILDの解読結果ではなく、NOP命令を演算部EXに出力する。これにより、演算部EXの動作を停止状態でき、プロセッサPROCの消費電力を削減できる。
図11は、別の実施形態におけるプロセッサPROCの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。例えば、プロセッサPROCは、DSPやCPUであり、ベクトルプロセッサとして動作する。プロセッサPROCは、命令メモリIMEMおよびデータメモリDMEM0−DMEM3に接続されている。
例えば、プロセッサPROCは、図2と同様に、バスBUSを介して周辺回路PERIに接続され、命令メモリIMEM、データメモリDMEM0−3および周辺回路PERIとともに単一のLSIチップとして設計される。図2と同様に、バスBUSは、外部端子ETMを介して、LSIチップの外部に配置される外部入出力装置に接続されてもよい。プロセッサPROC、命令メモリIMEM、データメモリDMEM0−3、周辺回路PERIおよび外部入出力装置により、システムが形成される。
プロセッサPROCは、レジスタ部REG、FIFO(First In, First Out)、フェッチ部FTC、デコード部DEC、4つのパイプラインPL(PL1−PL4)、アドレスレジスタAREGおよびメモリ制御部MCNTを有している。フェッチ部FTCおよびデコード部DECは、パイプラインPL1−4に共通のブロックである。プロセッサPROCは、命令INSの順序を入れ替えることなく実行する。すなわち、この実施形態のプロセッサPROCは、インオーダタイプのスーパースカラプロセッサである。なお、プロセッサPROCは、メモリ制御部MCNTに接続されていない、内部の演算のみを実行する1以上のパイプラインを、パイプラインPL1−4以外に有していてもよい。
レジスタ部REG、アドレスレジスタAREGおよびメモリ制御部MCNTは、図2に示したレジスタ部REG、アドレスレジスタAREGおよびメモリ制御部MCNTの機能と同様の機能を有している。レジスタ部REGのベクトルレジスタVRの例は、図3に示している。アドレスレジスタAREGは、スカラーレジスタSR内に形成されてもよい。
FIFOは、命令メモリIMEMに格納されている命令INSをプリフェッチし、プリフェッチした命令INSから順次フェッチ部FTCに出力する。FIFOは、命令メモリIMEMからの命令INSをプリフェッチするプリフェッチ部の一例である。この実施形態では、4つのパイプラインPL1−4が同時に動作可能であるため、FIFOは、命令INSを4つずつプリフェッチする。FIFOは、フェッチ部FTCからの転送要求REQ1が示す数の命令INSをフェッチ部FTCに出力する。
フェッチ部FTCは、命令メモリIMEMに供給するアドレスIADを管理し、FIFOに空き領域があるときに、命令メモリIMEMにアドレスIADを出力し、FIFOに命令INSを格納する。例えば、各命令は32ビットで記述される。4つの命令(128ビット=16バイト)が命令メモリIMEMからFIFOに一度に転送されるため、アドレスIADは16個(16進数の10)ずつ更新される。
フェッチ部FTCは、命令INSをフェッチ可能なときに、FIFOに転送要求REQ1を出力する。この例では、FIFOからフェッチ部FTCに一度にフェッチ可能な命令INSの数は、最小で1、最大で4である。フェッチ部FTCは、デコード部DECからの命令INSの転送要求REQ2に応答して、フェッチしている命令INSをデコード部DECに出力する。この例では、フェッチ部FTCからデコード部DECに一度に出力可能な命令INSの数は、デコード部DECの空きに応じて最小で1、最大で4である。
また、フェッチ部FTCは、各パイプラインPL1−4の演算部EXからの終了信号ENDに応答して、FIFOを空にする機能を有している。フェッチ部FTCは、終了信号ENDに応答して、アドレスレジスタAREGから読み出されるアドレスをアドレスIADとして命令メモリIMEMに出力する。
フェッチ部FTCは、アドレスレジスタAREGに保持されているアドレスを用いて命令メモリIMEMにアクセスするとき、命令メモリIMEMから読み出される命令INSをFIFOを介することなく直接受ける。すなわち、フェッチ部FTCは、終了信号ENDが出力されたときにFIFOを介することなく命令メモリIMEMに直接アクセスする。このために、FIFOを介することなく命令INSを命令メモリIMEMからフェッチ部FTCに転送するためのバイパス経路BPが形成されている。
例えば、フェッチ部FTCは、FIFOからの命令INSの伝達経路と命令メモリIMEMからの命令INSのバイパス経路BPのいずれかを選択するスイッチSWを有している。スイッチSWは、通常の動作時にFIFOからの命令INSの伝達経路を選択し、演算部EXからの終了信号ENDを受けた次のサイクルでは、命令メモリIMEMからの命令INSのバイパス経路BPを選択する。
デコード部DECは、パイプラインPL1−4に発行した命令INSの数に対応する転送要求REQ2をフェッチ部FTCに通知し、新たな命令INSをフェッチ部FTCから受ける。デコード部DECは、図2に示したデコード部DECの機能に加えて、命令INSのオペランド同士の競合を判断し、競合が発生しないようにパイプラインPL1−4に命令INSを割り当てる機能を有している。例えば、オペランドの競合は、複数の命令INSの実行中に発生する同じレジスタへの書き込み時に発生する。デコード部DECは、競合関係のある複数の命令INSをパイプラインPL1−4に同時に発行しない。このため、4つのパイプラインPL1−4は、4つの命令INSを同時に実行するとは限らない。
このように、スーパースカラプロセッサでは、命令INSの競合を避けながら、命令INSを並列化して実行することができ、プロセッサPROCの演算処理の性能を向上できる。但し、インダイレクトロード命令ILD、インダイレクトストア命令IST、ストライドロード命令STRLDおよびストライドストア命令STRST等のサイクル可変命令の実行では、全てのデータメモリDMEM1−4がアクセスされる可能性がある。このため、複数のパイプラインPL1−4によるデータメモリDMEM1−4のアクセスの競合を避けるため、これ等命令は、パイプラインPL1−4のいずれかに対してのみ発行される。検索命令FINDも、パイプラインPL1−4のいずれかに対してのみ発行される。
各パイプラインPL1−4は、図2と同様の演算部EX、メモリアクセス部MAおよびライトバック部WBを有している。この実施形態では、サイクル可変命令を実行するパイプラインPL(PL1−4のいずれか)の演算部EXは、終了信号ENDを出力する。メモリ制御部MCNTは、図2に示したメモリ制御部MCNTに、4つの演算部EXからの最大で4つのアドレスDADを同時に受ける機能を追加している。また、メモリ制御部MCNTは、図2に示したメモリ制御部MCNTに、メモリアクセス部MAに対して最大4つのデータを同時に入出力する機能を有している。レジスタ部REGは、ライトバック部WBからの最大4つのデータを同時に受ける機能を有している。
図12は、図11に示したプロセッサPROCの動作の例を示している。図8と同じ動作については、詳細な説明は省略する。サイクル可変命令は、太枠で示している。命令メモリIMEMにおいて、サイクル可変命令群を形成する16個のサイクル可変命令は、16個の連続する領域に格納されている。サイクル可変命令は、インダイレクトロード命令ILD、インダイレクトストア命令IST、ストライドロード命令STRLD、ストライドストア命令STRSTおよび検索命令FINDのいずれかである。サイクル可変命令を実行するための最大の実行サイクル数は、16サイクルである。
図12以降において、フェッチ部FTC、デコード部DEC、演算部EX、メモリアクセス部MAおよびライトバック部WBに示す数値と、FIFOまたは命令メモリIMEMに示す数値は、命令メモリIMEMのアドレスの下位8ビットの値を示しており、そのアドレスに格納されている命令を示している。
この実施形態では、4つのパイプラインPL1−4が同時に動作可能なため、フェッチ部FTCは、最大で4つの命令を同時にフェッチし、デコード部DECは、最大で4つの命令を同時に解読する。命令メモリIMEMは、命令を4つ単位で記憶している。図12では、FIFOは、命令メモリIMEMから複数の命令をプリフェッチしている。
サイクル1−3の各々において、フェッチ部FTCは、FIFOから4つの命令INSを同時にフェッチする。サイクル2において、デコード部DECは、フェッチ部FTCからの4つの命令INSを解読し、競合関係がないため、パイプラインPL1−4にそれぞれ割り当てる。サイクル3において、デコード部DECは、命令INSの解読により、サイクル可変命令群中の先頭のサイクル可変命令(10)を検出する。そして、デコード部DECは、例えばパイプラインPL1の演算部EXに、サイクル可変命令の実行をサイクル毎に順次指示する。
デコード部DECは、サイクル可変命令群中の先頭のサイクル可変命令とともにフェッチ部FTCから受けるアドレス(10)に16命令分の相対アドレス40を加算し、サイクル可変命令群の次の命令INSが格納されている命令メモリIMEMのアドレス50を求める。デコード部DECは、次のサイクル4において、求めたアドレス50をアドレスレジスタAREGに格納する。
サイクル4−9において、デコード部DECは、解読したサイクル可変命令を演算部EXに指示する毎に、フェッチ部FTCから次のサイクル可変命令を受ける。サイクル4−8において、フェッチ部FTCは、サイクル可変命令をデコード部DECに転送する毎に、新たなサイクル可変命令をFIFOから受ける。
パイプラインPL1の演算部EXは、サイクル可変命令を順次実行し、サイクル8において、16個のデータをデータメモリDMEMに対して読み出しまたは書き込みできると判断し、あるいは、データの検索が完了したと判断する。そしてパイプラインPL1の演算部EXは、終了信号ENDをフェッチ部FTCおよびデコード部DECに出力する。サイクル可変命令が供給されている間、デコード部DECは、パイプラインPL2−4で実行する命令を受けない。このため、デコード部DECは、この期間、例えば、NOP命令をパイプラインPL1−4に供給する。
サイクル9において、フェッチ部FTCは、終了信号ENDに応答してFIFOを空にし、バイパス経路BPを介して命令メモリIMEMからサイクル可変命令群の次の命令(アドレス50、54、58、5C)を直接受ける。命令メモリIMEMのアドレス50、54、58、5Cに格納されている命令INSは、通常の命令であり、競合関係もないため、パイプラインPL1−4にそれぞれ割り当てられる。この後、フェッチ部FTCにより次のサイクル可変命令群がフェッチされ、サイクル10−17では、サイクル2−10と同様の動作が実行される。
図13は、図11に示したプロセッサPROCがアドレスレジスタAREGを持たないときの動作の例を示している。図9および図12と同じ動作については、詳細な説明は省略する。命令メモリIMEMにおいて、サイクル可変命令群を形成する16個のサイクル可変命令は、16個の連続する領域に格納されている。サイクル可変命令は、インダイレクトロード命令ILD、インダイレクトストア命令IST、ストライドロード命令STRLD、ストライドストア命令STRSTおよび検索命令FINDのいずれかである。FIFOに格納されている命令は、図12と同じである。
この例では、図9と同様に、パイプラインPL1の演算部EXは、サイクル8においてサイクル可変命令群に対応して16個のデータがアクセスできると判断した後、あるいは、データの検索が完了したと判断した後、残りのインダイレクトロード命令ILDの演算を実行する。なお、サイクル9−19では、パイプラインPL1の演算部EXは、メモリアクセス部MAにデータメモリDMEMのアクセスを指示する必要がなく、あるいは、データの検索を実行する必要もない。このため、実際には、パイプラインPL1の演算部EXは、サイクル9−19では、残りのインダイレクトロード命令ILDの演算の実行を停止し、NOP命令を実行する。メモリアクセス部MAおよびライトバック部WBも、順次NOP命令の実行状態になる。
以上の動作により、図8と同様に、図12では、サイクル可変命令群の次の命令INS(ADD)を、図13に比べて9サイクル早く実行できる。すなわち、図11に示したプロセッサPROCは、無駄なNOP命令の実行数を削減でき、命令INSの実行効率を向上できる。
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、複数のパイプラインPL1−4を有するプロセッサPROCにおいても、不要なサイクル可変命令が実行されることを防止でき、命令の実行効率を向上できる。
また、フェッチ部FTCは、終了信号ENDが出力されたときに、アドレスレジスタAREGに保持されているアドレスを用いてFIFOを介することなく命令メモリIMEMに直接アクセスする。これにより、フェッチ部FTCと命令メモリIMEMとの間にFIFOが配置される場合にも、フェッチ部FTCは、FIFOに保持されている命令とは無関係に、バイパス経路BPを介してサイクル可変命令群の次の命令を優先的にフェッチできる。この結果、プロセッサPROCによる命令INSの実行効率を向上できる。これに対して、バイパス経路BPがない場合、フェッチ部FTCによる次の命令のフェッチは、FIFOを空にし、FIFOに次の命令をプリフェッチした後になり、実行効率の向上の妨げになる。
図14は、別の実施形態におけるプロセッサPROCの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。例えば、プロセッサPROCは、VLIW(Very Long Instruction Word)型のDSPやCPUであり、ベクトルプロセッサとして動作する。プロセッサPROCは、命令メモリIMEMおよびデータメモリDMEM0−DMEM3に接続されている。
例えば、プロセッサPROCは、図2と同様に、バスBUSを介して周辺回路PERIに接続され、命令メモリIMEM、データメモリDMEM0−3および周辺回路PERIとともに単一のLSIチップとして設計される。図2と同様に、バスBUSは、外部端子ETMを介して、LSIチップの外部に配置される外部入出力装置に接続されてもよい。プロセッサPROC、命令メモリIMEM、データメモリDMEM0−3、周辺回路PERIおよび外部入出力装置により、システムが形成される。
プロセッサPROCは、レジスタ部REG、フェッチ部FTC、デコード部DEC、4つのパイプラインPL(PL1−PL4)、アドレスレジスタAREGおよびメモリ制御部MCNTを有している。フェッチ部FTCおよびデコード部DECは、パイプラインPL1−4に共通のブロックである。レジスタ部REG、パイプラインPL1−4、アドレスレジスタAREGおよびメモリ制御部MCNTは、図11と同じ機能を有している。
フェッチ部FTCは、命令メモリIMEMから命令INSを4つずつ取得し、取得した命令INSを4つずつデコード部DECに出力することを除き、図2に示したフェッチ部FTCと同じ機能を有している。例えば、1つの命令INSは、32ビットで記述される。デコード部DECは、フェッチ部FTCから転送される4つの命令INSを同時に解析し、解析結果に応じて、命令INSを実行するために必要なレジスタにアクセスし、各パイプラインPL1−4の演算部EXに実行させる動作を指定することを除き、図2に示したデコード部DECと同じ機能を有している。
なお、VLIW型のプロセッサでは、命令メモリIMEMに格納されている命令INSは、どのパイプラインPL1−4で実行するかを考慮してプログラムされている。すなわち、命令INSは、パイプラインPL1−4での競合が発生しないようにプログラムされている。このため、図11に示したプロセッサPROCと異なり、デコード部DECは、命令INSのオペランド同士の競合を判断する機能、および、競合が発生しないようにパイプラインPL1−4に命令INSを割り当てる機能を持たない。
パイプラインPL1−4の構成は、図11に示したパイプラインPL1−4と同じである。パイプラインPL1−4と、フェッチ部FTC、デコード部DEC、レジスタ部REGおよびメモリ制御部MCNTとの接続関係は、図11と同じである。
図15は、図14に示したプロセッサPROCの動作の例を示している。図8および図12と同じ動作については、詳細な説明は省略する。例えば、各命令は32ビットで記述され、4つの命令(128ビット=16バイト)が命令メモリIMEMからフェッチ部FTCに一度に転送される。このため、アドレスIADは16個(16進数の10)ずつ更新される。フェッチ部FTCおよびデコード部DECは、サイクル毎に4つの命令(128ビット=16バイト)を同時に取り込む。デコード部DECは、取り込んだ4つの命令を同時に解読し、あらかじめ決められた順にパイプラインPL1−4の演算部EXにそれぞれ割り当てる。例えば、解読された命令は、アドレスが小さい順にパイプラインPL1−4に順に割り当てられる。
命令メモリIMEMの太枠は、4つの命令の最初がサイクル可変命令であることを示している。フェッチ部FTC、デコード部DECおよびパイプラインPL1の太枠は、サイクル可変命令を示している。命令メモリIMEMにおいて、サイクル可変命令群を形成する16個のサイクル可変命令は、16個の連続するアドレス(10、20、...、F0、100)に格納されている。
命令メモリIMEMにおいて、下位の4ビットの値が4、8、Cのアドレスには、パイプラインPL2−4で実行される通常の命令が格納されている。VLIW型のプロセッサPROCで実行される命令INSは、パイプラインPL1−4での競合が発生しないようプログラムが最適化されている。このため、例えば、パイプラインPL1−4で実行される通常の命令INS(サイクル可変命令を除く命令)は、NOP命令を含んでいる。
サイクル可変命令は、インダイレクトロード命令ILD、インダイレクトストア命令IST、ストライドロード命令STRLD、ストライドストア命令STRSTおよび検索命令FINDのいずれかである。サイクル可変命令を実行するための最大の実行サイクル数は、16サイクルである。
サイクル3において、デコード部DECは、サイクル可変命令群中の先頭のサイクル可変命令(アドレス10)を検出し、パイプラインPL1の演算部EXに、サイクル可変命令の実行を指示する。この後の動作は、フェッチ部FTCおよびデコード部DECが命令INSを4つずつ取り込むこと、命令が格納されているアドレスが異なること、およびパイプラインPL2−4がデコード部DECにより解読された命令を実行することを除き、図12と同様である。
図16は、図14に示したプロセッサPROCがアドレスレジスタAREGを持たないときの動作の例を示している。図9、図13および図15と同じ動作については、詳細な説明は省略する。命令メモリIMEMに格納されている命令は、図15と同じである。サイクル可変命令は、インダイレクトロード命令ILD、インダイレクトストア命令IST、ストライドロード命令STRLD、ストライドストア命令STRSTおよび検索命令FINDのいずれかである。
この例では、図15と同様に、パイプラインPL1の演算部EXは、サイクル8においてサイクル可変命令群に対応して16個のデータがアクセスできると判断し、あるいは、データの検索が完了したと判断した後も、残りのインダイレクトロード命令ILDの演算を実行する。なお、実際には、パイプラインPL1の演算部EXは、サイクル9−19では、残りのインダイレクトロード命令ILDの演算の実行を停止し、NOP命令を実行する。パイプラインPL1のメモリアクセス部MAおよびライトバック部WBも、順次NOP命令の実行状態になる。パイプラインPL2−4の動作は、図15と同様である。
以上の動作により、図8および図12と同様に、図15では、サイクル可変命令群の次の命令(アドレス110)を、図16に比べて9サイクル早く実行できる。すなわち、図14に示したプロセッサPROCは、無駄なNOP命令の実行数を削減でき、命令INSの実行効率を向上できる。
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、複数のパイプラインPL1−4を有するVLIW型のプロセッサPROCにおいても、不要なサイクル可変命令が実行されることを防止でき、命令の実行効率を向上できる。
図17は、別の実施形態におけるプロセッサPROCの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。例えば、プロセッサPROCは、VLIW型のDSPやCPUであり、ベクトルプロセッサとして動作する。プロセッサPROCは、命令メモリIMEMおよびデータメモリDMEM0−DMEM3に接続されている。
例えば、プロセッサPROCは、図2と同様に、バスBUSを介して周辺回路PERIに接続され、命令メモリIMEM、データメモリDMEM0−3および周辺回路PERIとともに単一のLSIチップとして設計される。図2と同様に、バスBUSは、外部端子ETMを介して、LSIチップの外部に配置される外部入出力装置に接続されてもよい。プロセッサPROC、命令メモリIMEM、データメモリDMEM0−3、周辺回路PERIおよび外部入出力装置により、システムが形成される。
プロセッサPROCは、フェッチ部FTCおよびデコード部DECの機能が図14に示したフェッチ部FTCおよびデコード部DECの機能と相違している。また、プロセッサPROCは、図14に示したプロセッサPROCに命令レジスタIREGを追加している。プロセッサPROCのその他の構成は、図14のプロセッサPROCと同様である。
命令メモリIMEMは、NOP命令の代わりにNOP命令の有無を示す符号を記憶している。すなわち、NOP命令を示すコード長は圧縮されている。NOP命令の圧縮は、命令メモリIMEMに格納されるプログラムを生成するコンパイラあるいはコンパイル後の圧縮処理で実施される。
フェッチ部FTCは、デコード部DECからの停止信号STOPを受けている間、順次に発生するアドレスを用いた命令INSのフェッチを停止する機能を、図14に示したフェッチ部FTCに追加している。また、フェッチ部FTCは、命令メモリIMEMに格納されているサイクル可変命令群の次の命令INSを通常のフェッチ動作の空き期間に取り込み、命令レジスタIREGに格納する機能を、図14に示したフェッチ部FTCに追加している。
デコード部DECは、圧縮されたNOP命令を解凍する機能を、図14に示したデコード部DECに追加している。また、デコード部DECは、NOP命令が圧縮されていることを検出したときに、対応するパイプラインPLの演算部EXにNOP命令を供給し、停止信号STOPを出力する機能を、図14に示したデコード部DECに追加している。
図18は、図17に示したデコード部DECの解凍動作の例を示している。例1から例3は、命令メモリIMEMからフェッチ部FTCに一度にフェッチされる4つの命令INSを示している。各命令INSの上位4ビットは、NOP命令の有無を示す符号が格納されている。論理0はNOP命令がないことを示し、論理1は、NOP命令があることを示す。各命令INSの下位28ビットは、パイプラインPL1−4のいずれかで実行される命令0−命令3が格納されている。NOP命令が圧縮されているため、命令0−命令3はNOP命令を含まない。
例1では、4つの命令INSの符号が全て論理0のため、デコード部DECは、NOP命令の圧縮はないと判断し、命令0−3をパイプラインPL1−4の演算部EXにそれぞれ割り当てる。なお、例1の命令0−3は、サイクル可変命令以外の通常の命令である。
例2の命令0を含む命令INSの3番目と4番目の符号は論理1のため、デコード部DECは、パイプラインPL3−4で実行すべきNOP命令が圧縮されていると判断する。そして、デコード部DECは、命令0、NOP命令、NOP命令をパイプラインPL1、PL3、PL4にそれぞれ割り当てる。さらに、デコード部DECは、パイプラインPL2で実行する命令が命令1であると判断し、命令1をパイプラインPL2に割り当てる。命令1に隣接する4ビットの符号は全て論理0に設定される。
例2の命令2−3を含む2つの命令INSの2番目から4番目の符号は論理1のため、デコード部DECは、パイプラインPL2−4で実行すべきNOP命令が圧縮されていると判断する。そして、デコード部DECは、命令2、NOP命令、NOP命令、NOP命令をパイプラインPL1、PL2、PL3、PL4にそれぞれ割り当てる。デコード部DECは、命令3、NOP命令、NOP命令、NOP命令をパイプラインPL1、PL2、PL3、PL4にそれぞれ割り当てる。これにより、例2では、4つの命令により、パイプラインPL1−4の3サイクル分の命令INSを生成できる。この結果、命令メモリIMEMに格納されるプログラムのサイズを削減でき、命令メモリIMEMへのアクセス頻度を削減できる。
例3では、命令0がサイクル可変命令群の先頭のサイクル可変命令(例えば、インダイレクトロード命令ILD)で、4ビットの符号のうち1ビットが論理1のときを示している。このとき、2番目の命令INSの符号は全て論理0に設定され、命令を格納する領域にはアドレスADRが格納されている。アドレスADRは、命令メモリIMEMにおいてサイクル可変命令群の次の命令INSが格納されているアドレスを示す。例3では、最初の命令INSの2番目の符号が論理1のため、デコード部DECは、NOP命令をパイプラインPL2に割り当てる。3番目および4番目の符号は全て論理0のため、デコード部DECは、命令1−2をパイプラインPL3−4に割り当てる。
VLIW型のプロセッサPROCのプログラムでは、NOP命令が圧縮されない場合、図15で説明したように、16個のサイクル可変命令とともにパイプラインPL2−4に対応する48個の命令INSが、命令メモリIMEMに格納されている。このため、サイクル可変命令群の次の命令INSは、命令メモリIMEMにおいて、先頭のサイクル可変命令が格納されているアドレスに100(16進数)を加えた領域に常に格納されている。しかし、NOP命令が圧縮されている場合、サイクル可変命令群の次の命令INSのアドレスは、NOP命令の圧縮数に応じて変化する。換言すれば、命令メモリIMEMに格納されたプログラムのアドレスの進み方は、NOP命令が圧縮されている場合と圧縮されていない場合とで異なる。このため、プログラム中にアドレスADRを記述しておき、フェッチ部FTCは、先頭のサイクル可変命令とともにアドレスADRをフェッチする必要がある。
例2において、4ビットの符号のうち2ビットが論理1のとき、すなわち、2つのNOP命令が圧縮されているとき、2つの命令INSを用いて、パイプラインPL1−4で実行する命令が割り当てられる。このとき、2つ目の命令INSの符号は全て論理0に設定されている。4ビットの符号のうち3ビットが論理1のとき、すなわち、3つのNOP命令が圧縮されているとき、1つの命令INSを用いて、パイプラインPL1−4で実行する命令が割り当てられる。図18には示していないが、4ビットの符号のうち1ビットが論理1のとき、すなわち、1つのNOP命令が圧縮されているとき、3つの命令INSを用いて、パイプラインPL1−4で実行する命令が割り当てられる。
図19は、図17に示したプロセッサPROCの動作の例を示している。図8、図12および図15と同じ動作については、詳細な説明は省略する。例えば、デコード部DECからパイプラインPL1−4への命令実行の指示、およびパイプラインPL1−4の動作は、図15と同じである。
命令メモリIMEMに示した太枠は、パイプラインPL1−4で並列に実行される命令群INSを示している。なお、図19および図20では、符号INS、INSa−INShは、サイクル可変命令以外の通常の命令を示し、符号ILD1−ILD16は、インダイレクトロード命令ILDを示している。なお、符号ILD1−16は、インダイレクトストア命令IST、ストライドロード命令STRLD、ストライドストア命令STRSTまたは検索命令FIND等のサイクル可変命令に置き換えられてもよい。命令メモリIMEMの右側に示した角括弧によるくくりは、フェッチ部FTCに一度にフェッチされる4つの命令を示している。
各サイクル1−4において、フェッチ部FTCは、命令メモリIMEMから4つの命令INSを順次フェッチする。サイクル2において、デコード部DECは、フェッチ部FTCからの命令INSを解読し、パイプラインPL1−4にそれぞれ割り当てる。
サイクル3において、デコード部DECは、サイクル可変命令群の先頭のサイクル可変命令ILD1を検出し、パイプラインPL1の演算部EXに、サイクル可変命令ILD1の実行を順次指示する。また、デコード部DECは、先頭のサイクル可変命令ILD1の次の命令をアドレスADRとしてアドレスレジスタAREGに格納する。この実施形態では、アドレスADRは、命令コードとして命令メモリIMEMから供給されたときに、アドレスレジスタAREGに書き込まれる。このため、図8等に示したアドレスレジスタAREGのロックおよびロックの解除は、不要である。
デコード部DECは、アドレスADRが格納されている命令を、NOP命令として認識し、対応するパイプラインPL2の演算部EXにNOP命令を指示する。なお、サイクル3では、デコード部DECは、NOP命令の圧縮を検出しないため、残りの2つの命令INSをパイプラインPL3−4にそれぞれ割り当てる。
サイクル4において、デコード部DECは、サイクル可変命令ILD2の検出とともにパイプラインPL3−4で実行すべき2つのNOP命令が圧縮されていることを検出する。デコード部DECは、圧縮されたNOP命令を解凍し、パイプラインPL3−4の演算部EXにNOP命令を供給する。デコード部DECは、NOP命令の解凍により、パイプラインPL1−4に出力しきれない解読した命令(この例では、ILD3、ILD4)が残っていると判断し、フェッチ部FTCに停止信号STOPを出力する。
また、デコード部DECは、各サイクル可変命令ILD3、ILD4の検出とともにパイプラインPL2−4で実行すべき3つのNOP命令が圧縮されていることを検出する。すなわち、デコード部DECは、フェッチ部FTCから受ける4つの命令に3サイクル分の命令が含まれていることを検出し、サイクル4−6において、図18に示した例2の動作を実行する。
デコード部DECは、圧縮されたNOP命令を除く命令を4つ単位でフェッチ部FTCから受ける。NOP命令が圧縮されているとき、デコード部DECは、フェッチ部FTCから受けた4つの命令の一部をパイプラインPLに指示できず、保持しておく必要がある。デコード部DECは、NOP命令の圧縮に伴い命令を保持している間、フェッチ部FTCから新たな命令が出力されることを禁止するため、停止信号STOPをフェッチ部FTCに出力する。フェッチ部FTCは、停止信号STOPを受けている間、順次発生するアドレスを用いた命令のフェッチを禁止する。したがって、サイクル可変命令ILD5−8は、サイクル4−6の間、フェッチ部FTCに保持される。
停止信号STOPが出力されている間、命令メモリIMEMはアクセスされない。デコード部DECは、命令メモリIMEMの空きサイクルを利用して、アドレスレジスタAREGに格納されているアドレスADRによる命令メモリIMEMのアクセスをフェッチ部FTCに指示する。フェッチ部FTCは、停止信号STOPを受けているときに、アドレスADRを用いて、サイクル可変命令群の次に格納されている命令INSa−INSdを命令メモリIMEMからフェッチし、フェッチした命令INSa−INSdを命令レジスタIREGに格納する。なお、フェッチ部FTCは、デコード部DECからの指示を受けることなく、アドレスレジスタAREGに格納されているアドレスADRによる命令メモリIMEMのアクセスを、停止信号STOPに応答して実行してもよい。
サイクル5において、デコード部DECは、サイクル可変命令ILD3、NOP命令、NOP命令、NOP命令をパイプラインPL1−4の演算部EXに出力する。サイクル6において、デコード部DECは、サイクル可変命令ILD4、NOP命令、NOP命令、NOP命令をパイプラインPL1−4の演算部EXに出力し、停止信号STOPの出力を停止する。これにより、サイクル7において、フェッチ部FTCは、サイクル可変命令ILD5−8をデコード部DECに出力し、新たなサイクル可変命令ILD9−12を命令メモリIMEMからフェッチする。
サイクル7において、デコード部DECは、サイクル可変命令ILD5−8を解読し、各サイクル可変命令ILD5−8に3つのNOP命令が圧縮されていることを検出する。すなわち、デコード部DECは、フェッチ部FTCから受ける4つの命令に4サイクル分の命令が含まれていることを検出し、サイクル7−10において、図18に示した例2の2サイクル目の動作をそれぞれ実行する。
サイクル10において、パイプラインPL1の演算部EXは、サイクル可変命令ILD7により、データメモリDMEMのアクセスが完了すると判断し、あるいはデータの検索が完了すると判断し、終了信号ENDをフェッチ部FTCおよびデコード部DECに出力する。終了信号ENDを受けたフェッチ部FTCは、サイクル11において、サイクル可変命令群の2つ後の命令INSe、INSf、INSg、INShをフェッチする。例えば、フェッチ部FTCは、アドレスレジスタAREGに格納されているアドレスADRにアドレス10(16進数)を加えることで、2つ後の命令INSe−INShが格納されている命令メモリIMEMのアドレス(ADRの1つ先のアドレス)を求める。
終了信号ENDを受けたデコード部DECは、サイクル11において、フェッチ部FTCに保持されている命令ではなく、命令レジスタIREGに保持されている命令INSa−INSdを取得し、取得した命令INSa−INSdを解読する。デコード部DECは、解読した結果をパイプラインPL1−4の演算部EXに供給する。サイクル12において、デコード部DECは、フェッチ部FTCから次の命令ISTe−ISThを受けて解読する。
以上の動作により、フェッチ部FTCは、命令メモリIMEMのアドレスADRに格納されている命令を、終了信号ENDの後にフェッチする必要がなくなる。したがって、終了信号ENDの後にパイプラインPL1−4が実行するNOP命令の数を1サイクル分少なくできる。
図20は、図17に示したプロセッサPROCがアドレスレジスタAREGおよび命令レジスタIREGを持たないときの動作の例を示している。図8、図12図15および図19と同じ動作については、詳細な説明は省略する。命令メモリIMEMに格納されている命令は、図19と同じである。
この例では、図19と同様に、パイプラインPL1の演算部EXは、サイクル10においてデータメモリDMEMのアクセスが完了し、あるいはデータの検索が完了すると判断した後も、残りのサイクル可変命令ILD8−ILD16の演算を実行する。なお、実際には、パイプラインPL1の演算部EXは、サイクル11−19では、残りのサイクル可変命令ILD8−ILD16の演算の実行を停止し、NOP命令を実行する。パイプラインPL1のメモリアクセス部MAおよびライトバック部WBも、順次NOP命令の実行状態になる。
以上の動作により、図19では、サイクル可変命令群の次の命令を、図20に比べて8サイクル早く実行できる。これは、図14に示したVLIW型のプロセッサPROCの動作(図15)に比べて、さらに1サイクル改善している。
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、圧縮された命令がデコード部DECにより検出され、パイプラインPL1−4に出力しきれない解読した命令が残っていると判断されたときに、アドレスレジスタAREG内のアドレスを用いてサイクル可変命令群の次の命令が先読みされる。これにより、終了信号ENDが出力される前に、サイクル可変命令群の次の命令を命令レジスタIREGに保持することができ、命令の実行効率を向上させることができる。
図21および図22は、別の実施形態におけるプロセッサPROCにおいて、NOP命令以外の命令の圧縮の例を示している。例えば、信号処理等において配列の演算が行われるとき、連続する複数の命令において、番号が連続するレジスタが指定されることが多い。特に、ベクトルレジスタVRを有するプロセッサ(ベクトルプロセッサ)では、大きなベクトル長VLが設定されているとき、演算毎に番号が連続するレジスタが指定される。
図21は、ベクトルレジスタVRを用いた加算処理において番号が連続するレジスタが指定される例を示している。例えば、図21に示した加算処理を実行するプロセッサPROCは、デコード部DECが、圧縮されたNOP命令ではなく圧縮された加算命令を解凍する機能を有することを除き、図17と同じである。すなわち、プロセッサPROCは、VLIW型のDSPやCPUであり、ベクトルプロセッサとして動作する。
図21のC言語による記述は、ベクトル長VL(この例では128)の回数だけベクトルレジスタVRの格納領域a[i]、b[i]内のデータを加算し、加算結果を格納領域c[i]に格納することを示している。格納領域a[i]、b[i]のデータは、データメモリDMEM0−3の領域ADR0−7、ADR8−15からそれぞれロードされる。格納流域c[i]のデータ(加算結果)は、データメモリDMEM0−3の領域ADR16−23に格納される。例えば、格納領域a[i]はベクトル領域VRa内の格納領域VR[0]−VR[127]である。同様に、格納領域b[i]はベクトル領域VRb内の格納領域VR[0]−VR[127]であり、格納領域c[i]はベクトル領域VRc内の格納領域VR[0]−VR[127]である。
プロセッサPROCにおいて、各パイプラインPL1−4の演算部EX(図17)は、図3、図4、図6と同様に、同時に動作可能な16個の演算器(加算器を含む)を有している。このため、ベクトル長VLに対応する128個のデータの加算(ADD)、ロード(LD)およびストア(ST)は、それぞれ命令を8回実行する必要がある。このため、C言語の記述からプロセッサPROCにより実行可能なアセンブリ命令を生成するコンパイラは、加算命令ADD、ロード命令LDおよびストア命令STを、それぞれ8個を生成する。
図22は、図21に示した加算命令ADDの圧縮および解凍の例を示している。加算命令ADDの圧縮は、命令メモリIMEMに格納されるプログラムを生成するコンパイラあるいはコンパイル後の圧縮処理で実施される。この例では、レジスタ番号が連続する4つの加算命令ADD(128ビット)が、48ビットに圧縮される。
圧縮後の命令に含まれる符号Lは、圧縮された命令のコード長を示し、図22に示す例では、前から2つのコード長Lに48が格納され、最後のコード長Lに0が格納されている。なお、例えば、コード長Lが0、32、48、64のいずれかに設定される場合、コード長Lは2ビット(0、1、2、3のいずれか)で表現できる。これにより、圧縮された命令のコード長はさらに短くなる。
コード長Lの次の4ビットは、圧縮された4つの加算命令ADDにそれぞれ対応しており、オペランド(レジスタ番号)が1つ前の加算命令ADDのオペランドを引き継ぐときに論理1に設定され、引き継がないときに論理0に設定される。例えば、圧縮される4つの加算命令ADDの先頭の加算命令ADDは、オペランドを引き継がない命令であり、圧縮後の命令コード列にオペランドが記述される。
プロセッサPROCはVLIW型であり、例えば、図19に示したように、命令を4つずつフェッチし、デコード部DECで解読する。このため、各命令が32ビットで記述されるとき、圧縮された命令は、128ビット(32ビットの4倍)の領域からはみ出すことなく配置されなくてはならない。図22の例では、圧縮された2つの命令のコード長は、それぞれ48ビットであるため、128ビットの領域からはみ出すことがない。
図22の例では、圧縮後の命令において、128ビットの残りの32ビットは使用されない。このとき、残りの32ビットの値が無効であることを示すために最後のコード長Lは0に設定される。最後のコード長Lの後ろは、ダミー命令(例えば、オール0やオール1)が書き込まれる。なお、例えば、圧縮された3つの命令が記述されるとき、3つ目の命令は、128ビットの領域からはみ出すために次の128ビットの領域に配置され、コード長Lの次の4ビットは全て論理1に設定される。このときにも、2つ目の命令の後ろに配置される最後のコード長Lは0に設定され、最後のコード長Lの後ろは、ダミー命令が書き込まれる。
圧縮された命令を解凍するデコード部DECは、まず、コード長Lの値48に基づいて圧縮された命令の切れ目を認識する。次にコード長Lの後ろの4ビットの値に基づいて、最初の4つの命令を再生する。再生された命令は、演算部EXに供給される。デコード部DECは、次のコード長Lの値が48であるため、解凍すべき命令がまだあることを認識し、フェッチ部FTCに停止信号STOPを出力する。この動作は、図19および図20と同様である。
デコード部DECは、演算部EXにサイクル可変命令を実行させているとき、停止信号STOPの出力中に、図19と同様に、アドレスレジスタAREGに格納されているアドレスADRによる命令メモリIMEMのアクセスをフェッチ部FTCに指示する。フェッチ部FTCは、アドレスADRを用いて、サイクル可変命令群の次に格納されている命令(例えば、図9のINSa−INSd)を命令メモリIMEMから読み出し、読み出した命令を命令レジスタIREGに格納する。
デコード部DECは、次の圧縮された命令を解凍して次の4つの命令を再生し、再生した命令を次のサイクルで演算部EXに供給する。デコード部DECは、最後のコード長Lの値が0であるため、その後ろに圧縮された命令がないことを認識する。そして、デコード部DECは、停止信号STOPの出力を停止し、フェッチ部FTCから次の命令を取得する。フェッチ部FTCは、次の命令を命令メモリIMEMからフェチする。
このように、加算命令ADDを圧縮する場合にも、図19および図20と同様の動作を実行でき、命令の実行効率を向上できる。なお、加算命令ADDの圧縮と同様の手法を用いて、図21に示したロード命令LDやストア命令STを圧縮することも可能である。
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、加算命令ADDやロード命令LD、ストア命令STが圧縮されるときにも、プロセッサPROCを図19および図20と同様に動作させることができ、命令の実行効率を向上させることができる。
図23は、上述したプロセッサPROCが搭載されるシステムSYSの例を示している。例えば、システムSYSは、携帯電話等の組み込み型の通信機器であり、アンテナANT、復調器DMD、変調器MD、命令メモリIMEM、プロセッサPROC、データメモリDMEM0−3、データ処理回路DPおよび入出力部I/Oを有している。例えば、命令メモリIMEM、プロセッサPROCおよびデータメモリDMEM0−3は、単一のLSIチップとして設計される。LSIチップは、データ処理回路DPを含んでいてもよい。プロセッサPROCは、図1、図2、図11、図14または図17に示したプロセッサPROC、あるいは図22の圧縮された命令を処理するプロセッサPROCのいずれかである。
復調器DMDは、アンテナANTを介して受信する受信データを復調し、LSIに出力する。LSI内では、復調された受信データは、データメモリDMEM0−3に格納される。復調器DMDは、プロセッサPROCが演算する受信データを生成するデータ生成部の一例である。プロセッサPROCは、受信データに含まれる受信情報を演算により取り出し、取り出した受信情報をデータメモリDMEM0−3に書き込む。
また、プロセッサPROCは、データメモリDMEM0−3に格納されている送信情報を演算して送信データを生成し、生成した送信データをデータメモリDMEM0−3に書き込む。変調器MDは、データメモリDMEM0−3に格納されている送信データを変調し、アンテナANTに出力する。変調器MDは、プロセッサPROCにより演算された送信データを用いてデータ処理を実行するデータ処理部の一例である。
データ処理回路DPは、データメモリDMEM0−3に格納されている受信情報を用いて、受信情報の種類に応じた処理を実行する。また、データ処理回路DPは、送信データを生成し、データメモリDMEM0−3に書き込む。データ処理回路DPは、プロセッサPROCにより演算された受信データを用いてデータ処理を実行するデータ処理部の一例であり、あるいはプロセッサPROCが演算する送信データを生成するデータ生成部の一例である。
例えば、データ処理回路DPは、音声データを再生するためのデコード処理や、画像データを再生するためのデコード処理、あるいは、音声データや画像データのエンコード処理を実行する。なお、音声データのデコード処理やエンコード処理、画像データのデコード処理やエンコード処理をそれぞれ実行する複数のデータ処理回路DPが、システムSYS内に形成されてもよい。
例えば、入出力部I/Oは、ディスプレイ、スピーカー、入力キーおよび撮像装置等である。ディスプレイは、データ処理回路DPによりデコードされる画像データを表示する。スピーカーは、データ処理回路DPによりデコードされる音声データを出力する。入力キーは、データ処理回路DPによりエンコードされる文字列を入力するために使用される。撮像装置は、データ処理回路DPによりエンコードされる画像データを撮像する。上述した実施形態のプロセッサPROCをシステムSYSに搭載することで、プロセッサPROCの演算処理の性能を向上させることができ、受信データや送信データの処理効率を向上させることができる。この結果、システムSYSの性能を向上させることができる。
図24は、図2、図11または図14に示したフェッチ部FTCの動作の例を示している。フェッチ部FTCは、演算部EXから終了信号ENDを受け取らない間(ステップS1:No)、命令メモリIMEMから、プログラムカウンタが示すアドレスに対応する命令をフェッチする(ステップS4)。プロセッサPROCがプリフェッチ部を有する場合には、フェッチ部FTCは、プリフェッチ部のFIFOから古い順にプリフェッチされた命令をフェッチする。次いで、フェッチ部FTCは、プログラムカウンタの値をインクリメントする(ステップS5)。そして、ステップS1へ戻る。
一方、フェッチ部FTCは、終了信号ENDを受け取ると(ステップS1:Yes)、命令メモリIMEMから、アドレスレジスタAREGに格納されているアドレスに対応する命令をフェッチする(ステップS2)。プロセッサPROCがプリフェッチ部を有する場合には、フェッチ部FTCは、プリフェッチ部のFIFOを空にする。そして、フェッチ部FTCは、プログラムカウンタに、現在のプログラムカウンタの値に4を加算した値を設定する(ステップS3)。そして、ステップS1へ戻る。フェッチ部FTCは、上述したステップS1〜ステップS5を繰り返す。
図25は、図17に示したフェッチ部FTCの動作の例を示している。フェッチ部FTCは、演算部EXから終了信号ENDを受け取らず(ステップS11:No)、かつデコード部DECから停止信号STOPを受け取っていない場合(ステップS12:No)、命令メモリIMEMから、アドレスレジスタAREGの値に4を加算した値のアドレスに対応する命令をフェッチする(ステップS13)。そして、ステップS11へ戻る。
フェッチ部FTCは、停止信号STOPを受け取っている場合、すなわち命令のフェッチ動作の停止が指示されている場合(ステップS12:Yes)、命令をフェッチせずにステップS11へ戻る。
一方、フェッチ部FTCは、終了信号ENDを受け取った場合(ステップS11:Yes)、アドレスレジスタAREGに格納されているアドレスに対応する命令をフェッチすることが指示されていなければ(ステップS14:No)、ステップS12へ進む。そして、フェッチ部FTCは、停止信号STOPを受け取っていれば(ステップS12:Yes)、ステップS11へ戻る。フェッチ部FTCは、停止信号STOPを受け取っていなければ(ステップS12:No)、命令メモリIMEMから、アドレスレジスタAREGの値に4を加算した値のアドレスに対応する命令をフェッチする(ステップS13)。そして、ステップS11へ戻る。
また、フェッチ部FTCは、アドレスレジスタAREGに格納されているアドレスに対応する命令をフェッチすることが指示されていれば(ステップS14:Yes)、命令メモリIMEMから、アドレスレジスタAREGに格納されているアドレスに対応する命令をフェッチする(ステップS15)。そして、ステップS11へ戻る。フェッチ部FTCは、上述したステップS11〜ステップS15を繰り返す。
図26は、図2、図11または図14に示したデコード部DECの動作の例を示している。デコード部DECは、NOP変更用のフラグを有している。NOP変更用のフラグが設定されている場合には、デコード部DECは、次に演算部EXへ渡す命令をNOP命令に変更する。NOP変更用のフラグが設定されていない場合には、デコード部DECは、次の命令をNOP命令に変更しない。
NOP変更用のフラグが設定されていない場合であり(ステップS21:No)、かつ演算部EXがサイクル可変命令でない命令を実行している場合(ステップS22:No、ステップS23:No)、デコード部DECは、フェッチ部FTCから渡された命令を解読する。そして、デコード部DECは、演算部EXへ演算に必要な情報を送信し(ステップS24)、ステップS21へ戻る。
演算部EXがサイクル可変命令を実行している場合(ステップS23:Yes)、デコード部DECは、アドレスレジスタAREGに、命令メモリIMEMの、当該サイクル可変命令の命令群の次の命令が格納されているアドレスを書き込む。また、デコード部DECは、アドレスレジスタAREGのロックを指示する(ステップS25)。次いで、デコード部DECは、フェッチ部FTCから渡された命令を解読し、演算部EXへ演算に必要な情報を送信し(ステップS24)、ステップS21へ戻る。
デコード部DECは、演算部EXからの終了信号ENDによって実行中の命令が終了したことを通知されると(ステップS22:Yes)、アドレスレジスタAREGのロックを解除する(ステップS26)。また、デコード部DECは、現在解読中の命令をNOP命令に変更し(ステップS27)、NOP変更用のフラグを設定する(ステップS28)。そして、デコード部DECは、演算部EXへNOP命令を送信し(ステップS24)、ステップS21へ戻る。
また、デコード部DECは、NOP変更用のフラグが設定されている場合には(ステップS21:Yes)、現在解読中の命令をNOP命令に変更し(ステップS29)、NOP変更用のフラグをクリアする(ステップS30)。そして、デコード部DECは、演算部EXへNOP命令を送信し(ステップS24)、ステップS21へ戻る。デコード部DECは、上述したステップS21〜ステップS30を繰り返す。
図27は、図17に示したデコード部DECの動作の例を示している。デコード部DECは、アドレスレジスタからのフェッチ指示用のフラグを有している。アドレスレジスタからのフェッチ指示用のフラグが設定されている場合には、フェッチ部FTCは、アドレスレジスタAREGからアドレスを取得し、取得したアドレスに基づいて命令をフェッチする。アドレスレジスタからのフェッチ指示用のフラグが設定されていない場合には、デコード部DECは、プログラムカウンタに基づいて命令をフェッチする。
演算部EXがサイクル可変命令でない命令を実行している場合であり(ステップS41:No、ステップS42:No)、かつ命令が圧縮されていない場合(ステップS43:No)、デコード部DECは、フェッチ部FTCから渡された命令を解読する。そして、デコード部DECは、演算部EXへ演算に必要な情報を送信し(ステップS49)、ステップS41へ戻る。
命令が圧縮されている場合(ステップS43:Yes)、デコード部DECは、圧縮されている命令を解凍し、停止信号STOPによりフェッチ部FTCへ命令のフェッチ動作の停止を指示する(ステップS44)。そして、デコード部DECは、解凍した命令の数をレジスタなどの記憶部に保持し(ステップS45)、解凍した命令の数から1を減算して残りの命令数を求める(ステップS46)。デコード部DECは、残りの命令数が0にならない間(ステップS47:No)、解凍した命令を解読し、演算部EXへ演算に必要な情報を送信し(ステップS49)、ステップS41へ戻る。
解凍した全ての命令の解読が終了し、残りの命令数が0になると(ステップS47:Yes)、デコード部DECは、フェッチ部FTCに対する命令のフェッチ動作の停止を解除する(ステップS48)。そして、デコード部DECは、命令を解読し、演算部EXへ演算に必要な情報を送信し(ステップS49)、ステップS41へ戻る。
また、演算部EXがサイクル可変命令を実行している場合(ステップS42:Yes)、デコード部DECは、アドレスレジスタAREGに、命令メモリIMEMの、当該サイクル可変命令の命令群の次の命令が格納されているアドレスを書き込む(ステップS50)。そして、停止信号STOPによりフェッチ部FTCへ命令のフェッチ動作の停止を指示していない場合には(ステップS51:No)、デコード部DECは、ステップS43〜ステップS49を行い、ステップS41へ戻る。
フェッチ部FTCへ命令のフェッチ動作の停止を指示している場合であり(ステップS51:Yes)、かつアドレスレジスタAREGに格納されているアドレスに対応する命令をフェッチすることを指示していなければ(ステップS52:No)、デコード部DECは、アドレスレジスタからのフェッチ指示用のフラグを設定する(ステップS53)。そして、ステップS41へ戻る。
アドレスレジスタAREGに格納されているアドレスに対応する命令をフェッチすることを指示している場合には(ステップS52:Yes)、そのままステップS41へ戻る。一方、デコード部DECは、演算部EXから終了信号ENDにより実行中の命令が終了したことを指示されると(ステップS41:Yes)、現在解読中の命令をNOP命令に変更する。また、デコード部DECは、停止信号STOPによりフェッチ部FTCへ命令のフェッチ動作の停止を指示する(ステップS54)。そして、ステップS41へ戻る。デコード部DECは、上述したステップS41〜ステップS54を繰り返す。
図28は、図2、図11、図14または図17に示したアドレスレジスタAREGの書き込み動作の例を示している。アドレスレジスタAREGのロックが解除されている状態において(ステップS61:Yes)、デコード部DECがサイクル可変命令を解読すると(ステップS62:Yes)、アドレスレジスタAREGは、命令メモリIMEMの、当該サイクル可変命令の命令群の次の命令が格納されているアドレスを保持する。また、アドレスレジスタAREGは、ロック状態となる(ステップS63)。そして、ステップS61へ戻る。
デコード部DECがサイクル可変命令でない命令を解読すると(ステップS62:No)、ステップS61へ戻る。一方、アドレスレジスタAREGのロックが解除されていない状態、すなわちロック状態のときに(ステップS61:No)、デコード部DECによりロック状態の解除が指示されると(ステップS64:Yes)、アドレスレジスタAREGはロック状態を解除する(ステップS65)。そして、ステップS61へ戻る。
デコード部DECからロック状態の解除の指示がない場合には(ステップS64:No)、そのままステップS61へ戻る。アドレスレジスタAREGは、上述したステップS61〜ステップS65を繰り返す。
図29は、図2、図11、図14または図17に示した演算部EXの動作の例を示している。演算部EXは、デコード部DECから渡された命令に基づいて演算を実行する(ステップS71)。演算部EXは、実行中の命令がサイクル可変命令であり、かつ当該サイクル可変命令が終了した場合(ステップS72:Yes)、終了信号ENDを出力してフェッチ部FTCおよびデコード部DECへサイクル可変命令の終了を通知する(ステップS73)。そして、ステップS71へ戻る。
実行中の命令がサイクル可変命令でないか、またはサイクル可変命令であるが終了していない場合(ステップS72:No)、そのままステップS71へ戻る。演算部EXは、上述したステップS71〜ステップS73を繰り返す。
図30は、別の実施形態におけるプロセッサPROCの例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。例えば、プロセッサPROCは、VLIW型のDSPやCPUであり、ベクトルプロセッサとして動作する。プロセッサPROCは、命令メモリIMEMおよびデータメモリDMEM0−DMEM3に接続されている。
例えば、プロセッサPROCは、図2と同様に、バスBUSを介して周辺回路PERIに接続され、命令メモリIMEM、データメモリDMEM0−3および周辺回路PERIとともに単一のLSIチップとして設計される。図2と同様に、バスBUSは、外部端子ETMを介して、LSIチップの外部に配置される外部入出力装置に接続されてもよい。プロセッサPROC、命令メモリIMEM、データメモリDMEM0−3、周辺回路PERIおよび外部入出力装置により、システムが形成される。
プロセッサPROCは、レジスタ部REG、フェッチ部FTC、デコード部DEC、4つのパイプラインPL(PL1−PL4)、およびメモリ制御部MCNTを有している。また、プロセッサPROCは、ループを制御するループ用レジスタとして、アドレスレジスタAREG、ループ開始アドレスレジスタLSREG、ループフラグレジスタLFREG、ブレイク判断アドレスレジスタBREGおよびループカウンタCNTを有している。フェッチ部FTCおよびデコード部DECは、パイプラインPL1−4に共通のブロックである。レジスタ部REG、パイプラインPL1−4、アドレスレジスタAREGおよびメモリ制御部MCNTは、図11と同じ機能を有している。
アドレスレジスタAREGは、フェッチ部FTCおよびデコード部DECに接続されている。説明の便宜上、ここでは、アドレスレジスタAREGに保持されているアドレスをループ終了アドレスと称する。つまり、ループ終了アドレスは、ループ処理される命令群の次の命令、すなわちループ処理から抜けた後、最初に実行される命令が格納されている命令メモリIMEMのアドレスである。
ループ開始アドレスレジスタLSREGは、フェッチ部FTCおよびデコード部DECに接続されている。ループ開始アドレスレジスタLSREGは、後述するブレイク付きループ命令(dob命令とする、dob:do break)を実行する際のループ開始アドレスを保持している。ループ開始アドレスは、dob命令によってループ処理される命令群の先頭の命令が格納されている命令メモリIMEMのアドレスである。
ループフラグレジスタLFREGは、フェッチ部FTC、デコード部DECおよび各パイプラインPL1−4の演算部EXに接続されている。ループフラグレジスタLFREGには、dob命令を実行する際に、ループ処理中であることを示すフラグが設定される。ループフラグレジスタLFREGにフラグが設定されていればループ処理中であり、設定されていなければループ処理中でない。
ブレイク判断アドレスレジスタBREGは、フェッチ部FTC、デコード部DECおよび各パイプラインPL1−4の演算部EXに接続されている。ブレイク判断アドレスレジスタBREGは、dob命令を実行する際のブレイク判断アドレスを保持している。ブレイク判断アドレスは、ループ処理中に演算部EXがブレイクを発生させるか否かを判断する際の判断基準として演算部EXによって用いられるアドレスである。
ループカウンタCNTは、フェッチ部FTCおよびデコード部DECに接続されている。ループカウンタCNTは、dob命令を実行する際に、ループ処理の繰り返し回数、すなわちループ回数をカウントする。特に限定しないが、ここでは、ループ処理の開始時にループカウンタCNTに最大のループ回数が設定され、ループ処理が1回実行されるごとにループカウンタCNTの値がデクリメントされていくとする。
フェッチ部FTCは、命令メモリIMEMから命令INSを4つずつ取得し、取得した命令INSを4つずつデコード部DECに出力することを除き、図2に示したフェッチ部FTCと同じ機能を有している。例えば、1つの命令INSは、32ビットで記述される。また、フェッチ部FTCは、dob命令の実行中にアドレスレジスタAREG、ループ開始アドレスレジスタLSREG、ループフラグレジスタLFREG、ブレイク判断アドレスレジスタBREGおよびループカウンタCNTを参照し、更新しまたはクリアにする。
デコード部DECは、フェッチ部FTCから転送される4つの命令INSを同時に解析し、解析結果に応じて、命令INSを実行するために必要なレジスタにアクセスし、各パイプラインPL1−4の演算部EXに実行させる動作を指定することを除き、図2に示したデコード部DECと同じ機能を有している。また、デコード部DECは、dob命令を解読し、アドレスレジスタAREG、ループ開始アドレスレジスタLSREG、ループフラグレジスタLFREG、ブレイク判断アドレスレジスタBREGおよびループカウンタCNTを設定する。デコード部DECは、dob命令の実行中にループフラグレジスタLFREGを参照する。
なお、図14に示したプロセッサPROCと同様に、デコード部DECは、命令INSのオペランド同士の競合を判断する機能、および、競合が発生しないようにパイプラインPL1−4に命令INSを割り当てる機能を持たなくてもよい。
パイプラインPL1−4の構成は、図11に示したパイプラインPL1−4と同じである。パイプラインPL1−4と、フェッチ部FTC、デコード部DEC、レジスタ部REGおよびメモリ制御部MCNTとの接続関係は、図11と同じである。
演算部EXは、dob命令の実行中にループフラグレジスタLFREGおよびブレイク判断アドレスレジスタBREGを参照する。演算部EXは、ループフラグレジスタLFREGにフラグが設定されており、かつブレイク判断アドレスレジスタBREGに格納されているアドレスに現在の命令のアドレスが一致すると、ブレイクを発生させるか否かを判断する。演算部EXは、ブレイクを発生させるか否かの判断にあたり、ブレイクを発生させる条件が満たされると、ブレイクを発生させる。
図31は、ブレイク付きループ命令のコンパイルの例を示している。ここでは、2つのデータを100回取得して累積加算した結果を出力するプログラムを例にして説明する。2つのデータはいずれも符号付きであり、累積加算の途中で総和が負になった場合には、ただちに演算を終了するプログラムであるとする。
ブレイク付きループ命令(dob命令)は、ブロックリピート命令を基本とし、引数として、ループ回数、dob命令のアドレスに対する相対的なループ終了アドレス、およびdob命令のアドレスに対する相対的なブレイク判断アドレスを有する。図31に示した、プロセッサにより実行可能な命令の例では、演算部EXは、11行目の命令[add r0,r0,r1]によってブレイクを発生させるか否かを判断する。
ブレイクを発生させる条件が満たされた場合、ここでの例では累積加算結果が負になった場合に、演算部EXはブレイクを発生させる。それによって、プロセッサPROCの処理は、dob命令によるループ処理から抜け、dob命令の次の命令に移る。
上述したように、dob命令においてループ処理の開始から、ループ処理から抜けるまでのサイクル数は、ブレイクを発生させる条件がいつ満たされるかによって動的に変化する。従って、dob命令をサイクル可変命令の一つと見なすことができる。
dob命令では、ループ処理の最後尾から先頭へ戻る際にオーバーヘッドが発生しない。また、dob命令では、ブレイク判断アドレスによってブレイクの発生箇所が指定されていることによって、ループ処理内に分岐命令を設けずに済む。従って、ループ処理の回数にかかわらず、ループ処理から抜けるときに1回、オーバーヘッド(NOP命令)が発生する。分岐命令には、分岐命令と同時に他の命令を並列に実行することができないという制約がある。dob命令は、この制約を受けない。従って、dob命令を用いることによって、プロセッサPROCは、効率的に並列処理を実行することができる。
図32は、ブレイク付きループ命令を用いずにループ処理から抜ける命令のコンパイルの例を示している。上述したdob命令と同様、2つの符号付きデータを100回取得して累積加算する途中で総和が負になった場合に演算を終了するプログラムであるとする。
図32に示した、プロセッサにより実行可能な命令の例では、演算部EXは、12行目の命令[branch z label_loop1_end]によってループ処理から抜けるか否かを判断する。ループ処理から抜ける条件が満たされた場合、ここでの例では累積加算結果が負になった場合に、プロセッサPROCの処理は、ループ処理から抜ける。ループ処理から抜けない場合、プロセッサPROCの処理は、15行目の命令[branch z label_loop1]によってループ処理の先頭に戻り、ループ処理を繰り返す。
図32に示したループ処理では、ループ処理中に分岐命令が2つ設けられているので、ループ処理を繰り返すごとに2回ずつオーバーヘッド(NOP命令)が発生する。従って、演算部EXは、ループ処理の繰り返し回数が増えるほど多くの不要な命令を実行することになるため、プロセッサPROCの演算処理の性能が低下してしまう。また、プロセッサPROCは、分岐命令と同時に他の命令を並列に実行することができないため、並列処理の効率が低下してしまう。
図33は、図30に示したプロセッサPROCの動作の例を示している。図8、図12、図15および図19と同じ動作については、詳細な説明は省略する。例えば、デコード部DECからパイプラインPL1−4への命令実行の指示、およびパイプラインPL1−4の動作は、図15と同じである。命令メモリIMEMの太枠は、dob命令によってループ処理される命令群であることを示している。演算部EXは、アドレス40に格納されている命令の実行結果に基づいてブレイクを発生させるか否かを判断するとする。
命令メモリIMEMにおいて、アドレス00にdob命令が配置されている。デコード部DECは、dob命令を解読することによってループ開始アドレス、ループ終了アドレス、ループ回数およびブレイク判断アドレスを取得する。デコード部DECは、ループ開始アドレスレジスタLSREG、アドレスレジスタAREG、ループカウンタCNTおよびブレイク判断アドレスレジスタBREGに、それぞれループ開始アドレス、ループ終了アドレス、ループ回数およびブレイク判断アドレスを設定する。
フェッチ部FTCは、ループフラグレジスタLFREGにフラグが設定されている間、フェッチした命令のアドレスを、アドレスレジスタAREGに格納されているループ終了アドレス60と比較する。フェッチした命令のアドレスが50である場合、ループ終了アドレス60との差が10、すなわちフェッチ1回分となる。従って、フェッチ部FTCは、現在フェッチした命令がループ処理の最後尾の命令であると判断する。
そして、フェッチ部FTCは、ループ開始アドレスレジスタLSREGからループ開始アドレスを取得し、ループ開始アドレスに基づいて命令メモリIMEMから命令をフェッチする。つまり、ループ処理の先頭に戻る。このとき、ループ処理の先頭に戻ることによるオーバーヘッドは発生しない。そして、フェッチ部FTCは、ループカウンタCNTの値を一つ減らす。
図33に示した例では、例えばパイプラインPL1において2回目のループ処理の途中(「検出」と記したアドレス40の箇所)でブレイクが発生している。ブレイクが発生すると、ブレイクを発生させた演算部EXは、終了信号ENDによりフェッチ部FTCおよびデコード部DECにブレイクが発生したことを通知する。フェッチ部FTCおよびデコード部DECは、演算部EXからのブレイク発生の通知を受けて現在の命令を破棄する。
そして、フェッチ部FTCは、アドレスレジスタAREGからループ終了アドレスを取得し、ループ終了アドレスに基づいて命令メモリIMEMから次の命令をフェッチする。つまり、ループ処理から抜ける。また、フェッチ部FTCは、アドレスレジスタAREG、ループ開始アドレスレジスタLSREG、ループフラグレジスタLFREG、ブレイク判断アドレスレジスタBREGおよびループカウンタCNTをクリアにする。
デコード部DECは、次の命令をNOP命令に変更する。そして、デコード部DECは、ループ終了アドレスに基づいてフェッチ部FTCがフェッチした命令から解読を再開し、解読した命令を演算部EXへ渡す。このように、dob命令によってループ処理を行うと、ループ処理から抜ける際に、2段分のNOP命令によるオーバーヘッドが1回発生する。
図34は、図30に示したプロセッサがアドレスレジスタAREG、ループ開始アドレスレジスタLSREG、ループフラグレジスタLFREGおよびブレイク判断アドレスレジスタBREGを持たないときの動作の例を示している。命令メモリIMEMの太枠は、ループ処理される命令群であることを示している。演算部EXは、アドレス30に格納されている命令の実行結果に基づいて、アドレス40の分岐命令でループ処理を抜けるか否かを判断し、アドレス60の分岐命令でループ処理の先頭に戻るとする。
図34に示した例では、例えばパイプラインPL1において1回目のループ処理の終わり(「分岐判定」と記したアドレス60の箇所)で、演算部EXは、フェッチ部FTCおよびデコード部DECへ、ループ処理の先頭に戻るように指示する。その後、フェッチ部FTCがループ処理の先頭のアドレスに基づいてフェッチした命令が演算部EXにくるまで、演算部EXは、二段分のNOP命令を実行する。
そして、例えばパイプラインPL1において2回目のループ処理の途中(「分岐判定」と記したアドレス40の箇所)で、演算部EXは、2回目のループ処理の途中(アドレス30の箇所)で実行した命令の結果がループ処理を抜ける条件を満たすと判断したとする。この場合、演算部EXは、フェッチ部FTCおよびデコード部DECへ分岐を指示する。フェッチ部FTCおよびデコード部DECは、演算部EXから分岐の指示を受け取ると、保持していた命令を破棄する。
そして、フェッチ部FTCは、ループ処理の次の命令をフェッチする。演算部EXは、ループ処理を抜けた後にフェッチ部FTCがフェッチした命令がデコード部DECで解読されて演算部EXにくるまで、二段分のNOP命令を実行する。従って、アドレスレジスタAREG、ループ開始アドレスレジスタLSREG、ループフラグレジスタLFREGおよびブレイク判断アドレスレジスタBREGを持たないプロセッサでループ処理を行うと、ループ処理の先頭に戻るときと、ループ処理から抜けるか否かを判断するときの計2回、それぞれ2段分のNOP命令によるオーバーヘッドが発生する。
図35は、図30に示したフェッチ部FTCの動作の例を示している。フェッチ部FTCは、ループフラグレジスタLFREGにフラグが設定されていない場合(ステップS81:No)、通常の動作、すなわち命令メモリIMEMから、プログラムカウンタが示すアドレスに対応する命令をフェッチする(ステップS82)。そして、ステップS81へ戻る。
ループフラグレジスタLFREGにフラグが設定されている場合において(ステップS81:Yes)、演算部EXからブレイクの発生が通知されなければ(ステップS83:No)、フェッチ部FTCは、フェッチした命令のアドレスがループ処理の最後尾の命令のアドレスであるか否かを判断する(ステップS84)。フェッチ部FTCがフェッチした命令のアドレスと、アドレスレジスタAREGに格納されているループ終了アドレスとの差がフェッチ1回分である場合、フェッチされた命令のアドレスは、ループ処理の最後尾の命令のアドレスである。
アドレスの差がフェッチ1回分でない場合には、フェッチされた命令のアドレスは、ループ処理の最後尾の命令のアドレスではない。ループ処理の最後尾の命令のアドレスでない場合(ステップS84:No)、フェッチ部FTCは、命令メモリIMEMから、次のアドレスに対応する命令をフェッチする(ステップS89)。そして、ステップS81へ戻る。
一方、ループ処理の最後尾の命令のアドレスである場合(ステップS84:Yes)、フェッチ部FTCは、ループ開始アドレスレジスタLSREGからループ開始アドレスを取得する。そして、フェッチ部FTCは、命令メモリIMEMから、ループ開始アドレスに対応する命令をフェッチする(ステップS85)。また、フェッチ部FTCは、ループ用レジスタのうちループカウンタCNTをデクリメントして更新する(ステップS86)。
ループカウンタCNTを更新した結果、ループカウンタCNTの値が0となり、ループ処理の最終回であった場合(ステップS87:Yes)、フェッチ部FTCは、ループフラグレジスタLFREGに設定されているフラグをクリアにする(ステップS88)。そして、ステップS81へ戻る。ループ処理の最終回でなかった場合には(ステップS87:No)、そのままステップS81へ戻る。
ブレイクの発生が通知されると(ステップS83:Yes)、フェッチ部FTCは、アドレスレジスタAREGからループ終了アドレスを取得する。そして、フェッチ部FTCは、命令メモリIMEMから、ループ終了アドレスに対応する命令をフェッチする(ステップS90)。また、フェッチ部FTCは、ループ用レジスタ、すなわちアドレスレジスタAREG、ループ開始アドレスレジスタLSREG、ループフラグレジスタLFREG、ブレイク判断アドレスレジスタBREGおよびループカウンタCNTをクリアにする(ステップS91)。そして、ステップS81へ戻る。フェッチ部FTCは、上述したステップS81〜ステップS91を繰り返す。
図36は、図30に示したデコード部DECの動作の例を示している。デコード部DECは、解読した命令がdob命令でない場合において(ステップS101:No)、ループフラグレジスタLFREGにフラグが設定されていない場合(ステップS102:No)、通常の動作、すなわち解読した命令を演算部EXへ渡す(ステップS103)。そして、ステップS101へ戻る。
デコード部DECは、dob命令を解読した場合(ステップS101:Yes)、ループ用レジスタの対応するレジスタまたはカウンタにループ回数、フラグ、ループ開始アドレス、ループ終了アドレスおよびブレイク判断アドレスを設定する(ステップS104)。ループフラグレジスタLFREGにフラグが設定されているときに(ステップS102:Yes)、演算部EXからブレイクの発生が通知されなければ(ステップS105:No)、デコード部DECは、通常の動作を行い、解読した命令を演算部EXへ渡す(ステップS103)。そして、ステップS101へ戻る。
ループフラグレジスタLFREGにフラグが設定されているときに(ステップS102:Yes)、ブレイクの発生が通知されると(ステップS105:Yes)、デコード部DECは、現在の命令をNOP命令に変更する(ステップS106)。そして、ステップS101へ戻る。デコード部DECは、上述したステップS101〜ステップS106を繰り返す。
図37は、図30に示した演算部EXの動作の例を示している。演算部EXは、デコード部DECから渡された命令に基づいて演算を実行する(ステップS111)。そして、ループフラグレジスタLFREGにフラグが設定されていない場合(ステップS112:No)、ステップS111へ戻る。
ループフラグレジスタLFREGにフラグが設定されている場合(ステップS112:Yes)、演算部EXは、現在の命令のアドレスが、ブレイク判断アドレスレジスタBREGに格納されているブレイク判断アドレスに一致するか否かを判断する。また、演算部EXは、ブレイク発生の条件を満たしているか否かを判断する(ステップS113)。
現在の命令のアドレスがブレイク判断アドレスに一致しないか、またはブレイク発生の条件を満たしていない場合(ステップS113:No)、ステップS111へ戻る。現在の命令のアドレスがブレイク判断アドレスに一致しており、かつブレイク発生の条件を満たしている場合(ステップS113:Yes)、演算部EXは、終了信号ENDによりフェッチ部FTCおよびデコード部DECへブレイクの発生を通知する(ステップS114)。そして、ステップS111へ戻る。フェッチ部FTCは、上述したステップS111〜ステップS114を繰り返す。
以上、この実施形態では、プロセッサPROCが例えばループ命令などの制御命令を実行する際に、NOP命令の実行回数を減らすことができる。これにより、不要な命令が実行されないため、命令の実行効率を向上させることができる。この結果、プロセッサPROCの演算処理の性能を向上させることができる。
ところで、メモリへのアクセスに時間がかかることによって命令の実行サイクル数が動的に変化することがある。この対策として、命令の発行を停止するストールという手段を用いることができる。しかし、ストールによって命令の発行を停止する場合には、命令全体の発行が停止されてしまうため、命令の実行効率が低下してしまう。上述した各実施の形態によれば、サイクル可変命令の実行時に他の命令を発行して並列に処理することができる。従って、命令の実行効率が向上する。また、命令をより効率的に配置することができる。
なお、上述した実施の形態では、サイクル可変命令の一例として、例えばインダイレクトロード命令、インダイレクトストア命令、ストライドロード命令、ストライドストア命令、検索命令およびブレイク付きループ命令を挙げたが、サイクル可変命令はこれらの命令に限らない。例えば、符号なし飽和付総和命令、除算命令、符号なしで、配列の先頭から掛け算を行う命令、最大値検出命令または最小値検出命令、あるいはこれらの命令と同様の命令を実行する場合にも、上述した実施例と同様の効果が得られる。
符号なし飽和付総和命令は、飽和した時点で終了となる。除算命令は、割られる数から割る数を引き、割る数の方が大きくなった時点で終了し、配列(ベクトル)の何番目かを指すINDEXを返す。符号なしで、配列の先頭から掛け算を行う命令は、飽和した時点で終了する。最大値検出命令は、最大値が飽和して検出された時点で終了し、INDEXを返す。最小値検出命令は、最小値が飽和して検出された時点で終了し、INDEXを返す。また、符号なしで、ある特定の値に対し、配列の先頭から引き算を行い、特定の値(例えば0)以下になったら終了してINDEXを返す、というような除算命令を拡張した命令を実行する場合にも、上述した実施例と同様の効果が得られる。
上述した図2、図11、図14、図17または図30に示したプロセッサを用いた装置の一例として、例えばソフトウェア無線に対応した携帯端末が挙げられる。携帯端末の一例として、例えば無線通信機能を備えた携帯電話機またはスマートフォンが挙げられる。
図38は、上述したプロセッサが搭載される携帯端末の例を示している。携帯端末1は、タッチパネルを備えた表示パネル2および操作ボタン3、スピーカ4、および図には現れていないマイクを備えている。携帯端末1は、例えば無線通信を行う機能を備えていてもよい。
図39は、図38に示した携帯端末1のベースバンド処理部のハードウェア構成を示している。携帯端末1のベースバンド処理部11は、RF部12、専用回路部13、複数のデータ処理モジュール14を備えている。RF部12、専用回路部13およびデータ処理モジュール14は、バス15に接続されている。
RF部12は、高周波信号の処理を行う。専用回路部13は、例えばターボ符号などの符号化処理やビタビ復号などの復号処理、またはMIMO(Multiple Input Multiple Output)通信を行う際の信号の分割処理や合成処理を行う。専用回路部13は、パラメータによって設定を変更することができるハードウェアであってもよい。
データ処理モジュール14は、例えば送信信号の変調処理や受信信号の復調処理などのベースバンド信号の処理を行う。データ処理モジュール14は、例えばプロセッサ、プログラムメモリ、データメモリおよび周辺回路を有していてもよい。データ処理モジュール14のプロセッサ、プログラムメモリ、データメモリおよび周辺回路は、単一のLSIチップとして設計されてもよい。
また、単一のLSIチップに複数のデータ処理モジュール14が実装されるように設計されてもよい。さらに、複数のデータ処理モジュール14と専用回路部13とが同一のLSIチップに実装されるように設計されてもよい。
データ処理モジュール14において、プロセッサは、図2、図11、図14、図17または図30に示したプロセッサPROCであってもよい。プログラムメモリは、図2、図11、図14、図17または図30に示した命令メモリIMEMであってもよい。データメモリは、図2、図11、図14、図17または図30に示したデータメモリDMEM0−3であってもよい。周辺回路は、図2に示した周辺回路PERIであってもよい。
図40は、図38に示した携帯端末の動作の例を示している。一例として、例えば携帯端末1は、W−CDMA(Wideband Code Division Multiple Access)方式およびLTE(Long Term Evolution)方式に対応しているとする。例えば携帯端末1が、W−CDMAの基地局21との間で無線通信が可能な領域22から、LTEの基地局23との間で無線通信が可能な領域24へ移動したとする。
この移動によって、W−CDMA方式の電波が弱くなり、LTE方式の電波が強くなった場合、携帯端末1は、電波の強弱を検知して無線通信用のファームウェアをW−CDMA方式からLTE方式に切り替えて、LTEの基地局23との間で無線通信を行う。携帯端末1が、LTEの基地局23との間で無線通信が可能な領域24から、W−CDMAの基地局21との間で無線通信が可能な領域22へ移動した場合は、無線通信用のファームウェアは、LTE方式からW−CDMA方式に切り替えられる。
なお、無線通信方式は、W−CDMA方式やLTE方式に限らない。例えば、CDMA2000方式やWiMAX(World Interoperability for Microwave Access)方式やWi−Fi(Wireless Fidelity)方式などの無線通信方式であってもよい。
図41は、図38に示した携帯端末の無線方式の切り替え動作の例を示している。携帯端末1は、対応している通信方式を変えながら基地局を検索する(ステップS121)。例えば携帯端末1は、W−CDMA方式によって基地局を検索し、LTE方式によって基地局を検索する。そして、携帯端末1は、検索した基地局の中から、最も感度のよい基地局、すなわち最も電波の強い基地局を検索する(ステップS122)。
最も感度のよい基地局が、携帯端末1の現在の通信相手に設定されている基地局と異なる場合(ステップS123:Yes)、携帯端末1は、最も感度のよい基地局の通信方式が、現在、携帯端末1に設定されている通信方式と異なるか否かを判断する(ステップS124)。通信方式が異なる場合(ステップS124:Yes)、携帯端末1は、通信方式を、最も感度のよい基地局の通信方式に変更する(ステップS125)。そしてステップS121へ戻る。
最も感度のよい基地局の通信方式が、現在、携帯端末1に設定されている通信方式と同じである場合(ステップS124:No)、携帯端末1は、通信方式を変更せずに、通常の通信動作を行う(ステップS126)。通常の通信動作では、携帯端末1は、通信相手を、現在、携帯端末1に設定されている通信方式と同じ通信方式の最も感度のよい基地局に変更する(ステップS126)。そしてステップS121へ戻る。
一方、最も感度のよい基地局が、携帯端末1の現在の通信相手に設定されている基地局と同じである場合(ステップS123:No)、携帯端末1は、通常の通信動作を行う(ステップS126)。通常の通信動作では、携帯端末1は、通信相手を、現在、携帯端末1の通信相手に設定されている基地局とする(ステップS126)。そしてステップS121へ戻る。携帯端末1は、上述したステップS121〜ステップS126を繰り返す。
なお、ステップS124において、携帯端末1は、伝送レートを考慮して通信方式を変更するか否かを判断するようにしてもよい。例えば、通信方式を変更することによって伝送レートが上がるのであれば(ステップS124:Yes)、携帯端末1は、通信方式を変更し(ステップS125)、伝送レートが上がらないのであれば(ステップS124:No)、携帯端末1は、通信方式を変更しないで通常動作を行う(ステップS126)、というようにしてもよい。
以上の実施形態において説明した発明を整理して、付記として開示する。
(付記1)実行サイクル数が動的に変化する第1の命令を実行するために、最大の実行サイクル数に対応する数の複数の第1の命令である命令群が格納されている命令メモリから前記第1の命令をフェッチするフェッチ部と、
前記命令群の次の命令が格納されている前記命令メモリのアドレスが保持されるアドレスレジスタと、
前記フェッチ部によりフェッチされた命令を解読するデコード部と、
前記デコード部により解読された命令を受けて演算を実行し、前記第1の命令の実行に必要な演算の完了を判断したときに終了信号を出力する演算部と
を備え、
前記フェッチ部は、前記終了信号に応答して前記アドレスレジスタ内のアドレスを用いて前記次の命令を前記命令メモリからフェッチすること
を特徴とするプロセッサ。
(付記2)前記デコード部は、解読した命令が前記第1の命令のときに、前記次の命令が格納されているアドレスを求め、求めたアドレスを前記アドレスレジスタに書き込むために出力し、
前記アドレスレジスタは、前記デコード部によりアドレスが書き込まれてから前記終了信号が出力されるまで、新たなアドレスの書き込みが禁止されること
を特徴とする付記1に記載のプロセッサ。
(付記3)前記デコード部は、解読した命令が前記命令群の先頭の第1の命令のときに、前記次の命令が格納されているアドレスを求め、求めたアドレスを前記アドレスレジスタに書き込むこと
を特徴とする付記1に記載のプロセッサ。
(付記4)前記命令メモリと前記フェッチ部との間に、前記命令メモリからの命令をプリフェッチするプリフェッチ部を備え、
前記フェッチ部は、前記プリフェッチ部を介して前記命令メモリに保持されている命令をフェッチし、前記終了信号が出力されたときに前記プリフェッチ部を介することなく前記命令メモリに直接アクセスし、前記次の命令を前記命令メモリからフェッチすること
を特徴とする付記1ないし付記3のいずれか1項に記載のプロセッサ。
(付記5)前記デコード部は、前記終了信号が出力された後、前記フェッチ部から前記次の命令を受けるまで、演算の実行を停止する命令を前記演算部に出力すること
を特徴とする付記1ないし付記4のいずれか1項に記載のプロセッサ。
(付記6)前記演算部と、前記演算部による演算の結果をメモリまたはレジスタに書き込む書き込み部とを各々有し、並列に動作する複数のパイプラインを備え、
前記第1の命令の演算は、前記パイプラインのいずれかの前記演算部で実行されること
を特徴とする付記1ないし付記5のいずれか1項に記載のプロセッサ。
(付記7)前記次の命令を保持する命令レジスタを備え、
前記フェッチ部は、前記命令メモリからコード長が圧縮された命令をフェッチし、
前記デコード部は、前記フェッチ部から受ける圧縮された命令を解凍し、解凍した命令を解読して前記パイプラインに出力し、前記パイプラインに出力しきれない解読した命令が残っているとき、前記フェッチ部に停止信号を出力し、前記終了信号を受けたときに前記命令レジスタ内の前記次の命令を解読し、
前記フェッチ部は、前記停止信号を受けているときに、前記アドレスレジスタ内のアドレスを用いて前記命令メモリにアクセスし、前記次の命令を前記命令メモリからフェッチし、フェッチした前記次の命令を前記命令レジスタに格納し、前記終了信号に応答して前記次の命令をフェッチする代わりに、前記アドレスレジスタ内のアドレスの1つ先のアドレスを用いて命令をフェッチすること
を特徴とする付記6に記載のプロセッサ。
(付記8)付記1ないし付記7のいずれか1項に記載のプロセッサと、
前記プロセッサが演算するデータを生成するデータ生成部と、
前記プロセッサにより演算されたデータを用いてデータ処理を実行するデータ処理部と
を備えていることを特徴とするシステム。
(付記9)実行サイクル数が動的に変化する第1の命令を実行するために、最大の実行サイクル数に対応する数の複数の第1の命令である命令群が格納されている命令メモリから前記第1の命令をフェッチし、
フェッチされた命令を解読し、
解読された命令を受けて演算を実行し、前記第1の命令の実行に必要な演算の完了を判断したときに終了信号を出力し、
前記終了信号に応答して、前記命令群の次の命令が格納されている前記命令メモリのアドレスをアドレスレジスタから読み出し、読み出したアドレスを用いて前記次の命令を前記命令メモリからフェッチすること
を特徴とするプロセッサの動作方法。
(付記10)解読した命令が前記第1の命令のときに、前記次の命令が格納されているアドレスを求め、求めたアドレスを前記アドレスレジスタに書き込むために出力し、
アドレスが書き込まれてから前記終了信号が出力されるまで、前記アドレスレジスタへの新たなアドレスの書き込みを禁止すること
を特徴とする付記9に記載のプロセッサの動作方法。
(付記11)解読した命令が前記命令群の先頭の第1の命令のときに、前記次の命令が格納されているアドレスを求め、求めたアドレスを前記アドレスレジスタに書き込むこと
を特徴とする付記9に記載のプロセッサの動作方法。
(付記12)前記命令メモリからの命令をプリフェッチするプリフェッチ部を介して命令をフェッチし、
前記終了信号が出力されたときに、前記プリフェッチ部を介することなく前記命令メモリに直接アクセスし、前記次の命令を前記命令メモリからフェッチすること
を特徴とする付記9ないし付記11のいずれか1項に記載のプロセッサの動作方法。
(付記13)前記終了信号を出力した後、前記次の命令を解読するまで、演算の実行を停止すること
を特徴とする付記9ないし付記12のいずれか1項に記載のプロセッサの動作方法。
(付記14)解読された命令の演算の実行と、演算の実行結果のメモリまたはレジスタへの書き込みとを、複数のパイプラインを用いて並列に処理し、
前記第1の命令の演算は、前記パイプラインのいずれかにより実行されること
を特徴とする付記9ないし付記13のいずれか1項に記載のプロセッサの動作方法。
(付記15)前記命令メモリからコード長が圧縮された命令をフェッチし、
フェッチした命令を解凍し、
解凍した命令を解読して前記パイプラインに出力し、
前記パイプラインに出力しきれない解読した命令が残っているとき、前記次の命令を前記命令メモリからフェッチし、フェッチした前記次の命令を命令レジスタに格納し、
前記終了信号を受けたときに、前記次の命令をフェッチする代わりに、前記アドレスレジスタ内のアドレスの1つ先のアドレスを用いて命令をフェッチし、
前記命令レジスタ内の前記次の命令を解読すること
を特徴とする付記13に記載のプロセッサの動作方法。
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずであり、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。