(57)【要約】【課題】プログラムサイズを削減する。【解決手段】プロセッサは、複数のレジスタと、メモリから命令を読み出す命令読出回路と、命令読出回路によって読み出された命令が、複数のレジスタに格納されているデータの退避を指示する命令である場合、レジスタごとにデータを所定の記憶領域に退避する命令を生成する命令生成回路と、メモリから読み出された命令、および、命令生成回路によって生成された命令を実行する命令実行回路と、を備える。【選択図】図１
2008299501.tif 000002
【特許請求の範囲】
【請求項１】
複数のレジスタと、
メモリから命令を読み出す命令読出回路と、
前記命令読出回路によって読み出された前記命令が、前記複数のレジスタに格納されているデータの退避を指示する命令である場合、前記レジスタごとに前記データを所定の記憶領域に退避する命令を生成する命令生成回路と、
前記メモリから読み出された前記命令、および、前記命令生成回路によって生成された前記命令を実行する命令実行回路と、
を備えることを特徴とするプロセッサ。
【請求項２】
請求項１に記載のプロセッサであって、
前記命令生成回路は、
前記命令読出回路によって読み出された前記命令が、前記所定の記憶領域に退避された前記データの前記複数のレジスタへの復元を指示する命令である場合、前記レジスタごとに前記データを前記所定の記憶領域から復元する命令を生成すること、
を特徴とするプロセッサ。
【請求項３】
請求項１又は２に記載のプロセッサであって、
前記命令読出回路から読み出された前記命令が、前記命令生成回路に前記レジスタごとの前記命令の生成を指示する命令である場合には、前記命令生成回路に前記レジスタごとの前記命令の生成を指示するとともに、前記命令読出回路に前記メモリからの前記命令の読み出しの停止を指示する制御回路を、
更に備えることを特徴とするプロセッサ。
【請求項４】
請求項１〜３の何れか一項に記載のプロセッサであって、
前記複数のレジスタのうちの一部を指定するための指定データを記憶する記憶回路を更に備え、
前記命令生成回路は、
前記複数のレジスタのうち、前記記憶回路に格納された前記指定データで指定されるレジスタごとに前記命令を生成すること、
を特徴とするプロセッサ。
【請求項５】
請求項４に記載のプロセッサであって、
前記命令実行回路は、
前記メモリから読み出された前記命令が、前記指定データを前記記憶回路に格納する命令である場合、前記指定データを前記記憶回路に格納すること、
を特徴とするプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサに関する。
【背景技術】
【０００２】
プロセッサでは、割り込みが発生した時や、消費電力を抑えるためにスリープモードに移行する時等に、全てのレジスタもしくは実行中の処理で使用されている一部のレジスタに格納されているデータをスタックに退避することが行われる。このように複数のレジスタに格納されているデータをスタックに退避する場合、対象となるレジスタの数に応じたスタック命令がプログラムメモリから読み出され、スタック処理が実行される（例えば、特許文献１）。
【特許文献１】特開２００３−３４５４５６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
このように、複数のレジスタのデータを退避するスタック命令がプログラムに記述されているため、レジスタの数に応じてプログラムサイズが増大することとなる。  
本発明は上記課題を鑑みてなされたものであり、プログラムサイズを削減可能なプロセッサを提供することを目的とする。
【課題を解決するための手段】
【０００４】
上記目的を達成するため、本発明のプロセッサは、複数のレジスタと、メモリから命令を読み出す命令読出回路と、前記命令読出回路によって読み出された前記命令が、前記複数のレジスタに格納されているデータの退避を指示する命令である場合、前記レジスタごとに前記データを所定の記憶領域に退避する命令を生成する命令生成回路と、前記メモリから読み出された前記命令、および、前記命令生成回路によって生成された前記命令を実行する命令実行回路と、を備える。
【発明の効果】
【０００５】
プログラムサイズを削減可能なプロセッサを提供することができる。
【発明を実施するための最良の形態】
【０００６】
図１は、本発明の一実施形態であるプロセッサの構成を示す図である。プロセッサ１０は、プログラムカウンタ１１、マルチスタック用レジスタ１２、データレジスタ１３、アドレスレジスタ１４、プログラムアドレス生成回路１５、プログラムメモリインタフェース１６、マルチスタックモジュール１７、セレクタ１８、命令レジスタ１９、命令デコード回路２０、制御回路２１、アドレス演算回路２２、及びデータメモリインタフェース２３を含んで構成されている。
【０００７】
プログラムカウンタ１１には、プログラムメモリから読み出す命令を指定するプログラムカウント値が格納される。マルチスタック用レジスタ１２（記憶回路）には、複数のレジスタに格納されたデータをスタックする処理（マルチスタック処理）が行われる際の、スタック対象となる複数のレジスタを指定するデータ（指定データ）が格納される。データレジスタ１３には、各種データが格納され、アドレスレジスタ１４には、各種アドレスが格納される。
【０００８】
プログラムアドレス生成回路１５は、制御回路２１の制御に基づいて、プログラムカウンタ１１に格納されたプログラムカウント値をカウントアップするとともに、プログラムカウント値に応じた、プログラムメモリ２５に対するアドレスを生成して出力する。なお、プログラムアドレス生成回路１５は、制御回路２１から出力される信号cnt_stpに応じてプログラムカウント値の更新を停止することができる。本実施形態では、プログラムカウント値の更新は、信号cnt_stpが“０”の場合に実行され、“１”の場合に停止されることとする。  
プログラムメモリインタフェース１６は、プログラムアドレス生成回路１５によって生成されたアドレスに格納された命令をプログラムメモリ２５から読み出す。
【０００９】
なお、プログラムアドレス生成回路１５及びプログラムメモリインタフェース１６によって構成される回路が、本発明の命令読出回路に相当する。
【００１０】
マルチスタックモジュール１７（命令生成回路）は、制御回路２１の制御に基づいて、マルチスタック用レジスタ１２に設定されたデータで指定される複数のレジスタに格納されたデータをスタックに退避する複数のＰＵＳＨ命令の生成や、退避されたデータを指定される複数のレジスタに復元する複数のＰＯＰ命令の生成を行う。
【００１１】
セレクタ１８は、制御回路２１から出力される選択信号inst_selに基づいて、プログラムメモリインタフェース１６から出力される命令、または、マルチスタックモジュール１７から出力される命令の何れか一方を選択して命令レジスタ１９に格納する。本実施形態では、セレクタ１８から出力される命令は、選択信号inst_selが“０”の場合はプログラムメモリインタフェース１６から出力される命令となり、“１”の場合にマルチスタックモジュール１７から出力される命令となることとする。
【００１２】
命令デコード回路２０は、命令レジスタ１９に格納された命令をデコードする。また、命令デコード回路２０は、デコードした命令が複数のＰＵＳＨ命令の生成を指示するＰＵＳＨＭ命令である場合、ＰＵＳＨＭ命令がデコードされたことを示す信号pushm_decを制御回路２１に出力する。同様に、命令デコード回路２０は、デコードした命令が複数のＰＯＰ命令の生成を指示するＰＯＰＭ命令である場合、ＰＯＰＭ命令がデコードされたことを示す信号popm_decを制御回路２１に出力する。さらに、命令デコード回路２０は、ＰＵＳＨＭ命令またはＰＯＰＭ命令において指定されたスタックポインタを示すデータstk_idをマルチスタックモジュール１７に出力する。
【００１３】
制御回路２１は、命令デコード回路２０から信号pushm_dec，popm_decを受信すると、マルチスタックモジュール１７にＰＵＳＨ命令またはＰＯＰ命令の生成を指示するとともに、プログラムアドレス生成回路１５にプログラムカウント値の更新を停止させるために信号cnt_stpを変化させる。さらに、制御回路２１は、マルチスタックモジュール１７でのＰＵＳＨ命令またはＰＯＰ命令の生成が行われている間、マルチスタックモジュール１７から出力される命令を選択するように選択信号inst_selを変化させる。  
アドレス演算回路２２は、命令デコード回路２０のデコード結果に基づいて、アクセス対象データのアドレス演算等を行う。
【００１４】
データメモリインタフェース２３は、アドレス演算回路２２で算出されたアドレスに基づいて、データメモリ２６に対するアクセスを行う。例えば、データメモリインタフェース２３は、データレジスタ１３に格納されたデータをデータメモリ２６に書き込んだり、データメモリ２６から読み出したデータをデータレジスタ１３に書き込んだりする。ＰＵＳＨ命令の場合、データレジスタ１３またはアドレスレジスタ１４のうち、指定されたレジスタに格納されたデータが、データメモリ２６中の指定された領域に退避される。また、ＰＯＰ命令の場合、データメモリ２６中の指定された領域に格納されたデータが、データレジスタ１３またはアドレスレジスタ１４のうち、指定されたレジスタに復元される。
【００１５】
なお、命令デコード回路２０、アドレス演算回路２２、及びデータメモリインタフェース２３により構成される回路が本発明の命令実行回路に相当する。
【００１６】
図２は、マルチスタックモジュール１７の構成例を示す図である。マルチスタックモジュール１７は、カウンタ回路３１、命令コード生成回路３２、及びレジスタＩＤ比較回路３３を含んで構成されている。マルチスタックモジュール１７には、ＰＵＳＨ命令の生成開始を指示する信号push_strt、ＰＵＳＨ命令の生成実行を指示するpush_exe、ＰＯＰ命令の生成開始を指示する信号pop_strt、ＰＯＰ命令の生成実行を指示するpop_exe、プロセッサ１０のクロックCLK、スタックポインタを示すデータstk_id、ＰＵＳＨ命令の対象となるレジスタの範囲の開始を示すデータpush_sid，終了を示すデータpush_eidが入力される。なお、ＰＯＰ命令の場合は、ＰＯＰ命令の対象となるレジスタの範囲の開始を示すデータpop_sid，終了を示すデータpop_eidが入力される。そして、マルチスタックモジュール１７からは、生成された命令コードinst_code及び命令の生成終了を示す信号gen_endが出力される。なお、本実施形態では、信号push_strt，push_exe，pop_strt，pop_exeは、“１”の場合にそれぞれの動作が指示されることとする。
【００１７】
カウンタ回路３１は、スタック対象のレジスタの範囲を示すデータpush_sid（pop_eid），push_eid（pop_sid）に基づいて、生成するＰＵＳＨ命令またはＰＯＰ命令の引数とするレジスタを識別するデータreg_idをクロックCLKに応じてカウントアップまたはカウントダウンして出力する。
【００１８】
命令コード生成回路３２は、カウンタ回路３１から出力されるデータreg_idと、命令デコード回路２０から出力されるデータstk_idとを用いて、データreg_idで指定されるレジスタに格納されたデータを、データstk_idで示されるスタックポインタのスタック領域（記憶領域）に退避するＰＵＳＨ命令、もしくは、データstk_idで示されるスタックポインタのスタック領域に格納されたデータを、データreg_idで指定されるレジスタに復元するＰＯＰ命令を、命令inst_codeとして出力する。
【００１９】
レジスタＩＤ比較回路３３は、カウンタ回路３１から出力されるデータreg_idと、スタック対象のレジスタの範囲を示すデータpush_sid（pop_eid），push_eid（pop_sid）とを比較し、ＰＵＳＨ命令またはＰＯＰ命令の生成終了を示す信号gen_endを出力する。
【００２０】
図３は、カウンタ回路３１の構成例を示す図である。カウンタ回路３１は、セレクタ４１〜４３、加算器４４，４５、内部レジスタ４６、ＯＲ回路５１〜５４、ＮＯＲ回路５５、及びＡＮＤ回路５６を含んで構成されている。
【００２１】
図４は、カウンタ回路３１の動作を示す図である。例えば、ＰＵＳＨ命令の生成開始を指示する信号push_strtが“１”になると、セレクタ４１からはデータpush_sidが出力され、セレクタ４２からは“１”が出力される。したがって、セレクタ４３から出力されるデータreg_idは、push_sid + 1となり、内部レジスタ４６から出力されるデータcnt_regは、push_sid + 2となる。そして、ＰＵＳＨ命令の生成実行を指示する信号push_exeが“１”になると、セレクタ４３から出力されるデータreg_idは内部レジスタ４６から出力されるデータcnt_regになり、データcnt_regはクロックCLKに応じて１ずつカウントアップされることとなる。つまり、ＰＵＳＨ命令を生成する場合、データreg_idは、push_sid + 1から順にカウントアップされていくこととなる。同様に、ＰＯＰ命令を生成する場合、データreg_idは、pop_sid - 1から順にカウントダウンされていくこととなる。
【００２２】
図５は、命令コード生成回路３２の構成例を示す図である。命令コード生成回路３２は、セレクタ６１〜６３、内部レジスタ６４、連結回路６５、ＯＲ回路７１〜７３、ＮＯＲ回路７４、及びＡＮＤ回路７５を含んで構成される。なお、push_codeはＰＵＳＨ命令の命令コードであり、pop_codeはＰＯＰ命令の命令コードである。また、連結回路６５は、セレクタ６２から出力される命令コードに、セレクタ６３から出力されるデータと、入力されるデータreg_idとを連結し、命令inst_codeとして出力する回路である。
【００２３】
図６は、命令コード生成回路３２の動作を示す図である。例えば、ＰＵＳＨ命令の生成開始を指示する信号push_strtが“１”の場合、セレクタ６２からは命令コードpush_codeが出力され、セレクタ６３からはデータstk_idが出力される。したがって、連結回路６５から出力される命令inst_codeは、データreg_idで示されるレジスタをデータstk_idで示されるスタックポインタが示す領域にＰＵＳＨする命令push + reg_id + stk_idとなる。そして、内部レジスタ６４には、セレクタ６３から出力されるデータstk_idが保持され、ＰＵＳＨ命令の生成実行を指示する信号push_exeが“１”になると、セレクタ６３から出力されるデータは内部レジスタ６４から出力されるデータgen_regとなり、連結回路６５から出力される命令はpush + reg_id + gen_regとなる。つまり、ＰＵＳＨ命令を生成する場合、データreg_idで示されるレジスタをデータstk_idで示されるスタックポインタが示す領域に退避する命令が出力されることとなる。同様に、ＰＯＰ命令を生成する場合、データstk_idで示されるスタックポインタが示す領域に格納されたデータをデータreg_idで示されるレジスタに復元する命令が出力されることとなる。
【００２４】
図７は、レジスタＩＤ比較回路３３の構成例を示す図である。レジスタＩＤ比較回路３３は、コンパレータ８１，８２、ＡＮＤ回路８３，８４、及びＯＲ回路８５を含んで構成される。なお、コンパレータ８１，８２から出力される信号cmp1，cmp2は、入力される２つのデータが異なる場合は“０”、等しい場合は“１”となる。
【００２５】
図８は、レジスタＩＤ比較回路３３の動作を示す図である。例えば、ＰＵＳＨ命令を生成する場合、データreg_idがカウントアップされてデータpush_eidと等しくなると信号cmp2が“１”となり、生成終了を示す信号gen_endが“１”となる。同様に、ＰＯＰ命令を生成する場合、データreg_idがカウントダウンされてデータpop_eidと等しくなると信号cmp1が“１”となり、生成終了を示す信号gen_endが“１”となる。
【００２６】
図９〜図１３は、ＰＵＳＨＭ命令によるマルチスタック処理の一例を示すタイミングチャートである。具体的には、図９はプロセッサ１０全体のタイミングチャート、図１０は、制御回路２１のタイミングチャート、図１１はカウンタ回路３１のタイミングチャート、図１２は命令コード生成回路３２のタイミングチャート、図１３はレジスタＩＤ比較回路３３のタイミングチャートを示している。なお、PCはプログラムカウンタ値を示すものであり、F，PDEC，DEC，ADR，DATA，EXE1，EXE2は、パイプライン処理におけるプログラムフェッチ、プリデコード、デコード、アドレス演算、データメモリアクセス、演算１、演算２の各フェーズを表すものとする。
【００２７】
初期状態では、図１０に示すように、信号cnt_stpが“０”である。そのため、図９に示すように、プログラムカウンタ１１のプログラムカウント値PCはクロックCLKに応じてカウントアップされている。また、図１０に示すように、選択信号inst_selが“０”である。そのため、図９に示すように、プログラムメモリ２５からプログラムカウント値PCに応じた命令のフェッチが行われている。そして、図９に示すように、ＰＵＳＨＭ命令に先立ち、スタック対象のレジスタを指定するＭＳＴＫＰＭ命令が実行されている。
【００２８】
なお、本実施形態のＭＳＴＫＰＭ命令は、プログラムではmstkpm(a, b)のように記述され、aで示すデータがpush_sid（pop_eid）にセットされ、bで示すデータがpush_eid（pop_sid）にセットされる。図９の例では、push_sidに“１”がセットされ、push_eidに“５”がセットされる。なお、push_sid（pop_eid）及びpush_eid（pop_sid）とレジスタとの関係は予め定められていることとする。
【００２９】
その後、ＰＵＳＨＭ命令がフェッチされてデコードされると、図１０に示すように、命令デコード回路２０が信号pushm_decを“１”に変化させる。これに応じて、制御回路２１は、信号push_strtを“１”に変化させるとともに、信号cnt_stpを“１”に変化させ、選択信号inst_selを“１”に変化させる。これにより、図９に示すように、プログラムカウンタ値PCの更新が停止されるとともに、マルチスタックモジュール１７にＰＵＳＨ命令の生成開始が指示され、セレクタ１８からはマルチスタックモジュール１７から出力される命令が出力されることとなる。
【００３０】
なお、本実施形態のＰＵＳＨＭ命令は、プログラムではpushm stk_idのように記載される。命令デコード回路２０では、pushm stk_idの命令が、push_sidで示されるレジスタに格納されたデータをstk_idで示されるスタックポインタの領域に退避するＰＵＳＨ命令としてデコードされる。そのため、図９においては、pushm sp0の命令が、アドレス演算フェーズ以降、bxで示されるレジスタに格納されたデータをsp0で示されるスタックポインタの領域に退避するＰＵＳＨ命令であるpush bx, sp0となっている。なお、bxは、push_sidの“１”に対応するレジスタを示すものである。
【００３１】
また、制御回路２１から出力される信号push_strtが“１”となり、その後、信号push_exeが“１”となることにより、図１１に示すように、カウンタ回路３１から出力されるデータreg_idが、push_sidである“１”に１を加算した“２”から順にカウントアップされていく。そして、図１２に示すように、命令コード生成回路３２は、reg_idの“２”〜“５”に対応するレジスタであるr0〜r3のデータを、sp0で示されるスタックポインタの領域に退避する命令inst_codeが順に生成して出力する。
【００３２】
カウンタ回路３１から出力されるデータreg_idが、push_eidと等しい“５”になると、図１３に示すように、レジスタＩＤ比較回路３３から出力される信号gen_endが“１”となる。これに応じて、図１０に示すように、制御回路２１は、信号push_exeを“０”に変化させるとともに、信号cnt_stpを“０”に変化させ、選択信号inst_selを“０”に変化させる。これにより、図９に示すように、マルチスタックモジュール１７に対してＰＵＳＨ命令の生成停止が指示されるとともに、プログラムカウンタ値PCの更新が再開され、セレクタ１８からはプログラムメモリインタフェース１６から出力される命令が出力されることとなる。
【００３３】
図１４〜図１８は、ＰＯＰＭ命令によるマルチスタック処理の一例を示すタイミングチャートである。具体的には、図１４はプロセッサ１０全体のタイミングチャート、図１５は、制御回路２１のタイミングチャート、図１６はカウンタ回路３１のタイミングチャート、図１７は命令コード生成回路３２のタイミングチャート、図１８はレジスタＩＤ比較回路３３のタイミングチャートを示している。  
ＰＯＰＭ命令の場合、信号pushm_decが信号popm_decとなり、信号push_strt，push_exeが信号pop_strt，pop_exeとなるが、基本的な動作は図９〜１３に示したＰＵＳＨＭの場合と同様である。
【００３４】
このように、プロセッサ１０によれば、ＰＵＳＨＭ命令を用いることによって、複数のレジスタに対する複数のＰＵＳＨ命令の全てをプログラムメモリ２５からフェッチするのではなく、マルチスタックモジュール１７で生成することにより、プログラムメモリ２５に格納されるプログラムのサイズを削減することができる。
【００３５】
また、プロセッサ１０によれば、ＰＯＰＭ命令を用いることによって、複数のレジスタに対する複数のＰＯＰ命令の全てをプログラムメモリ２５からフェッチするのではなく、マルチスタックモジュール１７で生成することにより、プログラムメモリ２５に格納されるプログラムのサイズを削減することができる。
【００３６】
そして、プロセッサ１０では、ＰＵＳＨ命令またはＰＯＰ命令をマルチスタックモジュール１７で生成する際には、プログラムメモリ２５からの命令のフェッチが停止されるため、プログラムメモリ２５へのアクセスによる電力消費を抑制することができる。
【００３７】
また、プロセッサ１０では、マルチスタック用レジスタ１２に設定されたデータに基づいて、スタック対象のレジスタが決定される。そのため、退避または復元が必要なレジスタのみをスタック対象とすることが可能となり、処理効率の向上及び消費電力の削減が可能となる。
【００３８】
さらに、プロセッサ１０では、マルチスタック用レジスタ１２にスタック対象のレジスタの範囲を示すデータを設定する命令が実装されており、処理状況に応じてスタック対象のレジスタを適切に変更することが可能となり、処理効率の向上及び消費電力の削減が可能となる。
【００３９】
なお、上記実施例は本発明の理解を容易にするためのものであり、本発明を限定して解釈するためのものではない。本発明は、その趣旨を逸脱することなく、変更、改良され得ると共に、本発明にはその等価物も含まれる。
【図面の簡単な説明】
【００４０】
【図１】本発明の一実施形態であるプロセッサの構成を示す図である。
【図２】マルチスタックモジュールの構成例を示す図である。
【図３】カウンタ回路の構成例を示す図である。
【図４】カウンタ回路の動作を示す図である。
【図５】命令コード生成回路の構成例を示す図である。
【図６】命令コード生成回路の動作を示す図である。
【図７】レジスタＩＤ比較回路の構成例を示す図である。
【図８】レジスタＩＤ比較回路の動作を示す図である。
【図９】ＰＵＳＨＭ命令の場合におけるプロセッサ全体のタイミングチャートを示す図である。
【図１０】ＰＵＳＨＭ命令の場合における制御回路のタイミングチャートを示す図である。
【図１１】ＰＵＳＨＭ命令の場合におけるカウンタ回路のタイミングチャートを示す図である。
【図１２】ＰＵＳＨＭ命令の場合における命令コード生成回路のタイミングチャートを示す図である。
【図１３】ＰＵＳＨＭ命令の場合におけるレジスタＩＤ比較回路のタイミングチャートを示す図である。
【図１４】ＰＯＰＭ命令の場合におけるプロセッサ全体のタイミングチャートを示す図である。
【図１５】ＰＯＰＭ命令の場合における制御回路のタイミングチャートを示す図である。
【図１６】ＰＯＰＭ命令の場合におけるカウンタ回路のタイミングチャートを示す図である。
【図１７】ＰＯＰＭ命令の場合における命令コード生成回路のタイミングチャートを示す図である。
【図１８】ＰＯＰＭ命令の場合におけるレジスタＩＤ比較回路のタイミングチャートを示す図である。
【符号の説明】
【００４１】
１０  プロセッサ
１１  プログラムカウンタ
１２  マルチスタック用レジスタ
１３  データレジスタ
１４  アドレスレジスタ
１５  プログラムアドレス生成回路
１６  プログラムメモリインタフェース
１７  マルチスタックモジュール
１８  セレクタ
１９  命令レジスタ
２０  命令デコード回路
２１  制御回路
２２  アドレス演算回路
２３  データメモリインタフェース
２５  プログラムメモリ
２６  データメモリ
３１  カウンタ回路
３２  命令コード生成回路
３３  レジスタＩＤ比較回路
【図１】
2008299501.tif 000003
【図２】
2008299501.tif 000004
【図３】
2008299501.tif 000005
【図４】
2008299501.tif 000006
【図５】
2008299501.tif 000007
【図６】
2008299501.tif 000008
【図７】
2008299501.tif 000009
【図８】
2008299501.tif 000010
【図９】
2008299501.tif 000011
【図１０】
2008299501.tif 000012
【図１１】
2008299501.tif 000013
【図１２】
2008299501.tif 000014
【図１３】
2008299501.tif 000015
【図１４】
2008299501.tif 000016
【図１５】
2008299501.tif 000017
【図１６】
2008299501.tif 000018
【図１７】
2008299501.tif 000019
【図１８】
2008299501.tif 000020