(57)【要約】  ＡＬＵの多次元アレイを有し、少なくとも２つの次元を有し、次元におけるＡＬＵの数は２以上であり、相応のアレイ内のＡＬＵのうち少なくとも幾つかの間でレジスタに起因するレイテンシーを伴わずにデータを処理するように適合されている、データ処理装置。
2008530642.tif 000002
【特許請求の範囲】
【請求項１】
ＡＬＵの多次元のアレイを有するデータ処理装置において、
少なくとも２つの次元を有し、次元におけるＡＬＵの数は２以上であり、
該ＡＬＵの数は、相応のアレイ内のＡＬＵのうち少なくとも幾つかの間でレジスタに起因するレイテンシーを伴わないようにデータを処理するように適合されていることを特徴とする、データ処理装置。
【請求項２】
少なくとも１つのＡＬＵチェーンが、該チェーンのＡＬＵステージ間にレジスタを有さずに構成されている、請求項１記載のデータ処理装置。
【請求項３】
少なくとも２つのＡＬＵパイプラインを有し、
異なるパイプラインに存在するＡＬＵ間に、他方のパイプラインにおける状態および／または条件を示す信号が設けられている、請求項１または２記載のデータ処理装置。
【請求項４】
少なくとも１つのＡＬＵ、有利にはパイプライン内のＡＬＵ、有利にはパイプライン内の各ＡＬＵ、有利には各パイプライン内の各ＡＬＵは、条件を評価して該条件に応答して演算を実行し、かつ／または該条件に応答して演算を実行しないように構成されており、
該条件の評価および該条件に応答する実行または非実行は、有利には１つのクロックサイクルで行われる、請求項１から３までのいずれか１項記載のデータ処理装置。
【請求項５】
少なくとも１つのユニット、有利にはＡＬＵは、
別のユニットの評価に応答して、有利には同一または隣接するパイプライン内の１つのユニットに応答して、有利には同一または上流のステージにおける１つのユニットに応答して、演算を実行するかまたは実行しないように構成されている、請求項４記載のデータ処理装置。
【請求項６】
擬似ノイズパターンを生成するためのデータ処理装置において、
セルの再構築可能なアレイの一部を構成する複数のセル、またはセルの再構築可能なアレイとして使用されるように構成された複数のセルと、
少なくとも１つの拡張部
とを有し、該少なくとも１つの拡張部は、
レジスタと複数のビットロジックラインとを有し、とりわけＬＵＴのストライプを有し、
各ＬＵＴはそれぞれ同一の内容を有し、かつ／または有利には３：２ＬＵＴであることを特徴とする、データ処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
発明の説明
本発明は、実行パイプラインを有するプロセッサのための次のようなデータ処理方法と、とりわけ最適化されたアーキテクチャとに関する。すなわち、パイプラインの各ステージごとに条件付き実行を行い、とりわけ、パイプラインの機能停止による全体的なパフォーマンスの低減なしで条件付きのジャンプを行えるようにするデータ処理方法と、とりわけ最適化されたアーキテクチャとに関する。本発明によるアーキテクチャはとりわけ、すべての逐次アルゴリズムに適合されており、とりわけハフマン型アルゴリズム、たとえばＣＡＶＬＣに適合されており、多数の条件およびジャンプを有するたとえばＣＡＢＡＣ等の算術コーデックに適合されている。さらに、本発明はとりわけフレーム内符号化に適しており、たとえばビデオコーデックＨ．２６４によって提案されているようなフレーム内符号化に適している。
【０００２】
データ処理では、使用可能なリソースの最適化と、データ処理に関与する回路の電力消費の最適化とが必要とされる。このことはとりわけ、リコンフィギュラブルなプロセッサが使用される場合に当てはまる。
【０００３】
リコンフィギュラブルなアーキテクチャは、コンフィギュラブルな機能および／または相互接続を有するモジュール（ＶＰＵ）を有し、とりわけ、１次元または多次元に配置された算術および／または論理および／またはアナログおよび／または記憶および／または内部／外部接続モジュールを複数有する集積モジュールを有する。これらのモジュールは、直接またはバスシステムを介して相互に接続されている。
【０００４】
このような通常のモジュールはとりわけ、シストリックアレイ、ニューラルネットワーク、マルチプロセッサシステム、複数の算術ユニットおよび／または論理セルおよび／または通信／周辺セル（ＩＯ）を有するプロセッサ、クロスバースイッチ等である接続ネットワーク化モジュールを含み、ＦＰＧＡ，ＤＰＧＡ、Chameleon、ＸＰＵＴＥＲ等の種類の公知のモジュールも含む。ここではまた、とりわけ同出願人の以下の特許および特許出願も引用する。
【０００５】
Ｐ４４１６８８１．０−５３，ＤＥ１９７８１４１２．３，ＤＥ１９７８１４８３．２，ＤＥ１９６５４８４６．２−５３，ＤＥ１９６５４５９３．５−５３，ＤＥ１９７０４０４４．６−５３，ＤＥ１９８８０１２９．７，ＤＥ１９８６１０８．８２−５３，ＤＥ１９９８０３１２．９，ＰＣＴ／ＤＥ００／０１８６９，ＤＥ１００３６６２７．９−３３，ＤＥ１００２８３９７．７，ＤＥ１０１１０５３０．４，ＤＥ１０１１１０１４．６，ＰＣＴ／ＥＰ００／１０５１６，ＥＰ０１１０２６７４．７，ＤＥ１０２０６８５６．９，６０／３１７，８７６，ＤＥ１０２０２０４４．２，ＤＥ１０１２９２３７．６−５３，ＤＥ１０１３９１７０．６，ＰＣＴ／ＥＰ０３／０９９５７，ＰＣＴ／ＥＰ２００４／００６５４７，ＥＰ０３０１５０１５．５，ＰＣＴ／ＥＰ２００４／００９６４０，ＰＣＴ／ＥＰ２００４／００３６０３，ＥＰ０４０１３５５７．６。
【０００６】
これらの引用文献は、とりわけアーキテクチャ要素のコンフィギュレーション、ルーティング、配置、構成、トリガ手法等の詳細に関して開示する目的で含まれることに留意されたい。これらの引用文献は特定の実施形態において、専用のコンフィギュレーション系統を使用するコンフィギュレーションに関して述べているが、絶対的に必要というわけではないことに留意すべきである。本発明から、本発明の範囲から逸脱せずに、同一の入力ラインを使用して、データとインターメッシュして命令を処理アーキテクチャへ転送することが可能であることが理解できる。さらに本発明は、通信用の任意のプロトコルを使用する環境で使用できる基本的原理を開示していることにも留意すべきであり、本発明はとりわけ、入力側および出力側にプロトコルレジスタも含むことができることにも留意すべきである。また、とりわけハイパースレッドアプリケーションに限らず、本願で開示されている発明は、別の任意のプロセッサの一部として、とりわけマルチコアプロセッサ等の一部として使用できることは自明である。
【０００７】
本発明の課題は、工業用途に対して新規の構成を提供することである。
【０００８】
前記課題は、独立請求項の構成によって解決される。従属請求項に有利な実施形態が示されている。
【０００９】
従来技術によるプロセッサの大部分は、パフォーマンスを向上するためにパイプライン方式またはベクトル演算論理回路を使用する。条件の場合、とりわけ条件付きジャンプの場合、パイプライン内および／またはベクトル演算論理回路内の実行を停止しなければならない。最悪のケースのシナリオでは、実行完了された計算さえも放棄しなければならない。このようないわゆるパイプライン停止により、特定のプロセッサアーキテクチャに依存して、１０〜３０クロックサイクルが無駄になる。これが頻繁に発生する場合には、プロセッサ全体のパフォーマンスが有意に影響される。したがって、頻繁にパイプライン停止が発生することによって２ＧＨｚプロセッサの処理能力が、１００ＭＨｚプロセッサの処理能力にまで実使用処理能力が低減されるおそれがある。したがってパイプライン停止を低減するためには、たとえば分岐予測および分岐叙述（branch-predication）等の複雑な手法が使用されるが、このような手法は、エネルギー消費およびシリコン面積に関して非常に非効率的である。
【００１０】
それとは対照的に、ＶＬＩＷプロセッサは一見すると、深くまでパイプライン化されたアーキテクチャよりはフレキシブルに見えるが、ジャンプの場合には命令語全体が放棄されることにもなり、さらに、パイプラインおよび／またはベクトル演算論理回路を組み込まなければならない。
【００１１】
本発明によるプロセッサアーキテクチャは、パイプライン内で任意のジャンプを行うことができるが、たとえば分岐予測に使用されるハードウェア等の複雑である付加的なハードウェアを必要としない。パイプライン停止が発生することはないので、このアーキテクチャによって、理論的な最大パフォーマンスに近い、従来のプロセッサよりも格段に高い平均パフォーマンスを実現することができ、このことはとりわけ、ジャンプおよび／または条件の数が多いアルゴリズムの場合に当てはまる。
【００１２】
本発明はたとえば従来のマイクロプロセッサとして使用するのにも適しているが、それだけではなく、コプロセッサとして、かつ／または再構築可能なアーキテクチャと結合するために使用するのにも適している。異なる結合手法を使用することができ、たとえば、共通のバスおよび／またはメモリを使用して「疎」結合を行う手法、いわゆるコプロセッサインタフェースを使用する（再構築可能な）プロセッサと結合する手法、再構築可能なプロセッサのデータパスに再構築可能なユニットを組み込む手法、および／または、２つのアーキテクチャをスレッドリソースとしてハイパースレッドアーキテクチャにおいて結合する手法を使用することができる。ここで、とりわけハイパースレッドアーキテクチャに関する結合についての記載があるＰＣＴ／ＥＰ２００４／００３６０３（ＰＡＣＴ５０／ＰＣＴＥ）を引用する。この引用文献の開示内容はすべて、参照のために本願の開示内容に含まれるものとする。
【００１３】
本発明のアーキテクチャは、相当数の逐次演算を含むデータ処理が行われる既知のプロセッサアーキテクチャより顕著な利点を有し、とりわけＶＬＩＷアーキテクチャと比較して顕著な利点を有する。実行すべきアルゴリズムが、並列処理すべき相当数の命令を有し、暗示的なベクトル変換性または命令レベルの並列性ＩＬＰを含む場合、本発明のアーキテクチャはＶＬＩＷ等の他のプロセッサおよびコプロセッサ、一般的に言うと他のデータ処理ユニットと比較して高水準のパフォーマンスを維持する。というのも、所与のプロセッサアーキテクチャの特殊性を整合および接続できるという利点をフルに実現できるからである。
【００１４】
このことはとりわけ、一般的にはシーケンサ構造に最良にマッピングできるデータ処理ステップを実行すべき場合に当てはまる。
【００１５】
本発明によるアーキテクチャ
以下では、本発明によるアーキテクチャをプロセッサとして参照することに留意されたい。しかし、本発明をフル稼働のプロセッサと見なすことができ、かつ／または本発明をこのようなフル稼働のプロセッサを構成するために使用できる限りは、本発明のコアが複数のコアのうち１つのコア、とりわけ相互に異なるコアのうち１つのコアを成す、たとえばマルチコアプロセッサ等のより複雑な環境で使用するための１つのプロセッサコアのみを導き出し、より一般的に言うと１つのデータ処理コアのみを導き出すことも可能であることを理解すべきである。さらに、（粗粒度および／または中間粒度の）「シー・オブ・ロジック」に含まれる処理アレイ要素または処理アレイ回路を成すためにも本発明のコアを使用できることも理解できる。上記で幾つか留意点を述べたが、以下の記載は大部分において、本発明によるプロセッサを参照する。これは本発明を限定するものではなく、当業者が本発明を理解しやすいようにするためだけのものである。より一般的に言うと、各パラグラフおよび／または各文および／または各用語および／または各対象および／または各主体および／または別の所与の文法的な構造を参照すること、または関連づけすること、または繰り返すことなく、可能な択一的構成および／または任意の特徴、または実施可能な択一的構成および／または任意の特徴、または有利な択一的構成および／または任意の特徴、または、特許審査官、特許関係従業員、弁理士または特許審判官が記載の開示内容の実際の対象である技術的事項にフォーカスすることなく文言上の子細を解釈してより完全な開示内容の必要な部分または有用な部分として見なされるが当業者はそう見なさない評価が低い択一的構成および／または任意の特徴のうちいずれもすべて、または少なくとも幾つかは、本願開示内容の範囲を限定すると見なされることは決してない。
【００１６】
以上のことを述べた上で、本発明によるプロセッサ（ＸＭＰ）は、ロウで接続された幾つかのＡＬＵステージを有し、各ＡＬＵステージは先行のＡＬＵステージの状態に応答して条件付きで命令を実行する。どのような所与のプログラム構造も実行できるようにするため、それぞれの面上で実行可能な命令の最大数を各ＡＬＵステージ上に記憶することにより、完全なプログラムフローツリーを実行することができる。先行のステージの状態および／またはプロセッサ状態レジスタの状態を使用することにより、それぞれ実際に実行すべきステージに対する命令が１つのクロックサイクルから別のクロックサイクルまでに決定される。完全なプログラムフローツリーをインプリメントするためには、最初のＡＬＵステージでは１つの命令を実行することが必要であり、第２のＡＬＵステージでは（少なくとも）２つの命令のうち１つの命令の条件付き実行が必要であり、第３のＡＬＵステージでは（少なくとも）４つの命令のうち１つの命令の条件付き実行が必要であり、ｎ番目のステージでは（少なくとも）２ｎ個のオペコードのうち１つのオペコードの条件付き実行が必要である。有利な実施形態では、すべてのＡＬＵが共通のレジスタセットに対して読み込みおよび書き込みのアクセス権を有することができる。有利には、１つのＡＬＵステージの結果はオペランドとして後続のＡＬＵステージへ送信される。ここでは「結果」という用語は、たとえば繰り上げ、あふれおよび符号フラグ等の結果関連のデータも指すことに留意すべきである。パイプラインレジスタステージは、異なるＡＬＵステージ間で使用することができる。とりわけ、すべてのＡＬＵステージの下流側にパイプライン状のレジスタが設けられるのではなく、ＡＬＵの所与のグループの下流側にのみパイプライン状のレジスタが設けられるようにインプリメントすることができる。とりわけ、グループごとのＡＬＵとパイプラインステージとの関係性は、ＡＬＵグループ内でちょうど１つの条件付き実行のみが行われるように形成されるのが有利である。
【００１７】
ＡＬＵステージの有利な実施形態
図１は、本発明によるプロセッサ（ＸＭＰ）のデータパスの基本的な構成を示す。プロセッサのデータおよび／またはアドレスレジスタは０１０９によって示されている。４つのＡＬＵステージが０１０１，０１０２，０１０３，０１０４によって示されている。これらのステージは相互にパイプライン状に接続されており、各ＡＬＵにはマルチプレクサ／レジスタステージ０１０５，０１０６，０１０７が続く。各ステージのマルチプレクサは、後続のＡＬＵのオペランドのソースを選択する。このソースはこの実施形態では、プロセッサレジスタおよびそれぞれの先行のＡＬＵの結果のいずれかである。この実施形態では、マルチプレクサが、ＡＬＵがそれぞれのマルチプレクサに対してどれだけ上流に位置するかに依存せずに、かつ／または、ＡＬＵがどのカラムに位置するかに依存せずに、オペランドとして上流の任意のＡＬＵの結果を選択する有利な構成が使用される。ＡＬＵ結果は先行のＡＬＵから直接引き継がれるので、プロセッサレジスタにライトバックする必要はない。したがって、ＡＬＵ／レジスタデータ転送はとりわけシンプルであり、ここで提案および開示されているマシンではエネルギー効率が高い。それと同時に、解決するのが困難なデータ依存性の問題は存在しない（とりわけ、コンパイラによって解決するのが困難なデータ依存性の問題）。したがって、ＶＬＩＷプロセッサから周知であるようなＡＬＵ間のデータ依存性は、ここでは問題にならない。
【００１８】
マルチプレクサに任意に続くレジスタステージが、ＡＬＵステージ間のデータ転送をパイプライン方式で分離する。有利な実施形態では、このようなレジスタステージはインプリメントされないことに留意すべきである。プロセッサレジスタ０１０９の出力端に直接続いて、マルチプレクサステージ０１１０が第１のＡＬＵステージに対するオペランドを選択するように構成されている。別のマルチプレクサステージ０１１１が、０１０９におけるターゲットレジスタに対するＡＬＵステージの結果を選択する。
【００１９】
図２に、図１のＡＬＵステージ構成体０１３０のプログラムフロー制御が示されている。命令レジスタ０２０１は、所与の時点で０１３０において実行すべき命令を保持する。従来技術のプロセッサから公知であるように、命令は命令フェッチャによって通常のようにフェッチされる。この命令フェッチャは、プログラムポインタＰＰによって定義されたプログラムメモリ内のアドレスから実行すべき命令をフェッチする（０２１０）。
【００２０】
第１のＡＬＵステージ０１０１は、マルチプレクサステージ０１１０を使用するＡＬＵに対するオペランドを決定する命令レジスタ０２０１によって固定的に定義された命令０２０１ａを実行する。また、ＡＬＵの関数は同様に設定されている。０１０１によって生成されたＡＬＵフラグはプロセッサフラグレジスタ０２０２と組み合わせることができ（０２０３）、後続のＡＬＵ０１０２のフラグ入力データとして該ＡＬＵ０１０２へ送信される。
【００２１】
０１０３内の各ＡＬＵステージは状態を生成し、この状態に応答して後続のステージは相応のジャンプを遅延なしで実行し、相応の命令を続行する。
【００２２】
０２０３で得られた状態に依存して、ＡＬＵステージ０１０２に対し、０２０１からの２つの可能な命令のうち１つの命令０２０５がマルチプレクサによって選択される。ジャンプターゲットのこのような選択は、ジャンプベクトル０２０４によって後続のＡＬＵステージへ転送される。選択された命令０２０５に依存して、マルチプレクサステージ０１０５は後続のＡＬＵステージ０１０２に対するオペランドを選択する。さらにＡＬＵステージ０１０２の関数が、選択された命令０２０５によって決定される。
【００２３】
０１０２によって選択されたＡＬＵフラグは、０１０１から受け取られたフラグ０２０４と組み合わされ（０２０６を参照）、後続のＡＬＵ０１０３のフラグ入力データとして該後続のＡＬＵ０１０３へ送信される。０２０６で得られた状態と、先行のＡＬＵ０１０２から受け取られたジャンプベクトル０２０４とに依存して、マルチプレクサはＡＬＵステージ０１０３に対し、０２０１からの４つの可能な命令のうち１つの命令０２０７を選択する。
【００２４】
ＡＬＵステージ０１０１の可能なジャンプターゲットは２つであるから、ＡＬＵ０１０２に対する可能な命令は２つである。ＡＬＵ０１０２ではジャンプターゲットは２つであるが、このことは０１０１の２つの各ジャンプターゲットに当てはまる。換言すると、可能なジャンプターゲットのバイナリツリーが作成され、このバイナリツリーの各ノードは２つの分岐を有する。このようにして、ＡＬＵ０１０２は２ｎ＝４個の可能なジャンプターゲットを有し、これらは０２０１に記憶されている。
【００２５】
選択されたジャンプターゲットは信号０２０８によって後続のＡＬＵステージ０１０３へ送信される。選択された命令０２０７に依存して、マルチプレクサステージ０１０６は後続のＡＬＵステージ０１０３に対するオペランドを選択する。さらに、ＡＬＵステージ０１０３の関数が、選択された命令０２０７によって決定される。
【００２６】
ＡＬＵステージ０１０３，０１０４で実行される処理は、他のステージ０１０１および０１０２それぞれに関する説明に相応するが、事前定義された状態による選択に使用される命令セットはそれぞれ８個（０１０３の場合）または１６個（０１０４の場合）である。先行のステージと同様に、２ｎ＝１６個（ｎ＝ステージの順番＝４）のジャンプターゲットを有するジャンプベクトル０２１１がＡＬＵステージ０１０４の出力端で生成される。この出力は、次に実行すべきオペコードのアドレスとして１６個の可能なアドレス０２１２のうち１つのアドレスを選択するマルチプレクサへ送信される。ジャンプアドレスメモリは有利には、命令語０２０１の一部としてインプリメントされる。有利には、ジャンプアドレスメモリ０２１２にはアドレスは相対的に記憶され（たとえば±１２７）、０２１３を使用して、選択されたジャンプアドレスを現在のプログラムポインタ０２１０に足し、該プログラムポインタを、ロードおよび実行すべき次の命令に送る。留意点：本発明の１つの実施形態では、各ＡＬＵステージに対して選択できる有効な命令はそれぞれ１つだけであり、他のすべての選択肢は、ＮＯＰ（no operation）命令または「無効」命令を出すだけである。本願開示内容の一部を成す添付書類を参照されたい。
【００２７】
ＡＬＵステージ０１０４のフラグは先行のＡＬＵステージと同様に（０２０９を参照されたい）、先行のステージから得られたフラグと組み合わされ、フラグレジスタにライトバックされる。このフラグは、ＡＬＵステージ構成体０１３０におけるすべてのＡＬＵ演算の結果フラグであり、次のサイクルでＡＬＵパス０１３０へのフラグ入力として使用される。
【００２８】
４つのＡＬＵステージと後続のパイプラインレジスタとを有するこの有利な実施形態は、単なる一例である。通常の知識を有する者であれば、ここに挙げられた構成から、たとえばＡＬＵステージ数、パイプラインステージの数および配置、カラムの数、隣接するカラムおよび／または隣接しないカラムとの接続、および／またはレジスタセットの配置および構成に関して異なるインプリメンテーションを導き出すことが可能であることが理解できる。
【００２９】
このような基本的なデータ処理方法により、マルチＡＬＵステージ構成体の各ＡＬＵステージが、条件および／またはジャンプを実行および／または生成することができる。条件の結果またはジャンプターゲットの結果は、たとえば０２０６等のフラグベクトルによって、またはたとえば０２０８等のジャンプベクトルによって、各後続のＡＬＵステージへ転送され、たとえば０２０６および０２０８等の入力されたベクトルに依存して、たとえばオペランドとしてデータ処理に対するフラグおよび／またはフラグベクトルを使用して、かつ／または、ジャンプベクトルによって実行すべき命令を選択することによって演算を実行する。このことは、ノーオペレーション命令を選択してＡＬＵを有効に使用不能にすることを含むことができる。このＡＬＵステージ構成体０１３０内では各ＡＬＵは、命令語０２０１内で暗示的に符号化され明示的なジャンプコマンドを必要および／または実行しない任意のジャンプを実行することができる。プログラムポインタは、０２１３を介してＡＬＵステージ構成体内で演算が実行された後に、ロードすべき次の命令へのジャンプ実行を開始する。
【００３０】
プロセッサフラグ０２０２は連続的にＡＬＵステージから消費され、各ＡＬＵの結果フラグによって組み合わせかつ／または置換される。上記のＡＬＵステージ構成体（ＡＬＵパス）の出力側において、すべてのＡＬＵの最終的結果の結果フラグがプロセッサフラグレジスタ０２０２に戻され、新たなプロセッサ状態を定義する。図２に示されたＡＬＵステージの構成または構築は、非常に複雑および高消費となる場合がある。このことは、実行されるジャンプの数が多くなり、必要とされるスペースが大きくなると同時に、設計およびシミュレーションの複雑性が増大することに拠る。大部分のアルゴリズムでは複数の分岐を直接連続的に行う必要がない事実を鑑みると、ＡＬＵパスを簡略化することができる。提案の一例として、１つの実施形態が図３に示されている。図３では全般的な構成は図２の構成に近いが、可能なジャンプのセットは２つに制限されている。最初の２つのＡＬＵ０１０１および０１０２に対する命令が命令レジスタ０３０１において、固定的な方式で符号化される（この固定的な符号方式は、命令がハードウェア設計工程中に固定化されるのではなく、図３の装置に一度ロードされた１つのプログラム部分の実行中に命令を変更する必要がないことを暗示する）。ＡＬＵステージ０１０２はジャンプを実行し、ＡＬＵステージ０１０３および０１０４それぞれに対して命令が２つずつ０３０２に記憶される。各命令対のうち１つの命令は実行時に、マルチプレクサを使用するＡＬＵステージ０１０２の状態に応答してジャンプターゲットに依存して選択される。ＡＬＵステージ０１０４は、０３０３に４つの可能なターゲットが記憶されたジャンプを実行する。ＡＬＵステージ０１０４の状態に依存して実行時にマルチプレクサによってターゲットが選択され、加算器０２１３を使用してプログラムポインタ０２１０と結合される。各ＡＬＵステージ間にマルチプレクサステージ０３０４，０３０５，０３０６が設けられており、これはそれぞれレジスタステージを有することができる。有利には、レイテンシーを低減するためにレジスタステージはインプリメントされない。
【００３１】
並列接続された命令
有利には別の構成体０１０１，０１０２，０１０３，０１０４＝０１３０では、簡単かつ時間的に高速で実行可能な命令のみがＡＬＵにインプリメントされる。このことは有利であり、実質的な制限にならない。プログラム内で最も高頻度の命令は（たとえばＡＤＤ命令、ＳＵＢ命令、ＳＨＬ命令、ＳＨＲ命令、ＣＭＰ命令等を参照されたい）このような制限に該当する事実に起因して、処理時間が比較的長くひいてはクロック周波数に関してＡＬＵステージ構成に制限を課す比較的複雑な命令を、副次的なＡＬＵ０１３１として接続し、有利には、上記のＡＬＵステージに対して並列に接続することができる。２つの「副次的ＡＬＵ」が０１２０および０１２１としてインプリメントされているのが示されている。上記のようなより複雑な命令は、乗算器、複雑なシフタおよびディバイダとすることができる。
【００３２】
有利な実施形態ではとりわけ、プロセッサチップ上で大きなインプリメント面積を必要とする命令はすべて、各ＡＬＵ内にインプリメントされる代わりに前記副次的ＡＬＵ構成体にインプリメントすることができ、またインプリメントされることを明示的に述べておく。択一的な実施可能な構成では、ＡＬＵステージの各ＡＬＵにおいてハードウェア実装のために比較的大きな面積を必要とする命令を実行することはできず、ＡＬＵステージのサブセットでのみ、たとえば２番目ごとのＡＬＵでのみこのような命令を実行することができる。
【００３３】
副次的ＡＬＵ０１３１は、図面ではパイプラインの側方に示されているが、物理的にＡＬＵステージ／パイプライン構成体の側方に配置する必要はない。その代わり、プロセッサのハードウェアを構成するのに必要とされる実際の実施可能な工程に依存して、副次的ＡＬＵ０１３１をＡＬＵステージ／パイプライン構成体の頂部および／または下方にインプリメントすることができる。副次的ＡＬＵ０１３１は、マルチプレクサ０１１０を介してプロセッサレジスタ０１０９から必要なオペランドを受け取り、マルチプレクサ０１１１を使用して該プロセッサレジスタに結果をライトバックする。したがって、副次的ＡＬＵが必要なオペランドを受け取る手法は、ＡＬＵステージ構成体がオペランドを受け取る手法に相応する。プロセッサレジスタ０１０９からオペランドを受け取るだけでなく、副次的ＡＬＵは、１つのＡＬＵの出力端またはＡＬＵステージの出力端または複数のＡＬＵステージの出力端に接続することもできることを述べておく。命令群がＡＬＵステージ構成体０１３０または副次的ＡＬＵ０１３１で実行されるマシンモデルは存在するが、両ＡＬＵユニットおよび０１３１に同時に存在するハイパースカラ実行モデル処理データをインプリメントすることもできる。
【００３４】
再構築可能なプロセッサ、たとえばＶＰＵを副次的ＡＬＵに組み込むことにより、シーケンシャルアーキテクチャとの密な接続および結合が実現される。本発明のプロセッサコア内のプロセッサ自体は、再構築可能なプロセッサすなわち再構築可能なエレメントのアレイに結合できることを述べておく。したがって、副次的ＡＬＵ側は再構築可能なプロセッサを有することができる。このようなプロセッサは、ＡＬＵ構成体０１３０が接続された処理アレイと比較して、たとえば設けられる処理エレメントが比較的少ないこと、かつ／または直近で隣接して接続が行われること、かつ／または異なるプロトコルが設けられることにより、複雑性を低減することができる。有利な場合には、バブーシュカ状（またはチェーン状）の結合を簡単に実現することができることを述べておく。また必要な場合には、副次的ＡＬＵは比較的大きなアレイにデータを転送できることも留意されたい。さらに、副次的ＡＬＵが再構築可能なプロセッサおよび／または再構築可能なプロセッサのアーキテクチャおよび／または再構築可能なプロセッサのプロトコルを有する場合、これらは、本発明のＡＬＵ構成体が比較的大きなスケールで結合されたものと同じである必要がないことを述べておく。すなわち、バブーシュカを考察すれば、外側のバブーシュカ再構築可能プロセッサアレイは、内側のバブーシュカ再構築可能プロセッサアレイのプロトコルと異なるプロトコルを有することができる。その理由は、比較的小さなアレイでは、異なるプロトコルおよび／または接続が有利である場合があるということになる。たとえば本発明のＡＬＵ構成体が２０×２０アレイに結合され、該ＡＬＵ構成体のＡＬＵに含まれる再構築可能な処理アレイがそれより小さい場合、たとえば３×３アレイである場合、この３×３アレイでは直近で隣接して接続する必要はなく、とりわけこのことは、多次元トロイダル接続が行われる場合には必要ない。また、内側バブーシュカプロセッサアレイを部分的に再構築する必要もなくなる。副次的ＡＬＵの比較的小さいアレイでは、この（比較的小さい）アレイ全体を再構築するだけで十分である。
【００３５】
副次的ユニット０１３１を上記で言及し、以下では副次的「ＡＬＵ」と称するが、ＸＰＰ状のアレイを副次的ＡＬＵとして本発明のアーキテクチャに結合できるのと同様に、別のユニットを「ＡＬＵ」として使用することもでき、たとえばルックアップテーブル、ＲＡＭ、ＲＯＭ、ＦＩＦＯまたは別の種類のメモリ、とりわけ本発明の多列ＡＬＵ構成体内の各ＡＬＵステージまたはＡＬＵおよび／または複数のＡＬＵステージまたはＡＬＵに書き込み可能および／または読み出し可能なメモリを使用することもできる。これらは本発明を限定するものではない。さらに、本願出願前の出願で開示されたセル要素および／またはセル要素の機能のうち任意のセル要素および／または機能を副次的ＡＬＵとしてインプリメントすることができ、たとえばＦＰＧＡグリッド、ＶＬＩＷ‐ＡＬＵ、ＤＳＰコア、浮動点ユニット、任意の種類のアクセラレータ、当分野においてすでに公知であるかまたは将来の技術で開示される周辺インタフェース、たとえばメモリバスおよび／またはＩ／Ｏバス等と組み合わされたＡＬＵを、副次的ＡＬＵとしてインプリメントすることができることに留意すべきである。
【００３６】
また、本発明のＡＬＵ構成体に含まれるＡＬＵステージのロウのＡＬＵが上記で開示および記載されており、以下では、たとえばレイテンシーが制限された縮小された命令セット等である所与の命令セットを実行できるＡＬＵとされるが、パス内のＡＬＵのうち少なくとも幾つかは別の機能を有するように構築および／または構成することができることも理解すべきである。非常に多数の浮動点命令を必要とする本発明の構成体上でアルゴリズムを処理すべきであることを前提とするのが妥当である場合には、上記の記載にかかわらず、副次的ＡＬＵに含まれるだけではなくＡＬＵステージパスにも含まれるＡＬＵのうち少なくとも幾つかは、浮動点機能を有することができる。パフォーマンスが重要点であり、別の機能より低速で実行されかつ高頻度では使用されない機能を有するようにＡＬＵをインプリメントすべき場合、この機能を参照するオペコードを定義または条件付きで実行すべき場合にクロックを低速化することができる。クロック周波数は、他のケースと同様に、ＡＬＵ構成体全体に対してロードされる命令で指示することもできる。また必要な場合には、カラムのうち少なくとも１つに含まれるＡＬＵのうち幾つかを、それ自体が構築可能であるように構成し、（必要な場合には事前構築された）コンフィギュレーションを参照することによって命令が定義されるようにすることもできる。ここで、ＡＬＵの１つのロウから別のロウに転送される状態および／またはＡＬＵのカラム間で転送される状態を、（（再）構築可能な）アレイ全体の状態とすることができる。このことにより、命令を非常に効率的に選択できる手法を定義することができる。このようなケースでは、本発明で使用されＡＬＵにロードすべき命令は、全体のコンフィギュレーションおよび／または別の命令およびトリガ値等を使用して選択できる複数のコンフィギュレーションを含むことが可能であることを理解すべきである。
【００３７】
さらに特定のケースでは、上記で副次的ＡＬＵ（または、より正確には副次的ユニット）のための慣用の伝統的なＡＬＵに対して択一的な選択肢として記載されたユニットを、データパスの少なくとも幾つかの部分で、すなわち本発明のＡＬＵ構成体に含まれる少なくとも１つのＡＬＵに使用することも可能であることを理解すべきである。したがって１つまたは複数の「ＡＬＵ状」要素を、ルックアップテーブル、ＲＡＭ、ＲＯＭ、ＦＩＦＯまたは別のメモリ、（１つまたは複数の）Ｉ／Ｏインタフェース、ＦＰＧＡ、ＤＳＰコア、ＶＬＩＷユニットまたはこれらの組み合わせとして構成することができる。また、オペランドが複数である場合でも、処理ユニットおよび／または変更ユニットおよび／または組み合わせユニット、すなわち「従来の」ＡＬＵは、たとえば乗算器ステージを省略することによってオペランド処理手段の集合が縮小された場合でも維持されることにも留意すべきである。さらにこのような場合でも、本発明から従来のＸＰＰまたは別の再構築可能なアレイまでには、状態の定義が完全に異なるという決定的な相違が存在することにも留意されたい。
【００３８】
従来のＸＰＰでは、状態はアレイ全体に分布され、すべてのトリガベクトルがアレイ全体のＡＬＵ間およびプロトコル関連の状態間で交換されるアレイ全体を考慮する際にのみ、アレイの状態を定義することができる。それとは対照的に、本発明はさらに、１つのロウから別のロウへ転送でき明確に定義された状態を各ロウ（ステージ）ごとに有する。１つのロウから別のロウへこのようなプロセッサ状の状態を交換する他にさらに、本発明による装置の異なるカラム間で状態（または状態状の）情報を交換することもできる。このことが、公知のプロセッサと明確に異なる点である。
【００３９】
並列接続および／またはスイッチングおよび／または並列化されたオペランドによって、残りのデータパスとりわけＡＬＵデータパスの演算を実行することができる。したがって、データ処理を命令レベルで並列化し、命令レベルの並列性（ＩＬＰ）を活用することができる。
【００４０】
レジスタアクセス
ＡＬＵ構成体０１３０に含まれる各ＡＬＵは、本発明の有利な実施形態では各マルチプレクサ／レジスタステージ０１０５，０１０６，０１０７を介して、プロセッサレジスタ０１０９の任意のレジスタをオペランドレジスタ０１４０として選択することができる。各ＡＬＵステージの演算および／または計算の結果０１４１，０１４２，０１４３，０１４４は各後続のステージへ送信され、各後続のステージのマルチプレクサ／レジスタステージ０１０５，０１０６，０１０７によってオペランドとして選択される。この各後続のステージは通常の場合には、直接後続するステージおよび／またはこの後の１つまたは複数のステージである。上記のものは状態情報を保持し、これは直接後続するステージへ送信され、かつ／またはさらに下流の１つまたは複数のステージへ送信される。
【００４１】
マルチプレクサステージ０１１１はバスシステム０１４５を介して接続され、実行すべき命令による演算／計算０１４１，０１４２，０１４３，０１４４の結果を、プロセッサレジスタ０１０９に書き込むために転送するのに使用される。
【００４２】
複数の並列ＡＬＵパスにおけるＡＬＵの非同期の連結のインプリメンテーション
上記の実施形態では、次の欠点が残されている。ＡＬＵステージパスはとりわけＣＡＢＡＣ等のアルゴリズムでは、完全にパイプラインを使用せずに最大パフォーマンスに達するまで動作しなければならない。その理由は、このようにした場合にのみ、すべてのＡＬＵステージが各クロックサイクルごとに演算を実効的に実行できる事実に拠る。ここでは、計算演算が相互に時間的に線形（連続的）に依存するため、新たな演算は最後のパイプラインステージの結果が得られた後にのみ開始できるという事実により、パイプラインは利点を有さない。したがって、ＡＬＵステージのうち大部分は常に空実行することになる。それゆえ、ＡＬＵステージを非同期接続するのが有利である。従来技術によるトランジスタ幾何的構成に基づけば、このことは問題ではない。それは、本発明によるＡＬＵステージ内の個々のＡＬＵは有利な実施形態ではＡＤＤ，ＳＵＢ，ＡＮＤ，ＯＲ，ＸＯＲ，ＳＬ，ＳＲおよびＣＭＰ等の高速かつ簡単なコマンドのみを有するという事実に拠るからであり、数百ＭＨｚの複数のＡＬＵステージを非同期結合することができ、たとえば４つのＡＬＵステージを非同期結合することができる。
【００４３】
しかし、ＡＬＵステージ構成体内の符号に分岐することで、タイミング上の問題が生じることがある。というのも、相応のＡＬＵは実行時に命令を非同期で変更することがあり、実行時間の増大に繋がるからである。
【００４４】
ここで、有利な実施形態ではＡＬＵステージ構成体内のＡＬＵが非常に簡略的に構成されているという事実に拠れば、複数のＡＬＵステージをインプリメントし、各ＡＬＵステージを可能な分岐のうち１つでは固定的に構築することができる。
【００４５】
図４は、ＡＬＵステージ構成体０４０１（上記の実施形態における０１０１〜０１０４に相応する）が多重化によって２重化され、０４０２＝｛０１０１ａ〜０１０４ａ｝から０４０３＝｛０１０１ｚｚ〜０１０４ｚｚ｝までのｚｚ‐ＡＬＵステージ構成体の分岐のためにインプリメントされている相応の構成体を示す。各ＡＬＵステージ構成体０４０１〜０４０３では演算は、実行中は変更されないオペコードの固有の命令によって定義される。このような命令は、各個別のＡＬＵに対する各オペランドの固有のＡＬＵコマンドおよびソースと、いずれかのＡＬＵのターゲットレジスタとを含む。レジスタセットは、レジスタおよび／またはスタックマシンのプロセッサモデルと両立するように定義できることに留意されたい。状態信号は１つのＡＬＵステージから最も隣のＡＬＵステージへ転送される０４１２。このようにして、１つのＡＬＵロウ０４０４，０４０５，０４０６，０４０７へ入力された状態信号は、１つのロウにある相応のアクティブ状態の（複数の）ＡＬＵを選択することができ、選択されたＡＬＵはその後、（複数の）状態信号を後続のロウに伝搬する。ＡＬＵロウ内で入力された状態信号０４１２に依存してＡＬＵをアクティブ化することにより、パイプライン化のためのアクティブ状態のＡＬＵの連結が実現され、グリッド／網内で実際に実行すべきジャンプの「仮想的な」パスが形成される。各ＡＬＵはバスシステム０４０８（図４参照）を介して、（バス０４１１を介して）レジスタセットにアクセスし、また上流のＡＬＵロウにあるＡＬＵの結果にもアクセスする。（図４では、幾つかの要素で参照符号の使い方が、図１で使用される参照符号と異なることに留意すべきである。たとえば０４０８は０１４０に相応し、０４０９は０１１１に相応し、０４１０は０１４５に相応する。別の図対でも同じような違いが存在することがある。）ＡＬＵ内の完全な処理と、データ信号および状態信号の送信とは、非同期で実行される。ＡＬＵステージの出力端において幾つかのマルチプレクサ０４０９は、入力された状態信号０４１３に依存して、仮想的に実行されたジャンプにしたがって実際に供給してデータレジスタ（０４１０）に書き込むべき結果を選択する。第１のＡＬＵロウ０４０４は状態信号０４１４を、プロセッサの状態レジスタから受け取る。ＡＬＵロウ内で生成された状態信号は、上記のように「仮想」パスの状態に相応し、ひいてはジャンプ先であり実際に経由されるデータパスに相応し、０４１３を介してプロセッサの状態レジスタ０９２０にライトバックされる。
【００４６】
このようなＡＬＵインプリメンテーションの特別な利点は、ＡＬＵステージ構成体０４０１，０４０２，０４０３が分岐の択一的経路として動作するだけでなく、命令レベルの並列性（ＩＬＰ）で命令の並列処理を行うためにも使用することができ、１つのＡＬＵロウの幾つかのＡＬＵはオペランドを同時に処理し、これらはすべて、後続のロウのうち１つで使用され、かつ／またはレジスタに書き込まれることである。図６に、ＡＬＵユニットに対するプログラムポインタの制御回路の可能なインプリメンテーションが示されている。この実施形態の詳細を以下で説明する。
【００４７】
ロード‐記憶
本発明による技術の有利な実施形態では、０１３１は有利には「副次的ＡＬＵ」と称されるのではなく副次的Ｌ／Ｓ（ロード／記憶）ユニットと称されるにもかかわらず、ロード／記憶プロセッサは副次的要素に組み込まれている。ここでは、たとえば０１３１を参照されたい。このようなユニットにより、メモリに並列および独立してアクセスすることが可能になる。とりわけ、異なるメモリおよび／またはメモリ部分および／またはメモリ階層構造にアクセスするように複数の副次的Ｌ／Ｓユニットを構成することができる。たとえば、内部のルックアップテーブルに高速アクセスし、かつ外部メモリアクセスを行うために、Ｌ／Ｓユニットを構成することができる。（複数の）Ｌ／Ｓユニットは副次的ユニットとしてインプリメントする必要はなく、当分野で公知であるようにプロセッサ内部に組み込むことが可能であることを明示的に述べておく。ルックアップテーブルに最適にアクセスするためには、有利には、次のような付加的なロード‐記憶コマンドを使用する（ＭＣＯＰＹ）。すなわち、第１のサイクルにおいてロードアクセスでデータ語をメモリにロードし、第２のサイクルにおいてデータ語の記憶アクセスを使用して、メモリ内の別の位置に書き込むロード‐記憶コマンドを使用する。このようなコマンドはとりわけ、たとえばメモリがマルチポートインタフェースを有するプロセッサに接続されており、たとえばデュアルポートインタフェースまたは２ポートインタフェースを使用するプロセッサに接続されており、メモリに読み出しと書き込みとを同時に行うことができる場合に有利である。このことにより、ＭＣＯＰＹ命令に続く次のサイクルで新たなロード命令を直接実行することができる。ロード命令は、ＭＣＯＰＹの記憶アクセス中に同じメモリに並列してアクセスする。
【００４８】
ＸＭＰプロセッサ
図５は、ＸＭＰプロセッサモジュールの全体的構成を示す。コアにはＡＬＵステージ構成体０１３０が設けられており、このＡＬＵステージ構成体０１３０は相互間で、必要な場合には、図４に示された有利な実施形態で開示されているように、データパス矢印０５０１によって示されたようにデータ交換することができる。これに並列して、副次的ＡＬＵ０１３１およびロード／記憶ユニット０５０２が設けられている。ここでも、メモリおよび／またはルックアップテーブル０５０３に並列にアクセスするように複数のロード／記憶ユニットをインプリメントすることができる。データ処理ユニット０１３０および０１３１とロード／記憶ユニット０５０２にはレジスタ０１０９からバスシステム０１４０を介してデータ（および状態情報）がロードされる。結果はバスシステム０１４５を介して０１０９にライトバックされる。
【００４９】
これに並列して、オペコードフェッチャ０５１０が設けられており、並列動作して、次に続く各オペコードをロードする。有利には、複数の可能な後続のオペコードが並列でロードされる。このことにより、ターゲットオペコードをロードするための時間損失はなくなる。オペコードの並列ロードを簡略化するために、オペコードフェッチャは複数の符号メモリ０５１１に並列アクセスすることができる。
【００５０】
ＸＰＰプロセッサへの簡略的かつ高パフォーマンスな組み込み、および／または、複数のＸＭＰおよび／または複数のＸＭＰおよびＸＰＰの結合を実現するためには、特定のレジスタＰ０５２０がインプリメントされる。このレジスタは、ＸＰＰとＸＭＰとへの入出力ポート０５２１として機能する。このポートは、ＸＰＰまたは別のＸＭＰ上でインプリメントされるプロトコルに一致し、かつ／または、このようなプロトコルを翻訳する。とりわけ、ＰＣＴ／ＥＰ０３／０９９５７（ＰＡＣＴ３４／ＰＣＴａｃ）、ＰＣＴ／ＤＥ０３００４８９（ＰＡＣＴ１６／ＰＣＴＤ）、ＰＣＴ／ＥＰ０２／０２４０３（ＰＡＣＴ１８／ＰＣＴＥ）、ＰＣＴ／ＤＥ９７／０２９４９（ＰＡＣＴ０２／ＰＣＴ）に記載されたようなＲＤＹ／ＡＣＫハンドシェイクプロトコルを参照されたい。
【００５１】
外部ソースからのデータ入力はＲＤＹフラグによって、レジスタでＶＡＬＩＤフラグをセットするＰに書き込まれる。このような相応のレジスタに読み出しアクセスを行うことにより、ＶＡＬＩＤフラグはリセットされる。ＶＡＬＩＤがセットされていない場合にはこの実行は、レジスタにデータが書き込まれＶＡＬＩＤがセット完了されるまで、レジスタ読み出しアクセス中は停止する。レジスタが空である場合（ｎｏ ＶＡＬＩＤ）、外部書き込みアクセスがＡＣＫハンドシェイクによって直ちに指示される。レジスタが有効データを有する場合、外部書き込みされたデータは受け入れられず、レジスタがＸＭＰによって読み出し完了されるまでＡＣＫハンドシェイクは送信されない。出力されたレジスタの場合、新規のデータが書き込み完了されると常にＶＡＬＩＤおよびＲＤＹがセットされる。外部からＡＣＫが受け取られることにより、ＲＤＹおよびＶＡＬＩＤはリセットされる。ＡＣＫがセットされていない場合、外部からのデータがレジスタから読み出されてＶＡＬＩＤがリセットされるまで、次のレジスタ書き込みアクセスの実行は停止される。レジスタがフルである場合（ＶＡＬＩＤ）、ＲＤＹハンドシェイクが外部に伝送され、データが外部読み出し完了されてＡＣＫハンドシェイクによって指示完了されると直ちに該ＲＤＹハンドシェイクはリセットされる。ＲＤＹがセットされない限り、レジスタは外部から読み出すことができない。
【００５２】
上記ではレジスタに対して１つのステージのみを言及したが、多重的なレジスタステージを含むレジスタ、たとえばＦＩＦＯを含むレジスタをインプリメントすることができることも述べておく。使用可能なプロトコルのうち幾つかのプロトコルの説明に関しては、開示目的で、ＰＣＴ／ＤＥ９７／０２９４９（ＰＡＣＴ０２／ＰＣＴ）、ＰＣＴ／ＤＥ０３／００４８９（ＰＡＣＴ１６／ＰＣＴＤ）、ＰＣＴ／ＥＰ０２／０２４０３（ＰＡＣＴ１８／ＰＣＴＥ）を引用する。
【００５３】
フェッチユニット
図６は、オペコードフェッチユニットのインプリメンテーションを示す。プログラムポインタ０６０１は、現在実行中のサイクルの相応のオペコードをポインティングする。１つのオペコード命令で、次のオペコードへ複数のジャンプを行うことができる。ジャンプは幾つかの種類に区別される。
【００５４】
ａ）ＣＯＮＴはプログラムポインタに関し、次に実行すべきオペコードをポインティングし、データ処理に並列してロードされる。ＣＯＮＴの処理は、ＡＬＵデータ処理に対して並列に行われるプログラムポインタの増分と、従来技術による従来のプロセッサの次のオペコードのロードとに相応する。したがって、ＣＯＮＴは実行のために付加的なサイクルを必要としない。
【００５５】
ｂ）ＪＭＰはプログラムポインタに関し、ジャンプ先であり次に実行すべきオペコードをポインティングする。従来技術のＪＭＰによれば、プログラムポインタは再計算され、次のサイクル（ｔ＋１）において新規のオペコードがロードされ、これはサイクル（ｔ＋２）で実行される。したがって、ＪＭＰの処理中に１つのデータ処理サイクルが損失される。
【００５６】
プログラムコードの線形処理中に、ＣＯＮＴ命令は、パラメータ「one」が送信されることによって実行される。このことは、プログラムポインタの慣用のインプリメンテーションに相応する。付加的に、転送されるこのパラメータを「one」と異なるパラメータとし、このパラメータをプログラムポインタに足すことによって相対的なジャンプを行うこともできる。このジャンプは、パラメータの正負符号に依存して順方向または逆方向に行うことができる。ＡＬＵデータ処理中に、ジャンプは計算および実行される。複数のＣＯＮＴ分岐をインプリメントし、実行サイクルを緩和することなく複数のジャンプターゲットをサポートすることができる。２つのＣＯＮＴ分岐０６０２，０６０３が図示されており、一方のＣＯＮＴ分岐はたとえばパラメータ「one」を有し、すぐ後に続く命令をポインティングする。他方の第２のＣＯＮＴ分岐はたとえば−１４とされ、メモリ位置１４個分だけ戻る位置に記憶されたオペコードにジャンプする機能を有する。
【００５７】
複数のＣＯＮＴパラメータ、たとえば２つのＣＯＮＴパラメータを（カウント０６０４，０６０５によって得られるような）プログラムポインタと組み合わせて、次の可能なオペコードを複数の符号メモリから、たとえば２つの符号メモリ０６０６，０６０７から読み出すことができる。ＡＬＵデータ処理の最後に、実際に実行すべきオペコード０６１３が状態信号に応答して選択される。すなわち、ジャンプターゲットは処理の終了時に「仮想」パスを使用して選択される。すべての可能なオペコードは事前にすでにロードされている事実に起因して、データ処理はすぐ次のサイクルで続行することができる。
【００５８】
幾つかのオペコードを並列ロードするために符号メモリへのメモリアクセスを並列して実行しなければならず、かつ／または多重的および／またはマルチポート形式のメモリを使用しなければならない事実を鑑みれば、ＣＯＮＴの実行は比較的高コストである。
【００５９】
それとは対照的に、ＪＭＰは従来技術に相応する。ＪＭＰの場合、相対的なパラメータ０６０８，０６０９がプログラムポインタと組み合わされ、プログラムポインタはマルチプレクサ０６１２を使用する。次のクロックサイクル（cycle + 1）において、符号メモリ０６０７，０６０８はプログラムポインタを介してアドレス指定される。次のオペコードへのジャンプが実行されて応答し、次のオペコードは次のサイクル（cycle +2）で実行される。したがって、１つの処理サイクルが損失されるにもかかわらず、付加的なコストは必要ない。
【００６０】
コスト効率とパフォーマンスとの組み合わせを最適化するためには、ＸＭＰは両手法をインプリメントする。１つの複雑なオペコードでは、ＣＯＮＴを使用する付加的な遅延サイクル無しで、後続の演算のセットに直接ジャンプすることができる。複雑なオペコード内で付加的なジャンプを使用する場合、ＪＭＰを使用することができる。
【００６１】
さらに、ＣＡＬＬを実行する特定の手法が存在する。基本的にＣＡＬＬは、従来技術に相応して、外部スタックを使用してインプリメントすることができる。この外部スタックは、図６には示されていない。しかしここでは、最小戻りアドレススタックをフェッチユニットにインプリメントする任意および／または付加的な手法が示されている。このスタックはレジスタのセット０６２０から構成されており、このレジスタのセット０６２０には、プログラムポインタが次にポインティングするアドレスが書き込まれる０６２３。１つの実施形態では、スタックポインタはアップダウンカウンタ０６２１としてインプリメントされ、スタックの現在の書き込み位置をポインティングし、値（pointer + 1）０６２２は現在の読み出し位置をポインティングする。デマルチプレクサ０６２５，０６２３を使用して、スタックからの読み出しのためにマルチプレクサ０６２４を使用するレジスタ０６２０に次のプログラムポインタアドレスが書き込まれる。小さいレジスタスタックを使用して、メモリスタックアクセスを必要とせずに、レジスタ０６２０の数によって決定された複数のＣＡＬＬ‐ＲＥＴジャンプを実行することができる。このようにして、小さいプロセッサにおいてスタックのインプリメントを行う必要はなく、それと同時に、通常のスタックアクセスより高パフォーマンス‐高効率のアクセスが実現される。
【００６２】
通常はスタックレジスタを、目標であるターゲットアプリケーションによって保存する必要はなく、また、このようなターゲットアプリケーションのために保存する必要はない。たとえばＣＡＢＡＣを参照されたい。しかしそうしなければならない場合には、特定の数のレジスタを２重化してジャンプ後に切り換え、かつ／またはオプションとしてスタックをインプリメントすることができる。これは有利には、絶対に必要であり、かつそれに付随する内在的なパフォーマンス損失が受け入れられる場合にのみ使用される。
【００６３】
一例として挙げられたインプリメンテーションでは、２つのＣＯＮＴおよび２つのＪＭＰが設けられる。しかしその数はインプリメンテーションにのみ依存し、０〜ｎの間で任意に変更することができ、とりわけＣＯＮＴとＪＭＰとで異なることができることを明示的に述べておく。
【００６４】
図７は、複数のＸＭＰの相互接続と、ＸＰＰとの結合とを示す。
【００６５】
図７ａでは、複数のＸＭＰ（０７０１）がＰレジスタおよびポート０５２１を介して相互に接続されている。有利には、実行時に構築可能なバスシステム、たとえばＸＰＰで使用されるバスシステム等が使用される。このことによりＰのすべてのレジスタが、有利である場合にはバスシステムを介して独立的に接続される。この点ではレジスタＰは、たとえばＰＣＴ／ＤＥ９７／０２９４９（ＰＡＣＴ０２／ＰＣＴ）、ＰＣＴ／ＤＥ９８／００４５６（ＰＡＣＴ０７／ＰＣＴ）、ＰＣＴ／ＤＥ０３／００４８９（ＰＡＣＴ１６／ＰＣＴＤ）、ＰＣＴ／ＥＰ０１／１１５９３（ＰＡＣＴ２２ａII／ＰＣＴＥ）およびＰＣＴ／ＥＰ０３／０９９５７（ＰＡＣＴ３４／ＰＣＴａｃ）に記載されたようなＸＰＰ技術の複数の入出力レジスタから成る構成体に相応する。
【００６６】
図７ｂおよび図７ｃは、ＸＭＰ０７０１とＸＰＰプロセッサとの可能な結合を示している。ここではＸＭＰおよびＸＰＰプロセッサは、ＡＬＵ‐ＰＡＥ０７０２のアレイと、複数のＲＡＭ‐ＰＡＥ０７０３とを有するのが図示されており、これは構築可能なバスシステム０７０４を介して相互に接続されている。図７ａに示されているように、ここに開示されたＸＭＰは、１つの実施形態ではバスシステム０７０４を介して接続されている。
【００６７】
基本的にＸＭＰプロセッサは、ＡＬＵ‐ＰＡＥ、ＳＥＱ‐ＰＡＥと全く同じように、および／またはＳＥＱ‐ＰＡＥの代わりにＸＰＰのアレイに組み込むことができ、とりわけ、ＰＣＴ／ＥＰ０３／０９９５７（ＰＡＣＴ３４／ＰＣＴａｃ）に記載のＸＰＰに組み込むことができ、また、別の何らかのＰＡＥを組み込む手法で組み込むこともできる。
【００６８】
プログラミング例
後続の符号例は、以下のパラメータを有するＸＭＰプロセッサに対して設けられる：
・レジスタセットＰ
・レジスタセットＰ：１６個のレジスタ
・４つのＡＬＵステージ（０４０４，０４０５，０４０６，０４０７）
・２つの並列ＡＬＵパス（０４０１および０４０２）
・１つの副次的ＡＬＵ：乗算器
・１つのロード‐記憶ユニット
・２つの並列符号ＲＡＭ
・演算ごとに２つのＣＯＮＴジャンプ
（たとえばＨＰＣおよびＬＰＣ。添付書類を参照されたい）
・演算ごとに２つのＪＭＰジャンプ
最良な公知技術によるビデオコーデックは、エントロピー符号化にＣＡＢＡＣアルゴリズムを使用する。ＣＡＢＡＣ内で最も重要なルーティンを以下で、３アドレスアセンブラコードとして示す：
LOAD state, *stateptr                 ; RangeLPS = ...
SHR range2, range, #14
AND range2, range2, #3
SHL state2, state, #2
OR adr1, state2, range2
ADD adr1, adr1, Ipsrangeptr
LOAD rangelps, *adr1
SUB range, range, rangelps           ; range -= ...
AND bit, state, #1             ; bit = (*state) & 1
CMP low, range                     ; if (low < range)
JMP GE L1                         ; jump if previous condition met
ADD state3, mpsstateptr, state  ; *state = mps_state[*state]
LOAD state4, *state3
STORE stateptr, state4
JMP L2
L1:  XOR bit2,bit,#1
SUB low, low, range
MOV range, rangelps
ADD state3, Ipsstateptr, state   ; *state = lps_state[*state]
LOAD state4, *state3
STORE stateptr, state4
L2:  CMP range, 0x10000          ; renorm_cabac_decoder function
JMP GE L3                   ; while-loop exit condition
SHL range, range, #2
SHL low, low, #2
SUB bitsleft, bitsleft, #1        ; --bits_left
JMP NZ L2                          ; jump if not zero
CMP bytestreamptr, bytestreamendptr
JMP GE L4
LOAD byte, *bytestreamptr
ADD low, low, byte            ; low += *bytestream
L4:  ADD bytestreamptr, bytestreamptr, #1
MOV bitsleft, #8
JMP L2
L3:
このルーティンは、３４個のアセンブラオペコードと、それに相応して少なくとも同数の処理サイクルとを有する。さらに付加的に、ジャンプは通常２つのサイクルを使用し、付加的なサイクルが必要となるパイプライン停止を引き起こす可能性があることを考慮しなければならない。
【００６９】
次に、ルーティンは再符号化されることにより、ＸＭＰプロセッサを使用して実行できるようにされる。このＸＭＰプロセッサは、有利な実施形態では４つのＡＬＵステージを有し、ＡＬＵステージ間にパイプラインを有さない。さらに、２つの並列するＡＬＵステージ部分がインプリメントされ、第２の部分は、明示的なジャンプオペコードを必要とせず、またはパイプライン停止のリスクを負わずに、オペコード暗示ジャンプを実行するようにインプリメントされる。ＡＬＵパス内、すなわち共通して両ＡＬＵストリップパス内では、暗示的条件付きジャンプを実行することができる。オペコードの処理中、可能な２つの次のオペコードが並列してロードされ、実行終了時には、付加的なサイクルを必要とせずに、ジャンプ先のオペコードが選択される。さらに、この有利な実施形態のプロセッサは、ＡＬＵステージパスに対して並列しており該ＡＬＵステージパスに対して並列実行するロード／記憶ユニットを有する。
【００７０】
図８に、異なる要素の構成が示されている。０８０１はメインＡＬＵステージパスを示しており、０８０２は分岐の場合に実行されるＡＬＵステージパスを示す。０８０３はロード／記憶ユニットの処理を含んでおり、１つのロード／記憶演算が４つのＡＬＵステージ演算に対して（すなわち、１つのＡＬＵステージサイクル中に）実行される。
【００７１】
ここで示された枠（０８１０，０８１１，０８１２，０８１３，０８１４，０８１５，０８１６，０８１７，０８１８）に相応して、４つのＡＬＵステージ命令がクロックサイクルごとに１つのオペコードを構成する。オペコードは両ＡＬＵステージ（４つの命令＋それぞれのジャンプターゲット）とロード／記憶命令とを有する。
【００７２】
０８１１では、０８０１および０８０２において最初の命令が並列して実行され、その結果は次にデータパス０８０１で処理される。
【００７３】
０８１４では０８０１または０８０２のいずれかが実行される。
【００７４】
０８１６では、ＣＯＮＴ ＮＺ Ｌ２を使用してＳＵＢの次に実行停止が行われるか、またはＣＭＰを使用して実行が続行される。ＣＭＰの結果に依存して、実行はＣＯＮＴ ＧＥ Ｌ４またはＣＯＮＴ ＬＴ Ｌ４／を使用して続行される。この例では、オペコード内の３つのＣＯＮＴが見られるが、このことはこの例の実施形態では許容されないことに留意されたい。ここでは、ＣＯＮＴはＪＭＰに置換しなければならない。
【００７５】
ＭＣＯＰＹ０８１５はメモリ位置 *state3 を *stateprt にコピーし、実行サイクル０８１５中に state3 からデータを読み出す。０８１６ではデータが *stateptr に書き込まれ、それと同時に、０８１６においてＬＯＡＤを使用してメモリへの読み出しアクセスがすでに実行される。
【００７６】
ルーティンへジャンプするためには、呼び出し側（呼び出しルーティン）がＬＯＡＤ０８０４を実行する。したがってルーティンへのジャンプ時には、呼び出しルーティンは、次の最初のサイクルでＭＣＯＰＹによって書き込むためにメモリへのアクセスを担当する必要がない。
【００７７】
ＣＯＮＴ命令は、次に実行すべきオペコードのアドレスをポインティングする。有利には、これはアセンブラによって翻訳される。このことにより、これは明示的な命令として現れるのではなく、単に、プログラムポインタのオフセットに対して相対的なジャンプターゲットを足すだけにされる。
【００７８】
相応のアセンブラプログラムは、以下に挙げられたようにプログラミングすることができる：オペコードの記述には３つの｛ ｝括弧が使用され、第１の括弧は４つの命令とメインＡＬＵステージパスの相対的なプログラムポインタターゲットとを囲んでおり、第２の括弧は相応の分岐ＡＬＵステージパスを囲んでおり、第３の括弧はロード／記憶ユニットに対するオペコードを決定する。
アセンブラコード構成：
L:     {
main-ALU-stages instructions (4)
jump to next OpCode
}
L/: {
branching-ALU-stages instructions (4)
jump to next OpCode
}
{
load-store instruction (1)
}
４つのＡＬＵステージ命令の実行中に１つのロード‐記憶命令だけが実行される。これは、レイテンシーとプロセッサコアの外部アクセスとに起因して、より長い実行時間が必要とされるからである。メインＡＬＵステージブロックおよび分岐ＡＬＵステージブロックの各括弧ごとに、従来技術で公知であるようにジャンプターゲットを指定してラベルを定義することができる。たとえば、ここに示されているような L: および L/: は、逆のジャンプターゲットに対して使用される。
【００７９】
実行すべき次のオペコードが、プログラミングポインタ＋１（ＰＰ＋＋）によってアドレス指定すべきオペコードである限りは、次の命令（ＣＯＮＴ）へジャンプする必要はない。
【００８０】
さらに、ＮＯＰを「埋める」必要もない。
{
SHR range2, range, #14
AND range2, range2, #3
}{
}{
LOAD state, *stateptr
}
{
SHL state2, state, #2
OR adr1, state2, range2
ADD adr1, adr1, Ipsrangeptr
}{
}{
}
{
}{
}{
LOAD rangelps, *adr1
}{
SUB range, range, rangelps
AND bit, state, #1
CMP low, range
CONT GE L1
}{
CONT LT L1/
}{
}
L1/: {
ADD state3, mpsstateptr, state
CONT next
L1: }{
XOR bit2, bit, #1
SUB low, low, range
MOV range, rangelps
ADD state3, Ipsstateptr, state
}{
}
L2: {
CMP range,0x10000
CONT GE Next
L2/: }{
CONT L3(C)
}{
MCOPY *stateptr, *state3
}
{
SHL range, range, #2
SHL low, low, #2
SUB bitsleft, bitsleft, #1
CONT Z next
}{
CONT NZ L2
}{
; RESERVED (MCOPY)
}
{
CMP bytestreamptr, bytestreamendptr
CONT GE L4
}{
CONT LT L4/
}{
LOAD byte, *bytestreamptr
}
L4/: {
ADD low, low, byte
ADD bytestreamptr, bytestreamptr, #1
MOV bitsleft, #8
CONT L2
}{
ADD bytestreamptr, bytestreamptr, #1
MOV bitsleft, #8
CONT L2
}{
}
L3:
最適なインプリメンテーション
図９は、本発明によるデータパスの構成の詳細を示す。ここでは、上記で言及したが簡略化のために図１〜４で示されなかった多くの詳細が含まれている。２つのＡＬＵストリップパスに並列して、２つの特別なユニット０１０１ｘｙｚ，０１０３ｘｙｚが各ストリップごとにインプリメントされており、ＡＬＵパス０１０１．．４ｂの代わりに演算する。これらの特別なユニットは、より複雑かつ／またはより長い実行時間を必要とする演算、すなわち、２つのＡＬＵステージの実行時間中に実行される演算を含むことができ、本発明において異なるインプリメントを行うべき場合かつ／または行いたい場合には、それより多くのＡＬＵステージの実行時間中に実行される演算を含むことができる。図９の実施形態では、たとえば１つのサイクルでカウントリーディングゼロ（count-leading-zero）ＤＳＰ命令を実行するために特別なユニットが適合されている。特別なユニットには、たとえばＲＡＭ、ＲＯＭおよびＬＵＴ等のメモリと、ＦＰＧＡ回路および／または周辺機能の任意の種類、および／またはアクセラレータＡＳＩＣ機能が含まれる。副次的ユニットまたはＡＬＵ‐ＰＡＥまたはＡＬＵチェーンの一部として使用できる別のユニットが、添付書類２に開示されている。
【００８１】
さらに付加的なマルチプレクサステージ０９１０が、複数のレジスタ０１０９から、クロックサイクルごとに後続のデータ処理で使用すべきレジスタを選択し、これを０１４０に接続する。このことによりレジスタ０１０９の数は、バス０１４０を拡張することなく、またマルチプレクサ０１１０，０１０５．．．０１０７の複雑性およびレイテンシーを上昇させることなく、格段に増大することができる。状態レジスタ０９２０および制御パス０４１４，０４１２，０４１３も図示されている。制御ユニット０９２１は、入力された状態信号を検査する。この制御ユニット０９２１は、演算に応答して有効なデータパスを選択し、ＡＬＵパスにおける状態にしたがって符号フェッチャ（ＣＯＮＴ）およびジャンプ（ＪＭＰ）を制御する。
【００８２】
このようなユニットのインプリメントにより、データバスの信号遅延および電力散逸の観点から見ると、マルチプレクサ０１１０の後に単一のドライバステージを使用する代わりに、またはドライバのツリー構造をインプリメントする代わりに、ドライバステージのチェーンを使用し、有利にはＡＬＵに対して並列に該チェーンを構築することにより、レジスタからの信号が増幅されるように構成するのが有利であることが実証されている。ＡＬＵに対して並列にドライバをインプリメントすることにより、より小型かつより高エネルギー効率のドライバを使用することができる（０９３１，０９３２，０９３３，０９３４）。このようなドライバの大きな遅延は許容範囲内である。というのも、非常にエネルギー効率が高いために非常に低速の構成のドライバでさえ、バッファされた信号は、ドライバに対して並列のＡＬＵを介して下流のＡＬＵへ信号が転送されるよりも高速に、下流のＡＬＵへ転送されるからである。ドライバは、データレジスタ０１０９の信号および各先行のＡＬＵステージの信号の双方を増幅する。これらのドライバは重要とは見なされず単なるオプションであることを理解すべきである。
【００８３】
このようなユニットのインプリメントでは、マルチプレクサステージ０１０５，０１０６，０１０７にオプションとして設けられたレジスタは使用されず、すべての信号がＡＬＵパスの全ゲートを非同期で通過する場合、別の問題が生じる。したがって、論理ゲートを連続的に導通切り換えすることにより、情報を全く有さない有意な量の信号エラーおよびハザードが引き起こされる。このことにより有意な量の不所望のノイズが生成され、また、ゲートを再チャージするために大量のエネルギーが必要になる。この作用は、クロックユニットによって制御され遅延チェーン０９４１，０９４３，０９４４に送られる処理の開始時に信号０９４０を生成することによって抑圧することができる。遅延要素０９４１．．．０９４４は、各ＡＬＵステージの最大遅延時間で信号を遅延するように構成されている。各遅延ステージの後、これによって遅延された信号は、相応のマルチプレクサユニット０１０５〜０１０７のステージに伝搬され、ここでＥＮＡＢＬＥ信号として機能し、入力データの伝搬をイネーブルする。ＥＮＡＢＬＥがセットされていない場合、マルチプレクサはパッシブであり、入力された信号を伝搬しない。ＥＮＡＢＬＥ信号がセットされている場合のみ、入力された信号は伝搬される。これは、信号エラーおよびハザードを十分に抑圧する。というのもマルチプレクサステージは、このコンテクストではレジスタステージ機能を有すると見なされるからである。このようなハザード／信号エラー低減は重要とされず、単なるオプションであることを理解すべきである。
【００８４】
エネルギー消費が重要である場合、マルチプレクサステージの出力側にラッチを設け、このラッチは、データ移行をイネーブルするＥＮＡＢＬＥ信号によって透過状態にセットされ、ＥＮＡＢＬＥがセットされない場合には先行の内容を保持することに留意されたい。このことは、下流のゲートの（再）チャージ動作を有意に低減する。
【００８５】
ジャンプ演算およびコンフィギュラブルＡＬＵパスの最適化
回路および／または回路システムおよび／またはこれらとともに構成されたＩ／Ｏのクロック周波数が比較的低いことにより、多重符号メモリを１つに低減できる別の最適化を実現することができる。ここでは、複数の符号メモリアクセスが１つのＡＬＵステージサイクル内で実行され、ここでは、ここに記載された異なるプログラムポインタへの複数の命令フェッチアクセスが連続的に実行される。ＡＬＵステージクロックサイクル内でｎ個の命令フェッチアクセスを実行するためには、符号メモリインタフェースをＡＬＵステージクロック周波数のｎ倍で動作させる。
【００８６】
ＡＬＵパスが完全にプログラマブルである場合、非常に大きな命令語をロードしなければならないという欠点が存在することを考慮しなければならない。それと同時に、上記のように、ジャンプおよび分岐を高速で、かつクロックサイクルの損失なしで実行するのが有利である。このことにより、ハードウェアの複雑性がより高くなることにもなる。
【００８７】
ジャンプの頻度は、チップ／プロセッサ全体の構成において同様に組み込まれたＡＬＵユニット０１３０および０１３１に並列して新規のコンフィギュラブルＡＬＵユニット０１３２をインプリメントすることにより、低減することができる。このようなユニットは一般的には、０１３０のＡＬＵステージと可能な限り同じであるＡＬＵステージを有する。しかし、新規のＡＬＵユニット０１３２におけるＡＬＵステージの関数および相互接続は、サイクルごとにロードされた命令によって決定されるのではなく構築されるという基本的な相違点が存在する。すなわち、関数および／または接続／相互接続は１つまたは複数の命令語によって決定することができ、１つまたは複数の新規の命令語がコンフィギュレーションを変更するまで、複数のクロックサイクルにわたって同じに維持される。１つまたは複数のＡＬＵステージパスは０１３２においてインプリメントすることによって複数のコンフィギュラブルパスが形成されることに留意すべきである。また、１つのストリップ内で、命令ロードされたＡＬＵもコンフィギュラブルエレメントも双方使用することも可能である。
【００８８】
特定のジャンプ命令を有するジャンプ、またはたとえば除外アドレスによって表されるジャンプを使用する際には、プログラム実行を０１３２内のＡＬＵステージのうち１つ（または複数）のＡＬＵステージへ転送し、該１つ（または複数）のＡＬＵステージはアクティブ化されてレジスタファイルからデータをロードし、データを処理してライトバックする。ここでは、レジスタソースおよびターゲットは事前構築されている。
【００８９】
ここでは、使用頻度が高いコアルーティンおよび／またはジャンプ先であるサブルーティンを１つまたは複数の事前構築および／またはコンフィギュラブルのＡＬＵステージに高速に構築することが可能である。たとえばＣＡＢＡＣアルゴリズムのコアは、事前構築されたＡＬＵステージのうち１つまたは複数のＡＬＵステージに構築し、クロックサイクルの損失なしで該コアにジャンプすることができる。このような場合、事前構築されたアルゴリズムを呼び出すための呼び出しコマンドまたはジャンプコマンド以外の、ＣＡＢＡＣ命令をロードするための演算は必要ない。それによって処理が加速化されると同時に、コマンドのロードが低減されることによる電力消費が低減される。
【００９０】
コンフィギュラブルＡＬＵステージをインプリメントするためには、このコンフィギュラブルＡＬＵステージを乗算し、かつ／または、コンフィギュレーションレジスタを単に乗算した後、該コンフィギュレーションレジスタのうち１つをアクティブ化の前に選択する。
【００９１】
構築可能なＡＬＵステージにおいてたとえば波形再構築等のデータ処理手法をインプリメントする手段に留意されたい（たとえばＰＣＴ／ＤＥ９９／００５０４＝ＰＡＣＴ１０ｂ／ＰＣＴ、ＰＣＴ／ＤＥ９９／００５０５＝ＰＡＣＴ１０ｃ／ＰＣＴ、ＰＣＴ／ＤＥ００／０１８６９＝ＰＡＣＴ１３／ＰＣＴを参照されたい）。
【００９２】
複数のコンフィギュラブルＡＬＵステージをインプリメントすることが特に高エネルギー効率であることが実証されていることを述べておく。さらに、（高速ジャンプを可能にするために）複数のオペコードを１つの実行サイクル中に並行ロードする必要はないので、相応のメモリインタフェースおよび符号メモリは格段に小型に構成することができ、このことによって、付加的にコンフィギュラブルＡＬＵステージを使用する代わりに面積全体を低減することができる。
【００９３】
ＣＡＢＡＣディスパッチャ例
ディスパッチャのインプリメントをより良好に理解できるようにするため、ディスパッチャのアセンブラコードを以下に挙げる：
init:      MOV range, #0x1fe
IBIT offset, #9
entry:    MOV cmd, p0
CMP cmd, 0x8000
CONT GE dispatch
CMP cmd, 276
CONT EQ terminate
decode:
dispatch:  CMP cmd, 0x8001
CONT EQ init
第１のＸＭＰインプリメンテーションを以下で説明する。ＪＭＰ命令は、従来技術のプロセッサで公知であるように、新規のオペコードをフェッチするために１つの付加的なクロックサイクルを必要とする明示的なジャンプ命令である。ＪＭＰ命令は有利には、パフォーマンスが比較的重要でないディスパッチャの分岐でジャンプが実行される分岐で使用される。
init:   {
MOV range, #01x1fe
IBIT offset, #9
}{
}{
}
entry:  {
MOV cmd, p0
CMP cmd, 0x8000
CONT GE dispatch
CMP cmd, 276
JMP EQ terminate
CONT decode
}{
}{
}
dispatch:  {
CMP cmd, 0x8001
CONT EQ init
CONT bypass
}{
}{
}
このルーティンは、ＸＭＰの条件付きパイプ機能を使用することによって最適化することができる。
init: {
MOV range, #01x1fe
IBIT offset, #9
}{
}{
}
entry: {
MOV cmd, p0
CMP cmd, 0x8000
CMP LT cmd, 276 ; Conditional-Pipe
JMP EQ terminate
CONT decode
}{
NOP
NOP
CMP cmd, 0x800 ; Conditional-Pipe
JMP EQ init
CONT bypass
}{
}
本発明の装置を使用および動作させるための手法は、数多く存在する。
【００９４】
図１０には、２倍精度の演算を実現するための構成が開示されている。この図では、１つのＡＬＵステージでの結果に由来する桁上げ信号が、反対側の次のロウのＡＬＵステージへ転送される。このことにより、比較的上位のＡＬＵは比較的下位のワード結果と、該結果の桁上げとの双方を計算し、比較的下位のＡＬＵステージは桁上げ情報を考慮して最上位のワードＭＳＷを計算する。たとえば、一方の側の比較的上位のステージＡＬＵではＡＤＤが計算され、反対側の半分のＡＬＵステージのうち次のＡＬＵステージではＡＤＤＣ（add-carry）が実施される。図１０に示されているように、典型的な実施形態では複数の２倍精度の演算を実行できることに留意されたい。たとえば、１つの実施形態において２つの１６ビットＡＬＵのステージが４つ設けられている場合、図１０に示された構成および接続を使用して、３つの３２ビット２倍精度演算を同時に実行することができる。残り２つのＡＬＵは別の演算に使用するか、または無演算を実行することができる。
【００９５】
図１１に、異なる符号命令を使用する択一的なインプリメンテーションが示されている。ここでは、比較的上位のＡＬＵステージは最下位ワードを計算し、その下位のＡＬＵステージは最上位ワードを計算する。ここでももちろん、桁上げ信号情報が考慮される。
【００９６】
また、２倍精度を実現するための前記思想を、２つより多くのカラムを有する構成にまで拡張できることに留意されたい。このコンテクストにおいて、通常の知識を有する者であれば、本発明の装置において２つのカラムを使用するのが有利であるが、この数に決して限定されないことは明示的に理解できる。さらに、２つより多くのロウおよび／またはカラムが設けられている場合には、本発明の原理を使用して３倍の精度またはｎ倍の精度を実行することも実現可能である。また典型的な実施形態では、桁上げ情報を後続のＡＬＵステージに使用できることにも留意されたい。したがって、本発明のＡＬＵ構成を変更する必要はない。
【００９７】
図１１の実施形態は、各ＡＬＵのフラグユニット間にいかなる付加的なハードウェア接続も必要としない。しかし図１０の実施形態では、ＣＡＲＲＹを転送するために付加的な接続線路が設けられる。
【００９８】
またこのようなデータ処理手法は、本発明の開示内容に見られる原理による状態伝搬に適合されたＶＬＩＷ状構造において非常に有利であり、かつ推奨されることも述べておく。オペランド処理結果および／または条件評価に関する状態情報を１つのＡＬＵから別のＡＬＵへ転送すること、たとえば同一のクロックサイクルおよび／または同一のロウで独立して演算できる１つのＡＬＵへ転送することは、ＶＬＩＷプロセッサを増強するのに有利であることに留意されたい。したがってこのこと自体、発明と見なされる。
【００９９】
ＣＡＲＲＹ情報を１つのステージから、同一のカラムまたは隣接するカラムのいずれかに存在する次のステージに転送することは、タイミングに関してクリティカルとはならない。というのも、ＣＡＲＲＹ情報は次のステージのＡＬＵに、該ＡＬＵに入力されるオペランドデータとほぼ同時点で到着するからである。したがって、ＣＡＲＲＹ信号等である状態情報を次のステージへ転送することと、同一のステージで隣接するＡＬＵの動作状態に関する情報を交換することとを組み合わせることは、タイミングに関していずれの場合にもクリティカルにはならず、有利な実施形態では許容される。とりわけ特に有利な実施形態では、所与のセルの動作状態に関する情報は同一のステージでは評価されないが次のステージでは評価される。このことにより、カラム間で状態情報を伝搬することは、該当する１つのステージでは行われず、かつ／または、行われるがそれだけではなく、下流の隣接する少なくとも１つの該当のカラムにも行われる。（このような実施形態の最大ピークパフォーマンスに関する効果は、当業者であれば明白である。）
有利な実施形態では構成を合成することにより、９０ｎｍシリコンプロセスでインプリメントされ約４５０ＭＨｚで動作できることが実証されていることを述べておく。このようなパフォーマンスを実現するためには、幾つかの基準を満たさなければならず、たとえば図１の０１１１のようなマルチプレクサを空間的および／またはたとえばオペコードフェッチャに関して分布しなければならない。図１４にこの有利な高パフォーマンスの実施形態が示されており、当業者であればこの実施形態の動作は理解できる。
【０１００】
このこととは無関係でありこのことに関する分割出願で請求できる対象と見なすことが可能である本発明および／または本発明に関する発明の完全な開示内容を、本発明を理解しやすくするために挙げたが、本願の開示内容の一部でもある添付書類に、本発明の１つの特別な実施形態の詳細が記載されている。この添付書類は、決して本発明の範囲を限定するためのものではないことに留意されたい。添付書類では必要事項が言及されており、かつ／または、択一的特徴は記載されていない。このことは単に、添付書類に開示されたある特定の実施形態に、通常の知識を有する者を混乱させずに開示できる別のインプリメンテーションが存在しないと見なされるということのみに拠ることは、容易に理解できる。すなわち、数多くの択一的構成および／または付加的特徴が存在し、有利でありかつ／または存在すると言及されていないかまたは記載されていない実体でもインプリメントすることが可能であり、このような記載はいかなるものも、文言上の記載であるか、または添付書類から解釈によって導き出せる記載であることは明らかである。
【０１０１】
しかし、以下の記載は添付書類に基づいて記載されている。
【０１０２】
添付書類では、ＸＰＰとＦＮＣ‐ＰＡＥとの相互接続が引用される。ここでも一般的には、ＦＮＣの相互接続および／または接続に任意のプロトコルを使用できること、すなわち、本発明のＸＭＰ発明の構成の有利な実施形態に任意のプロトコルを使用できることを述べておく。しかし当業者であれば、いずれかのデータフロープロトコルが特に有利であり、とりわけＲＤＹ／ＡＣＫ、ＲＤＹ／ＡＢＬＥ、ＣＲＥＤＩＴプロトコル、および／またはデータおよび状態および／または制御情報および／またはグループ情報をインターメッシュするプロトコル等のプロトコルを使用できることは理解できる。
【０１０３】
さらに、添付書類に記載されたアーキテクチャ概観に関しては、本発明の全般的な原理またはその一部を使用してＶＬＩＷプロセッサを変更することにより、パフォーマンスを上昇できることが記載されている。
【０１０４】
添付書類のパラグラフ２．６には、本発明の構成のオペコード構造が示されており、この構成は添付書類では「ＦＮＣ‐ＰＡＥ」および／または「ＸＭＰ」として指定されているが、このパラグラフに関しては、上記で言及されたＣＯＮＴコマンドは添付書類では、より理解しやすくなるようにＨＰＣおよびＬＰＣとして指定されている。
【０１０５】
添付書類のパラグラフ２．８．２．１に関しては、リンクレジスタを使用することがそれ自体で有利であり、本発明のマルチロウおよび／またはマルチカラム形式のＡＬＵ構成体もともに使用することが特に有利ではあるものの、これらをともに使用することだけが有利であるわけではない。次のようなプログラム構造、すなわち、まずリンクレジスタが呼び出され側のアドレスにセットされた後に、その後の命令でプログラムポインタが、リンクレジスタに予め記憶された値にセットされると同時に、リンクレジスタに呼び出されたサブルーティンの戻りアドレスが書き込まれるプログラム構造を使用することによって。その後、サブルーティンから戻るためにプログラムポインタをリンクレジスタの値に再びセットすることにより、サブルーティンのペナルティフリーの呼び出し‐戻りインプリメンテーションを実現することができる。このことは、すべての所与のプロセッサアーキテクチャに当てはまり、それ自体で発明と見なされる。
【０１０６】
さらにサブルーティンから戻る場合には、該サブルーティンの開始アドレスをポインティングするようにリンクレジスタをセットすることもできる。このことにより呼び出し側は、サブルーティンを１つのサイクルだけで再び呼び出すことができる。たとえば、サイクル（ｔ）でサブルーティンの最後のオペコードが実行された場合、サイクル（ｔ＋１）で呼び出し側は終了条件をチェックし、リンクレジスタが該呼び出し側自体をポインティングし戻すようにセットし、該リンクレジスタの現在の内容にジャンプする。これらはすべて、１つのオペコードひいては１つのサイクルで実行される。サイクル（ｔ＋２）でサブルーティンの第１のオペコードが実行される。
【０１０７】
ここで開示されている（付加的な）発明によるリンクレジスタを使用することにより、ネスティングされた呼び出しも、別のサブルーティンの呼び出し前に別の演算が実行されている間にバックグラウンドでリンクレジスタ内容をスタックにプッシュして、サブルーティンから呼び出された（必要な場合にはネスティングされた）（サブ）サブルーティンから戻った後にリンクレジスタ情報をスタックからポップすることによって、付加的な遅延無しで実現することができることも留意されたい。図１２に、その一例が示されている。
【０１０８】
「opposite path active（反対側パスがアクティブ）」条件と「opposite path inactive（反対側パスが非アクティブ）」（ＯＰＩ／ＯＰＡ）条件の使用を開示するこの例に関しては、以下の点に留意すべきである。
【０１０９】
まず、パラグラフ３．６．２の図７に示された実施形態ではＯＰＩ条件／ＯＰＡ条件は、反対側のパスにあり少なくとも１つのステージだけ下流に位置するＡＬＵステージへ伝搬される。このことにより、タイミング問題が生じないことが保証される。しかし通常の知識を有する者であれば、電力消費に関して有利である回路に適切な構成および／または十分に低いクロック周波数を使用することにより、ＯＰＩ／ＯＰＡ情報および／または別の状態情報を同一のステージ内で１つのカラム（Ｓ）から別のカラムへ伝搬し、有利には隣接するパス（ストリップ）へ伝搬することが可能であることを理解できる。
【０１１０】
さらに、とりわけＯＰＩ／ＯＰＡ条件に関して、またＡＬＵ間での状態情報の交換に関しては、図１３を参照する。ここでは、４つのカラムに配置されたＡＬＵの４つのロウが、状態レジスタと、ＡＬＵフラグ等の状態情報を転送するための接続部とともに示されている。図１３では、より見やすくするため、またより理解しやすくするため、データ（オペランド）交換のためのパスは示されていない。ここで明らかであるように、図１３に示された実施形態では、状態情報は状態レジスタからＡＬＵユニットの第１のロウへ転送され、各ＡＬＵユニットは各カラムに対するレジスタから状態情報を受け取る。ここに図示された実施形態では、ロウ間で状態情報が伝搬される。したがってＡＬＵ状態情報に関しては、同一のカラム内で隣接する下流のＡＬＵへパスが存在する。それゆえ、ＯＰＩ／ＯＰＡ接続線路によって示されているように、状態情報は１つのロウ内でも交換される。図中の実施形態では、すぐ隣同士のみが相互に接続される。しかし、このことを適用する必要はなく、このような接続を回路の複雑性の関数とすることが可能であることは理解できる。ここでは、１つのロウにおいてＡＬＵ間の矢印はＯＰＩ／ＯＰＡ情報を指しているが、これは、反対側（隣接する）カラムがアクティブ状態（ＯＰＡ）または非アクティブ状態（ＯＰＩ）であるかに関する情報であり、たとえばあふれフラグおよび条件評価フラグ等の別の情報をカラム間で転送することは容易に実現することができる。
【０１１１】
また最後のロウでは、状態情報は適切な接続部を介して状態レジスタの入力側に転送されることも述べておく。
【０１１２】
このような構成は、ＡＬＵ間で状態情報を以下のように転送することができる。
【０１１３】
ロウ間においてＡＬＵフラグを転送する。これはたとえば、あふれフラグ、繰り上げフラグ、ゼロフラグおよび別の典型的なプロセッサフラグである。さらに、先行の（上流側の）１つまたは複数のＡＬＵステージがアクティブ状態であったかを示す情報が伝搬される。この場合には所与のＡＬＵステージは、同一のカラム内の上流側のＡＬＵステージがちょうどそのクロックサイクルでアクティブ状態であったか否かに依存して、演算を実行する。最上位のＡＬＵロウ（ステージ）は状態レジスタから、直前のクロックサイクルで得られた最下位のＡＬＵステージの出力を受け取る。ここでの本発明の特別な利点は、異なるカラムが、完全に独立したＡＬＵパイプライン（またはＡＬＵチェーン）を定義するだけでなく、状態情報を相互間で転送できることにより、分岐および条件等の評価が可能になる。このことは、上記および下記にも記載されている。さらに、１つまたは２つまたはそれ以上の数のＡＬＵが下流の１つの同じロウまたは複数の同じロウに存在する場合には、隣接するカラムに状態情報を転送することもできる。また、このような情報を受け取るＡＬＵにおいて条件付き実行をインプリメントすることも可能である。添付書類の表２９に、幾つかのテスト条件が挙げられている。これらは本発明を限定するものではない。それによればこのような条件例には、「zero-flag set（ゼロフラグはセットされている）」、「zero-flag not set（ゼロフラグはセットされていない）」、「carry-flag set（繰り越しフラグはセットされている）」、「carry-flag not set（繰り越しフラグはセットされていない）」、「overflow-flag set（あふれフラグはセットされている）」、「overflow-flag not set（あふれフラグはセットされていない）」、これらのフラグから派生した条件として、「opposite ALU-column is active（反対側のＡＬＵフラグがアクティブ状態である）」、「opposite ALU-column is inactive（反対側のＡＬＵフラグが非アクティブ状態である）」、「if last condition (in one of the previous cycles) enabled left column (status register flag)（（先行のサイクルのうち１つのサイクルにおいて）直前の条件が左側のカラムをイネーブルした場合（状態レジスタフラグ））」、「if last condition (in one of the previous cycles) enabled right column (status register flag)（（先行のサイクルのうち１つのサイクルにおいて）直前の条件が右側のカラムをイネーブルした場合（状態レジスタフラグ））」、「activate ALU-column if deactivated（ＡＬＵカラムが非アクティブ化されている場合には該ＡＬＵカラムをアクティブ化せよ）」が含まれる。図１３にはカラム間に水平方向の接続のみが設けられているが、別のインプリメンテーションでは択一的および／または付加的に、カラム間の非水平方向の接続および／またはすぐ隣接しないカラム間の水平方向および／または非水平方向の接続を設けることも選択できることが理解できる。
【０１１４】
異なるカラム間のこのような情報の伝搬は、効率的かつ高パフォーマンスのプログラムをプログラミングするのに、以下のように役立つ：
まず、すべてのＡＬＵが１つの命令を実行すべきであること、すなわちすべてのカラムがイネーブルされることを仮定する。このような場合、状態情報が交換されないことにより、１つのカラム内のＡＬＵが同一のカラムまたは隣接するカラムにおいて満たされた条件に応答してデータをもはや処理しない限りは、ＡＬＵは単にチェーン接続されているだけである。しかし、何らかの条件が真でない場合、この条件が与えられたカラムの下流のＡＬＵは非アクティブ化される。ここで、１つのプログラム部分が２つの異なる分岐に分岐する必要があると仮定する。１つの分岐は左側のカラムで処理され、他方の分岐は右側のカラムで処理される。もちろん、最後に実行しなければならない分岐は１つだけである。どちらの分岐がアクティブ状態になるかは、処理中に決定される条件に依存する。この条件に関する情報が転送されることにより、条件が満たされる分岐のみを評価することが可能になり、かつ有利には、他方の分岐に与えられた条件が満たされなかったために関与しない該他方の分岐における演算が、相応のカラムによってディスエーブルされることによって実行されないことを実現することができる。したがって、このような条件に関する情報を使用して、隣接するカラムおよび／または同一のカラムのＡＬＵをアクティブ化または非アクティブ化することができる。非アクティブ化は、たとえば「反対側のパスは非アクティブ状態」条件または「反対側のパスはアクティブ状態」条件を使用し、カラム間で転送される相応の信号を使用して行うことができる。カラムのディスエーブルは、該カラムから出力されたデータすべての伝搬を単にイネーブルしないことだけでインプリメントすることができることを述べておく。動作不能状態のＡＬＵからデータ出力は実効的に行われないが、動作不能状態のＡＬＵおよび／またはカラムからの状態情報は伝搬されることは容易に理解できる。
【０１１５】
ここで、隣接するカラムのＡＬＵがディスエーブルされることにより、同じ隣接するカラムにあり該ＡＬＵより下流にあるＡＬＵもすべてディスエーブルされるケースを考察する。このことは、第１のステップでディスエーブル情報を隣接するカラムの第１のＡＬＵへ転送した後、該ディスエーブル情報を同カラム内で下流のＡＬＵへ伝搬することによって行われる。最終的には、このようなディスエーブル情報は状態レジスタへ戻される。このことはたとえば、１つの先行の条件に応答して非常に長い分岐を実行しなければならない場合に必要とされる。しかし、１つの分岐において制限された数の演算のみが必要とされる特定のケースが存在する。このようなケースでは、すでにディスエーブルされたカラムを次のステージで再び「アクティブ状態にし」なければならない。このような再アクティブ化の一例に、２つの分岐が再びマージし、すでに非アクティブ化されたカラムを再び使用するケースがある。このことはＡＣＴ（アクティブ化）条件によって、該ＡＣＴ信号を受け取ったＡＬＵのカラムにおいて下流のＡＬＵカラムをアクティブ化することによって行われる。ここでは有利には、該当のカラムが非アクティブ化されている場合に、ＡＬＵは前記信号を受信する。ＡＣＴ条件を使用する代わりに、別の条件が満たされない限り、相応のＡＬＵと、同一のカラムにあり該相応のＡＬＵより下流にあるすべてのＡＬＵを無条件でイネーブルできることが理解できる。
【０１１６】
また上記では、特定のＡＬＵがディスエーブルされることにより、このディスエーブルが分岐評価時の電力消費を低減するのに有利であることを示唆したが、データ処理を改善するために別の条件をインプリメントすることも有利である。
【０１１７】
したがって、以下のインプリメンテーションが非常に有利である：
ＯＰＩ：反対側のカラムの同一のロウのＡＬＵを非アクティブ化すべき場合、該当のカラム内のＡＬＵはアクティブ化される。
【０１１８】
ＯＰＡ：反対側のカラムの同一のロウにあるＡＬＵがアクティブ状態である場合、同一のロウにあり該当のカラムに存在するＡＬＵもアクティブ化される。そうでない場合には、該当のカラム内のＡＬＵは非アクティブ化される。
【０１１９】
有利な実施形態では、該当のカラムにおいて上流にあるＡＬＵのアクティブ化状態が何であるかにかかわらず、非アクティブ化が行われる。通常の知識を有する者であれば、たとえばＯＰＡ条件の評価によって非アクティブ化されたカラムは、下流のＡＬＵにおいてアクティブ化（ＡＣＴ）条件を使用して再アクティブ化できることを容易に理解できる。
【０１２０】
さらに、先行のサイクルのうち１つのサイクルで行われた直前の条件が評価されるようにインプリメントすることも非常に有利である。添付書類の表２９に、このような２つの条件、すなわちＬＣＬおよびＬＣＲが挙げられている。これらは以下の意味を有する：
ＬＣＬ：先行して評価された直前の条件がどの程度先行して行われたかにかかわらず、該条件が左側のカラムをイネーブルされている場合、該当のカラムのＡＬＵはイネーブルされる。評価された先行の条件がどの程度先行して行われたかにかかわらず、該条件が左側のカラムをディスエーブルされている場合、該当のカラムのＡＬＵはディスエーブルされる。この条件が、先行の条件で左側のカラムがイネーブルされているか否かをチェックするにもかかわらず、このことは、ＬＣＬ条件を使用して左側のカラムおよび／または右側のカラムのいずれかに対して実効的に評価できることを述べておく。
【０１２１】
ＬＣＲ：ＬＣＬと同様に、ＬＣＲ条件は以下の作用を有する：先行の条件が右側のカラムをアクティブ化している場合、該当のカラムが左側のカラムにあるかまたは右側のカラムにあるかにかかわらず、該当のカラム内のＡＬＵもアクティブ化される。しかし先行の条件が右側のカラムをディスエーブルされている場合、該当のカラムもディスエーブルされる。
【０１２２】
ＬＣＬおよびＬＣＲのいずれにおいても、カラムがアクティブ状態である場合にはアクティブ化されず、アクティブ状態に維持されることを述べておく。カラムがアクティブ状態でない場合、ＬＣＬ／ＬＣＲ条件は実効性を有さない。
【０１２３】
ＬＣＬ，ＬＣＲ，ＯＰＩまたはＯＰＡを使用して行われるアクティブ化／非アクティブ化はＶＬＩＷアーキテクチャでも有利であり、レジスタのイネーブルによって、クロックサイクル等に逆方向の作用を及ぼさずにＶＬＩＷアーキテクチャをインプリメントできることを再度述べておく。
【０１２４】
より一般的に言うと、ＬＣＬに類する条件が、１つまたは複数のカラムに対する先行の最後の条件を評価することにより、ＬＣＬに類する該条件の評価が適用された該当の（複数の）カラムのアクティブ化状態が決定される。
【０１２５】
以下の添付書類１は開示目的で、依拠する本願の一部を成し、本願の不可欠部分として公表すべきものである。
【０１２６】
添付書類１
ＦＮＣ ＰＡＥ‐参照マニュアル  アドバンス情報‐変更対象
目次
第１章  緒言・・・４
１．１  アプリケーション空間・・・４
第２章  ＦＮＣ‐ＰＡＥアーキテクチャ・・・６
２．１  ＸＰＰアレイへの組み込み・・・６
２．２  ＦＮＣ‐ＰＡＥとの相互接続・・・７
２．３  ＦＮＣ‐ＰＡＥ  アーキテクチャ概観・・・７
２．４  ＡＬＵデータパス・・・１０
２．５  レジスタファイル・・・１０
２．６  命令フェッチおよび命令復号化・・・１１
２．７  条件付き演算・・・１２
２．８  分岐・・・１２
２．８．１  オペコード暗示的プログラムポインタ修飾子・・・１２
２．８．１．１  ＬＰＣインプリメンテーション固有の挙動・・・１４
２．８．２  明示的プログラムポインタ修飾子・・・１５
２．８．２．１  リンクレジスタ（lnk）・・・１６
２．９  ロード／記憶ユニット・・・１６
２．９．１  アドレス発生器・・・１６
２．１０  メモリロード／記憶命令・・・１８
２．１１  ローカルメモリ・・・２０
２．１１．１  命令メモリ・・・２０
２．１１．２  ローカルデータメモリ・・・２０
２．１２  ＡＬＵ・・・２０
２．１２．１  ＡＬＵ命令・・・２０
２．１２．２  命令の可用性・・・２２
２．１２．２．１  算術命令、論理命令およびＳＦＵ命令・・・２３
２．１２．２．２  移動命令・・・２４
２．１２．２．３  ロード／記憶命令・・・２５
２．１２．２．４  プログラムポインタ変更命令・・・２７
２．１２．２．５  ポート読み出し／書き込み命令・・・２８
２．１２．２．６  雑命令・・・３０
２．１２．３  多義的なターゲット・・・３１
２．１３  レジスタサマリ・・・３１
２．１３．１  汎用レジスタ・・・３１
２．１３．２  アドレス発生器レジスタ・・・３２
２．１３．３  Ｍｅｍ‐ｉｎメモリ、Ｍｅｍ‐ｏｕｔレジスタ・・・３２
２．１３．４  リンクレジスタおよびＩｎｔｌｎｋレジスタ・・・３２
２．１３．５  状態レジスタ・・・３３
２．１３．６  ポート・・・３３
２．１４  ＳＦＵ・・・３４
２．１４．１ マルチサイクルＳＦＵ・・・３４
２．１４．２  ＳＦＵ ０・・・３４
２．１４．３  ＳＦＵ １・・・３５
２．１５  メモリ階層構造・・・３５
２．１５．１．１  ブートストラップ・・・３７
２．１５．１．２  ＡＬＵ／ＲＡＭ‐ＰＡＥアレイ（リ）コンフィギュレーションおよびＦＮＣ‐ＰＡＥブート・・・３７
２．１６  ＸＰＰアレイへの組み込み・・・３７
２．１７  プランニングされている拡張・・・３７
２．１７．１  シャドウレジスタファイル・・・３７
２．１７．２  遅延スロットにおけるオペコード実行・・・３７
２．１７．２．１  複数のセグメントにわたるジャンプ・・・３８
２．１７．３  データセグメントポインタ・・・３８
第３章  アセンブラ・・・３９
３．１  一般的なアセンブラ要素・・・３９
３．１．１  オペコード構文・・・３９
３．１．２  コメント・・・４０
３．１．３  数、定数およびエイリアス・・・４０
３．１．４  オブジェクトネーミング、デフォルトエイリアス・・・４０
３．１．５  ラベル・・・４１
３．１．６  メモリ・・・４１
３．１．７  条件付き実行・・・４３
３．１．８  プログラムフロー・・・４４
３．１．８．１  ＥＸＩＴ分岐・・・４５
３．１．８．２  ＥＬＳＥ分岐・・・４８
３．１．８．３  ロングジャンプ・・・４９
３．２  アセンブラ命令・・・５０
３．３  シャドウレジスタ・・・５３
３．４  入力／出力・・・５３
３．５  リセットベクトルおよび割込ベクトル・・・５４
３．６  例・・・５４
３．６．１  例１・・・５４
３．６．２  例２・・・５５
３．６．３  例３・・・５４
３．６．４  例４・・・５８
３．６．５  例５・・・６１
３．６．６  例６・・・６３
３．６．７  例７・・・６５
【０１２７】
付録Ａ・・・６８
図面リスト
図１：ＦＮＣ‐ＰＡＥおよびＸＰＰ Ｉ／Ｏを有するＸＰＰ２０．８．４・・・６
図２：ＦＮＣ‐ＰＡＥ概観・・・１０
図３：アドレス発生器およびＡＧＲＥＧ・・・１７
図４：メモリ階層構造・・・３６
図５：アセンブラオペコード構造・・・３９
図６：ＦＮＣＤＢＧ ＲＡＭ表示・・・４３
図７：命令レベルフロー図・・・５５
図８：異なる３つの実行時間パス（陰影を有するブロックがイネーブルされている）・・・５６
図９：図６のｉビットシーケンス・・・６４
図１０：ＦＮＣ‐ＰＡＥデバッガ（ベータ）・・・６８
【０１２８】
表リスト
表１：ＦＮＣ‐ＰＡＥオペコード構造・・・１１
表２：ＰＰを変更する命令・・・１５
表３：ＡＧＲＥＧ機能・・・１６
表４：アドレス発生器モード・・・１８
表５：記憶命令・・・１８
表６：ロード命令・・・１９
表７：スタック命令・・・１９
表８：ＡＬＵハードウェア命令サマリ・・・２１
表９：算術命令、論理命令およびＳＦＵ ＡＬＵ命令・・・２３
表１０：移動命令・・・２４
表１１：メモリロード／記憶命令・・・２５
表１２：プッシュ／ポップ命令・・・２６
表１３：ｌｎｋを介するジャンプ、呼び出し、呼び出し・・・２７
表１４：リンクレジスタロード命令・・・２８
表１５：サブルーティンおよびｌｎｋからの戻り・・・２８
表１６：ポート読み出し／書き込み命令・・・２９
表１７：雑命令・・・３０
表１８：レジスタ書き込み優先権・・・３１
表１９：汎用レジスタファイル・・・３１
表２０：ＡＧレジスタ・・・３２
表２１：Ｍｅｍレジスタ・・・３２
表２２：リンクレジスタ・・・３２
表２３：状態レジスタビット・・・３３
表２４：ポート・・・３３
表２５：ＳＦＵ命令フォーマット・・・３４
表２６：ＳＦＵ ０命令・・・３４
表２７：ＳＦＵ １命令・・・３５
表２８：オブジェクトおよびレジスタのアセンブラネーミング・・・４０
表２９：条件・・・４４
表３０：ＥＸＩＴ挙動（１）・・・４６
表３１：ＥＸＩＴ挙動（２）・・・４７
表３２：ＥＬＳＥ挙動・・・４９
表３３：アセンブラＡＬＵ命令（１）・・・５１
表３４：アセンブラＡＬＵ命令（２）・・・５２
表３５：アセンブラオペコード命令・・・５２
表３６：アセンブラＳＦＵ ０命令・・・５２
表３７：アセンブラＳＦＵ１命令・・・５３
表３８：確保済みラベル・・・５４
表３９：例７のスタック使用・・・６５
【０１２９】
第１章
緒言
ＸＰＰアーキテクチャは、基本的な処理アレイ要素から厳密にモジュール構成されている。ＸＰＰ‐IIｂアーキテクチャのＰＡＥは、フロー図をアレイに静的にマッピングするために最適化されている。フロー図をマッピングするためのＰＡＥには２つの基本的な種類が存在する；
・ＡＬＵ ＰＡＥは、基本的な算術論理演算を実行する
・ＲＡＮ ＰＡＥは、たとえば間接的な結果に対するデータを記憶するか、または使用されるルックアップテーブルであるプログラムフローは、独立した１ビットイベントネットワークによって操作することができる。このことにより、データフローの条件付き演算と、外部プロセッサとの同期とが可能になる。このようなＸＰＰの特徴により、比較的均質な構造を有し処理時間に対して高いデータ要件を課すアルゴリズムに必要な帯域幅と並列性とが提供される（データフロー指向的）。
【０１３０】
しかし、大部分の新規の信号処理アルゴリズムは、データフロー部分のみから構成されるのではなく、複雑な制御フロー指向のセクションを必要とすることが多くなってきている。このようなセクションは、より高次のプログラミング言語、たとえばＣ言語等をサポートするシーケンシャルプロセッサによって処理しなければならない。１つの解決手段に、システム・オン・チップ（ＳｏＣ）において、制御フローセクションに対して、たとえばＡＲＭまたはＭＩＰＳ等の組み込み型マイクロプロセッサを使用し、データフローセクションに対して、組み込み型ＸＰＰアレイを使用する解決手段がある。この解決手段は、制御フローセクションに対して極端な処理要件を課さないアプリケーションでは、パフォーマンスおよび開発の努力の点では、実用的なソリューションである。
【０１３１】
しかしすぐに入手可能なマイクロプロセッサでは、とりわけ高精細度ビデオアプリケーション（ＨＤビデオ）において、新たなアルゴリズムの要求に追いつくことはできない。
【０１３２】
そこでＰＡＣＴは、ＸＰＰアレイにシームレスに組み込むことが可能な機能ＰＡＥ（ＦＮＣ‐ＰＡＥ）アーキテクチャを紹介する。ＦＮＣ‐ＰＡＥは、典型的な制御フローアプリケーション用の並列演算方式のＡＬＵのセットから成り、これによって高度な並列性が実現されるとともに、シーケンシャルアルゴリズムのためのゼロオーバヘッド分岐もともに実現される。
【０１３３】
１．１  アプリケーション空間
以下の要約では、ＡＬＵ‐ＰＡＥとＲＡＭ‐ＰＡＥとを有するＸＰＰアレイによって高パフォーマンスのプログラマブルソリューションを提供するアルゴリズムの思想を紹介する。
【０１３４】
・ビデオコーデック用のコサイン変換
・エンコーダ動き推定およびデコーダ動き補償
・ピクチャ改善、デブロッキングフィルタ
・スケーリングおよび適応フィルタ
・ベースバンド処理用のＦＦＴまたはソフトウェア定義ラジオ
ＦＮＣ‐ＰＡＥは、ＸＰＰアレイのアプリケーション空間を次のようなアルゴリズムにまで拡張する。
【０１３５】
・ビデオコーデック用のＣＡＶＬＣ
・ＣＡＢＡＣ算術エンコーダ／デコーダ
・ハフマンエンコーダ／デコーダ
・オーディオ処理
・ＦＦＴアドレス発生
・ソフトウェア定義ラジオ用の順方向誤り訂正、たとえばＶｉｔｅｒｂｉ，ターボコーダ
ＦＮＣ‐ＰＡＥのシーケンシャル特性に起因して、これをアレイの再構築用の制御プロセッサとして使用し、またＳｏＣに存在する別のモジュールとの通信用の制御プロセッサとして使用することもできる。さらにＦＮＣ‐ＰＡＥは、効率的なコンパイラ設計を可能にするハードウェア構造を提供する。ＦＮＣ‐ＰＡＥはＶＬＩＷアーキテクチャと幾つか類似点を有するが、多くの点で異なっている。ＦＮＣ‐ＰＡＥは、アルゴリズムで必要とされる決定および分岐が多い制御フロー処理のための最大帯域幅に対して構成されている。
【０１３６】
本マニュアルでは、ＦＮＣ‐ＰＡＥおよびアセンブラのコンセプトおよびアーキテクチャを記載する。
【０１３７】
ＸＰＰアレイの詳細に関しては、ＡＬＵ‐ＰＡＥおよびＲＡＭ ＰＡＥを基礎として、ＸＰＰ‐IIｂ参照マニュアルおよびＸＰＰ‐IIｂプログラミングチュートリアルを参照されたい。
【０１３８】
第２章
ＦＮＣ‐ＰＡＥアーキテクチャ
２．１  ＸＰＰアレイへの組み込み
図１は、４つのＦＮＣ ＰＡＥが組み込まれたＸＰＰアレイ（ＸＰＰ ４０．１６．８１）を示す。
【０１３９】
2008530642.tif 000003
【０１４０】
図１：ＦＮＣ‐ＰＡＥおよびＸＰＰ Ｉ／Ｏを有するＸＰＰ２０．８．４
ＡＬＵ‐ＰＡＥおよびＲＡＭ‐ＰＡＥはＸＰＰアレイの中心に配置される。ＦＮＣ‐ＰＡＥはＸＰＰ‐IIｂアレイの右縁部に、データフロー同期されるポートを有する各ロウごとに取り付けられている。ＸＰＰ ＢＲＥＧと同様に、方向はボトムアップであり、４つの入力ポートと４つの出力ポートを有する。ＦＮＣ‐ＰＡＥは、ＦＮＣ‐ＰＡＥコア間に垂直に、直接通信用の付加的なポートを提供する。通信プロトコルは、ＸＰＰアレイ内における水平方向ＸＰＰバスと同じであり、データパケットはポイント間接続によって転送される。垂直方向のイベントバスを有するＦＮＣ‐ＰＡＥ間では偶数も交換することができる。ＲＡＭ‐ＰＡＥに組み込まれるＸＰＰアレイのＩ／Ｏは維持される。このアレイは、ロウおよびカラムの数でスケーリング可能である。
【０１４１】
１  第１図はＡＬＵ‐ＰＡＥの数を定義しており、第２図はＲＡＭ‐ＰＡＥの数を定義しており、第３図はＦＮＣ‐ＰＡＥの数を定義する。左縁部および右縁部には常に１６個のＲＡＭ‐ＰＡＥが配置されているので、番号付与パターンによって、コアにおける５×８ＡＬＵ‐ＰＡＥアレイも定義される。
【０１４２】
２．２  ＦＮＣ‐ＰＡＥとの相互接続
他のＰＡＥと同様に、この相互接続はＸＰＰデータフロープロトコルを基礎とする：ソースは、受信側によって消費される個々のワードパケットを送信する。受信側オブジェクトは、すべての必要な入力が使用可能になった場合のみ、このパケットを消費する。このような簡単なメカニズムによって、自己同期ネットワークが提供される。ＦＮＣ‐ＰＡＥのシーケンシャル特性に起因して、受信側オブジェクトは各クロックごとに結果を供給しないか、または入力を消費しないケースが多く存在する。しかし、このようなデータフロープロトコルによって、すべてのＸＰＰオブジェクトはＦＮＣ‐ＰＡＥの入力および出力に自動的に同期することが保証される。４つのＦＮＣ‐ＰＡＥ入力ポートはボトム水平方向バスに接続されており、４つの出力ポートはデータパケットをトップ水平方向バスへ転送する。データと同様に、水平方向のイベントバスを使用してイベントを送受信することもできる。
【０１４３】
２．３  ＦＮＣ‐ＰＡＥ  アーキテクチャ概観
ＦＮＣ‐ＰＡＥはロード／記憶ＶＬＩＷアーキテクチャを基礎とする。ＶＬＩＷプロセッサと異なってこのロード／記憶ＶＬＩＷアーキテクチャでは、同一クロックサイクル内でＡＬＵの暗示的な条件付き演算と、逐次演算と、並列演算とが行われる。
【０１４４】
ＦＮＣ‐ＰＡＥのコアはＡＬＵデータパスであり、これは１６ビット幅整数ＡＬＵを８つ有し、これらのＡＬＵは４ロウ×２カラムに配置されている（図２）。データパス全体の動作は非パイプライン方式であり、データパス全体で１つのクロックサイクルで実行されるオペコードは１つである。処理方向はトップからボトムである。
【０１４５】
各ＡＬＵはオペランドをレジスタファイルＤＲＥＧから受け取るか、または拡張レジスタファイルＥＲＥＧから受け取るか、またはアドレス発生器レジスタファイルＡＧＲＥＧから受け取るか、またはメモリレジスタＭＥＭ‐ｏｕｔから受け取る。レジスタおよびデータパスはすべて１６ビット幅である。ＡＬＵは、上方に位置するすべてのＡＬＵの結果にアクセスできる。さらにトップロウのＡＬＵは、ＦＮＣ‐ＰＡＥと別のＰＡＥとを接続する３２個の自動同期方式のＩＯポートのうち最大１つにアクセスすることができる。前記別のＰＡＥは、たとえばＡＬＵ‐ＰＡＥおよびＲＡＭ‐ＰＡＥのアレイであるか、または任意の種類のプロセッサである。
【０１４６】
ＥＲＥＧおよびＤＲＥＧはシャドウレジスタ１の１セットを提供し、サブルーティンの呼び出し時には高速のコンテクストスイッチングを可能にする。ＤＲＥＧ ｒ２．．．ｒ７およびすべてのＥＲＥＧは２倍化されているのに対し、ＤＲＥＧ ｒ０およびｒ１はパラメータ転送を行うのに使用される。
【０１４７】
ロード／記憶ユニットはアドレス発生器およびデータメモリインタフェースを有する。アドレス発生器は複数のベースポインタを提供し、メモリアクセスのためのポストインクリメントおよびポストデクリメントをサポートする。ロード／記憶ユニットインタフェースはＡＬＵデータパスに直接接続される。実行サイクルごとに１つのロード／記憶演算がサポートされる２。
【０１４８】
最大１６個の特別関数ユニット（ＳＦＵ）がＡＬＵデータパスに対して並列に動作する。ＡＬＵデータパスとは対照的に、ＳＦＵはパイプライン方式で動作することができる。ＳＰＵは、ＡＬＵのトップロウと同一のオペランドソースにアクセスすることができ、ボトム左側ＡＬＵを使用してその結果をライトバックする。ＳＦＵ命令セットは、各ＳＦＵごとに最大７つのコマンドをサポートする。ＳＦＵ ０は１６×１６乗算器のために確保されており、オプションとして１６ビットディバイダのために確保されている。ビットフィールド演算等の特別な演算をサポートする特別なオペコードはＳＦＵとして組み込まれる。
【０１４９】
１  現在は、シャドウレジスタは未だサポートされない。
【０１５０】
２  注意点：ＦＮＣ‐ＰＡＥアーキテクチャはロード／記憶ユニットの２倍化を実現することにより、将来の増強として、多重的な同時データメモリ転送をサポートすることができる。
【０１５１】
ＦＮＣ‐ＰＡＥは、８つのＡＬＵがすべて同一サイクルで動作し、ＡＬＵデータパス内で条件を実行できるので、高い逐次パフォーマンスを実現する。ＡＬＵ演算は実行時間時に、上方に配置されたＡＬＵの状態フラグに基づいてイネーブルまたはディスエーブルされる。ＡＬＵの演算は条件付きで、同一のカラムにあり上方のロウにあるＡＬＵの状態フラグに基づいて制御することができる。トップＡＬＵは、その時点のサイクル前の同一のカラムの最後のＡＬＵの状態レジスタを介して入力された状態の入力を使用する。データパスに並列して、次のサイクルでの実行のために２つの命令候補が同時にフェッチされる１。各処理サイクルの終了時には、ＡＬＵデータパス全体の状態に基づいて、これらの命令のうち１つの命令が選択される。このことにより、命令レベルでいかなる遅延も伴わずに、２つのターゲットへの分岐が可能になる。付加的な条件付きジャンプ演算によって、１サイクルの遅延を引き起こす２つの別のターゲットへの分岐が可能になる。
【０１５２】
１  同時に命令をフェッチするためには、２つの命令メモリが必要である（オプション）。
【０１５３】
2008530642.tif 000004
【０１５４】
図２：ＦＮＣ‐ＰＡＥ概観
２．４  ＡＬＵデータパス
ＡＬＵデータパスは１６ビット幅の整数ＡＬＵを８つ有し、これらのＡＬＵは４ロウ×２カラムに配置されている。左側または右側のＡＬＵカラム（パス）でのデータ処理は、厳密にトップからボトムに行われる。このことは重要事項である。というのも、条件付き演算は左側パスまたは右側パスの次のＡＬＵをディスエーブルできるからである。完全なＡＬＵデータパスは１つのクロックサイクルで実行される。ＡＬＵはすべて、３つの１６ビットレジスタファイルＤＲＥＧ（ｒ０．．．ｒ７）、ＥＲＥＧ（ｅ０．．．ｅ７）およびＡＧＲＥＧ（ｂｐ０．．．ｂｐ７）にアクセスすることができる。また、ＡＬＵの各ロウも、上方のＡＬＵすべての先行して処理された結果にアクセスすることができる。
【０１５５】
ＡＬＵデータパス内で高速なデータ処理を可能にするためには、ＡＬＵは制限された演算セットをサポートする。これらの演算セットは、加算、減算、比較、バレルシフト、およびブール関数ならびにジャンプである。より複雑な演算は、別個にＳＦＵ関数としてインプリメントされる。大部分のＡＬＵ命令１はすべてのＡＬＵで使用可能であるが、これらのうち幾つかは、ＡＬＵの特別なロウに制限されている。さらに、ＡＧＲＥＧ、ＥＲＥＧ、Ｉ／Ｏからのソースオペランドにアクセスすることは、ＡＬＵの幾つかのロウでは制限されており、また、使用可能なターゲットはコラムごとに異なることもできる２。
【０１５６】
このような厳密な制限により、データパス内部のデータ処理は最小遅延で、いかなるパイプラインステージも使用せずに行うことができる。さらに、プログラムメモリの所要サイズを制限することができる制約も幾つか存在する。レジスタファイルからのオペランドはＡＬＵに供給される。１つのロウのＡＬＵ出力は、次のロウのＡＬＵに供給することができる。したがって、各コラムごとに最大４つの連続したＡＬＵ演算を同一のクロックサイクル内で実行することができる。最後の結果はその同一のサイクル内で、レジスタファイルに書き込まれるかまたは別のターゲットレジスタに書き込まれる。ＡＬＵの状態フラグはＡＬＵの次のロウに供給される。ボトムＡＬＵの状態フラグは状態レジスタに記憶される。状態レジスタからのフラグは第１のロウのＡＬＵと命令デコーダとによって、条件付き演算を操作するために使用される。このようなモデルにより、各演算が先行の演算の結果に依存する非常に逐次的なアルゴリズムを効率的に実行することができる。
【０１５７】
２．５  レジスタファイル
ＡＬＵは、複数の１６ビットレジスタに同時にアクセスすることができる。汎用レジスタＤＲＥＧ（ｒ０．．ｒ７）には、すべてのＡＬＵが独立して同時読み出しおよび同時書き込みによってアクセスすることができる。拡張レジスタＥＲＥＧ（ｅ０．．．ｅ７）、アドレス発生器レジスタｂｐ０．．．ｂｐ７およびポートにもＡＬＵはアクセスできるが、幾つかのＡＬＵには制限がある。１サイクル以内でのこれらのレジスタへの同時書き込みは、同一のインデックスが使用される場合にのみ可能である。たとえば、１つのＡＬＵがｅｌに書き込む場合、別のＡＬＵはｂｐｌに書き込むことしか許可されない。
【０１５８】
ｍｅｍ‐ｏｕｔレジスタからデータをレジスタに直接読み出すことが計画されている。現在、ＡＬＵはｍｅｍ‐ｏｕｔから読み出した後に、必要な場合にはデータをレジスタへ転送しなければならない。
【０１５９】
ＤＲＥＧおよびＥＲＥＧはシャドウレジスタを有する。これによって、たとえば割込ルーティンに対して高速のコンテキストスイッチが実現される。シャドウレジスタｒ０およびｒ１はｒ０またはｒ１とそれぞれ同一である。このことにより、シャドウレジスタセットが選択された場合にパラメータの転送を行うことができる。シャドウレジスタは、呼び出し命令およびｒｅｔ命令によって選択することができる。
【０１６０】
１  命令は個々のＡＬＵを操作する。オペコードは、すべてのＡＬＵに対する命令と別の情報とを有する。オペコードは１クロックサイクル以内で実行される。
【０１６１】
２  詳細は第２．１２．２章を参照されたい。
【０１６２】
２．６  命令フェッチおよび復号化
命令メモリは２５６ビット幅である。表１は、ＦＮＣ‐ＰＡＥの２５６ビット幅の一般的なオペコード構造を示す。
【０１６３】
2008530642.tif 000005
【０１６４】
表１：ＦＮＣ‐ＰＡＥオペコード構造
このオペコードは、８つのＡＬＵに対して２８ビット命令を供給する。別のビットフィールドの機能は、以下の通りである：
・ＥＸＩＴ‐Ｌ，ＥＸＩＴ‐Ｒ：２つのビットが、相対的ポインタ（ＨＰＣ，ＬＰＣまたはＩＪＭＰ０）のうちどれを次のオペコードに対してフェッチするかを指定する。左側ＡＬＵカラムおよび右側ＡＬＵカラムの別個の出口が、同時にフェッチされた２つのオペコードの選択を可能にする。
【０１６５】
・ＨＰＣ：高優先度継続：６ビット（正負符号付き）が、現在のプログラムポインタＰＰに対して相対的にフェッチすべき次のオペコードを指定する。ＨＰＣはデフォルトポインタである。というのも、これはどのようなケースでも必ず事前フェッチされているからである。１つのコードが、ｌｎｋレジスタを使用して次のオペコードを絶対的に選択することを指定する。
【０１６６】
・ＬＰＣ：低優先度継続：ＨＰＣと同様に６ビット（正負符号付き）が、分岐の場合にフェッチすべき次のオペコードを指定する。１つのコードが、次のオペコードを絶対的にポインティングするためにｌｎｋレジスタを使用することを指定する。
【０１６７】
・ＩＪＭＰ０：暗示的ショートジャンプ：６ビット（正負符号付き）が、現在のプログラムポインタＰＰに対して相対的にフェッチすべき次のオペコードを指定する。ジャンプは常に１つのサイクル遅延を必要とする。というのも、次のオペコードは事前フェッチできないからである。
【０１６８】
ＦＮＣ‐ＰＡＥは２ステージパイプラインを使用してインプリメントされ、ステージ命令フェッチ（ＩＦ）および実行（ＥＸ）が含まれる。ＩＦは、命令メモリからの命令フェッチと、１サイクル以内での命令デコードとを有する。したがって命令メモリは、高速非同期ＳＲＡＭとしてインプリメントされる。
【０１６９】
ＥＸの際には、８つのＡＬＵ、ロード／記憶ユニットおよびＳＦＵ（特別関数ユニット）はコマンドを並列実行する。ＡＬＵデータパスおよびアドレス発生器はパイプライン化されない。ロード命令も記憶命令も、１つのパイプラインステージを有する。ＳＦＵは任意の深さのパイプラインをインプリメントすることができる（詳細に関しては、セクション２．１４を参照されたい）。
【０１７０】
通常のプロセッサと異なり、プログラムポインタ１ｐｐは、ジャンプが行われない場合には逐次的に増分されない。その代わり、オペコードのＨＰＣエントリによって定義された値はｐｐに足される。
【０１７１】
２つの並列命令メモリが使用可能である場合（インプリメンテーション固有）、２つの命令は同時にフェッチされる。この場合、ＨＰＣおよびＬＰＣはｐｐに足され、２つの択一的な命令をポインティングする。
【０１７２】
１  我々は「プログラムポインタ」という用語は、別のマイクロプロセッサで通常のように無条件に１だけ増分する「プログラムカウンタ」と区別して使用している。
【０１７３】
前記択一的な命令のうちＨＰＣによって定義された１つの命令は、メイン命令メモリ内に位置しており、ＬＰＣによって定義された他方の命令は、付加的な並列命令メモリに位置する。したがって両命令ともすでにフェッチ完了していることが可能であり、次のオペコードを遅延無しで実行することができる。ジャンプセクションは±１５個の位置を有する相対的なジャンプを有するか、またはリンクレジスタｌｎｋを介する絶対的ジャンプを有する。ジャンプおよびサブルーティン呼び出しによって、サブルーティンの実行中に使用されるシャドウレジスタファイルを選択することができる。
【０１７４】
２．７  条件付き演算
多くのＡＬＵ命令は、先行のＡＬＵ演算の結果に依存して、上方のロウのＡＬＵ状態フラグから、または第１のＡＬＵロウでは、先行のクロックサイクルの結果に由来する第３ロウのＡＬＵの状態を保持する状態レジスタから、条件付き実行をサポートする。条件の要約に関しては第３．１．７章を参照されたい。条件がＦＡＬＳＥである場合、条件付きの命令および同一のＡＬＵカラムにおける次のすべての命令は非アクティブ化される。カラムがアクティブ化／非アクティブ化されていることを示す状態フラグを次のオペコードに使用することもできる（ＬＣＬ条件またはＬＣＲ条件）。非アクティブ化されたＡＬＵカラムは、ＡＣＴ条件によってのみ再アクティブ化することができる。
【０１７５】
ＬＣＬ条件またはＬＣＲ条件によって、遅延スロットを引き起こさずに分岐を効率的にインプリメントすることができる。というのもこれによって、条件によって先行のオペコードで選択されたのと同一のパスを現在の命令で実行できるからである。
【０１７６】
ＨＰＣ、ＬＰＣおよびＩＪＭＰ０ポインタは、条件に基づいて分岐するのに使用することができる。条件が存在しない場合、ＨＰＣは次のオペコードを定義する。６ビット値で分岐ターゲットに対する条件の結果に基づいて、３つのポインタのうち１つのポインタを定義することができる。専用のＡＬＵオペコードによってロングジャンプを行うことができる。
【０１７７】
２．８  分岐
プログラムポインタｐｐを変更できる命令が幾つか存在する。
【０１７８】
複数の種類のジャンプ命令がサポートされる：
・ＨＰＣ，ＬＰＣおよびＩＪＭＰ０ポインタを使用する、オペコード暗示的プログラムポインタ修飾子
・明示的プログラムポインタ修飾子（すなわちＡＬＵ命令）。
【０１７９】
・ｌｎｋレジスタ（ｌｎｋ）およびスタックを介して行われるサブルーティンの呼び出しおよび戻り。
【０１８０】
・Ｉｎｔｌｎｋレジスタを介して行われる割込呼び出しおよび戻り
アドレスは常に、命令メモリの２５６ビットワードとされる（バイトアドレスとはされない）。
【０１８１】
したがってアセンブラオペコードには、ｐｐ修飾子に対する直接的な参照が存在する。
【０１８２】
２．８．１  オペコード暗示的プログラムポインタ修飾子
暗示的なプログラムポインタ修飾子１はすべてのオペコードとともに使用することができ、±１５個のオペコードによって、または命令がそれ自体でループを処理する場合には０個によって、ＰＰの相対的なジャンプを可能にする。ポインタＨＰＣまたはＬＰＣ（それぞれ６ビット）は相対的な分岐オフセットを定義する。ＥＸＩＴ‐ＬフィールドおよびＥＸＩＴ‐Ｒフィールドは、前記ポインタのうちどのポインタを使用するかを定義する。１つのＨＰＣコードまたはＬＰＣコードが、ｌｎｋレジスタを介してジャンプを選択するために確保されている。
【０１８３】
１  アセンブラステートメント：ＨＰＣ，ＬＰＣ，ＪＭＰＳ
ＨＰＣ‐高優先度継続
ＨＰＣは、実行すべき次の命令を、実際のｐｐに対して相対的にポインティングする。ＨＰＣポインタの使用は、パス（すなわちＡＬＵカラム）のうち１つのパスで明示的に指定することができる。ＥＸＩＴ‐ＬまたはＥＸＩＴ‐Ｒによって、ＨＰＣポインタが次のオペコードをポインティングするか否かが指定される。「通常の」プログラムカウンタをエミュレートするためには、ＨＰＣを１にセットする。アセンブラはこれをデフォルトごとに実行する。
【０１８４】
条件付き命令では「Else」ステートメント（アセンブラ構文：! HPC <label>１）が次のことを定義する。すなわち、条件がＮＯＴ ＴＲＵＥである場合、分岐オフセットとしてＬＰＣポインタを使用することを定義する。そうでない場合には、ＬＰＣ（デフォルト）またはＩＪＭＰ０（指定されている場合）が次の分岐ターゲットとして使用される。「Else」はすべての命令とともに使用できるわけではないことに留意されたい。
【０１８５】
ＬＰＣ‐低優先度継続
ＬＰＣは、実行すべき次の命令を、実際のｐｐに対して相対的にポインティングする。ＬＰＣポインタの使用は、パス（すなわちＡＬＵカラム）のうち１つのパスで明示的に指定することができる。このステートメントは、指定されているパスがアクティブ化されている場合にのみ評価される。
【０１８６】
条件付き命令では「Else」ステートメント（アセンブラ構文：! LPC <label>）が次のことを定義する。すなわち、条件がＮＯＴ ＴＲＵＥである場合、分岐オフセットとしてＬＰＣポインタを使用することを定義する。そうでない場合には、ＨＰＣ（デフォルト）またはＩＪＭＰ０（指定されている場合）が次の分岐ターゲットとして使用される。「Else」はすべての命令とともに使用できるわけではないことに留意されたい。
【０１８７】
ＩＪＭＰ０‐ショートジャンプ
ＨＰＣ／ＬＰＣの他に付加的に、６ビットポインタであるＩＪＭＰ０が択一的な命令を相対的にポインティングし、複雑なディスパッチアルゴリズムにおいて使用される。
【０１８８】
ＩＪＭＰ０は、実行すべき次の命令を、実際のｐｐに対して相対的にポインティングする。ＩＪＭＰ０ポインタの使用は、パス（すなわちＡＬＵカラム）のうち１つのパスで明示的に指定することができる。このステートメントは、それぞれのパスがアクティブ化されている場合にのみ評価される。
【０１８９】
条件付き命令では「Else」ステートメント（アセンブラ構文：! ＪＭＰＳ <label>）が次のことを定義する。すなわち、条件がＮＯＴ ＴＲＵＥである場合、分岐オフセットとしてＩＪＭＰ０ポインタを使用することを定義する。そうでない場合には、ＨＰＣ（デフォルト）またはＬＰＣ（指定されている場合）が次の分岐ターゲットとして使用される。「Else」はすべての命令とともに使用できるわけではないことに留意されたい。
【０１９０】
ショートジャンプは、実行には使用できない１つの遅延スロットを引き起こす。
【０１９１】
２．８．１．１  ＬＰＣインプリメンテーション固有の挙動
ＦＮＣ‐ＰＡＥは、１つまたは２つの命令メモリとともにインプリメントできる：
１つの命令メモリによるインプリメンテーション
ＦＮＣ‐ＰＡＥの標準的なインプリメンテーションは、ＬＰＣポインタによって条件付きジャンプ演算を実行する。これによって遅延スロットが発生する。その理由は、分岐に対する次の命令をまずはフェッチおよび復号化しなければならないからである。このハードウェアオプションは、面積効率がより高くなる。というのも、１つの命令メモリを使用すればよいからである。
【０１９２】
２つの命令メモリによるインプリメンテーション
ＦＮＣ‐ＰＡＥの高パフォーマンスのインプリメンテーションは、２つの命令メモリを有する。これによって、並列アクセスが可能になる。この場合、ＨＰＣおよびＬＰＣによって参照される命令は同時にフェッチされる。実行すべき実際の命令は実行直前に、先行の命令の実行状態に依存して選択される。
【０１９３】
１  このラベルはオプションである。ラベルが指定されていない場合、ｐｐ＋１を使用する。絶対値（たとえば＃３）が指定されている場合、この絶対値がｐｐに加算される（たとえばｐｐ＋３）。
【０１９４】
これによって遅延スロットは消失し、ＬＰＣによる分岐が最大パフォーマンスを提供することもできる。
【０１９５】
ＬＰＣを使用するプログラムは、両種類のＦＮＣ‐ＰＡＥインプリメンテーションで実行することができる。ＦＮＣ‐ＰＡＥのために書かれたプログラムは両インプリメンテーション（命令メモリが１つまたは２つ）に対して両立するように構成されているので、命令メモリが１つであることによって生じる遅延スロットは、オペコードの実行に使用すべきではない１。
【０１９６】
２．８．２  明示的プログラムポインタ修飾子
明示的ジャンプは、相対的ジャンプおよびサブルーティンの呼び出し／戻りを含むＡＬＵ命令である。表２に、プログラムポインタＰＰを直接的または間接的に変更するＡＬＵ命令がまとめられている。
【０１９７】
【表１】
2008530642.tif 000006
【０１９８】
表２：ＰＰを変更する命令
明示的ジャンプは、次の命令を定義するＡＬＵ命令である２。各オペコードごとに許可される命令は１つだけである。
【０１９９】
ＪＭＰ‐明示的ジャンプ
明示的ジャンプは伝統的な手法でインプリメントされる。ＪＭＰターゲットは、直接値によって絶対的に定義されるか、または現在のｐｐに対して相対的なレジスタまたはＡＬＵの内容によって定義される。
【０２００】
アセンブラステートメント JMPL <label> によって、絶対的アドレスへのロングジャンプが定義される。
【０２０１】
呼び出し（ＣＡＬＬ）／戻り（ＲＥＴ）
サブルーティンＣＡＬＬおよびＲＥＴは伝統的な手法でインプリメントされる。すなわち、戻りアドレスはスタックにプッシュされ、戻りアドレスはＲＥＴの後にポップされる。
【０２０２】
スタックポインタはＡＧＲＥＧレジスタｓｐである。ＣＡＬＬターゲットアドレスは、１６ビットの直接値によって絶対的に定義されるか、またはレジスタまたはＡＬＵの内容によって定義される。
【０２０３】
１  いずれにせよ、現在のインプリメンテーションでは遅延スロットを使用することは許容されない。
【０２０４】
２  アセンブラ命令ＪＭＰＬ
戻りアドレスは、ｐｐ＋ＩＪＭＰ０１として定義されることに留意されたい。
【０２０５】
２．８．２．１  リンクレジスタ（lnk）
リンクレジスタは、ｃａｌｌおよびｒｅｔのようにスタック演算を要求するペナルティ無しでサブルーティンへ高速アクセスを行うのをサポートする。リンクレジスタは、ルーティンから戻るために復元された次の命令をポインティングするプログラムポインタを記憶するために使用される。
【０２０６】
ｌｎｋは、１６ビット定数をｐｐに加算するかまたはレジスタ値またはsetlnki、またはＡＬＵ値をｐｐに加算するsetlinkrオペコードによって明示的にセットすることができる。
【０２０７】
ＨＰＣポインタおよびＬＰＣポインタ（０ｘ１Ｆ符号。２．８．１を参照せよ）の特別な暗示的ｐｐ修飾子が、次の命令の絶対的アドレスとしてレジスタｌｎｋの内容を選択する。ｌｎｋ命令はリンクレジスタの内容をｐｐに移動する。このようにして、ｌｎｋレジスタに先行して記憶されたアドレスは新規の実行アドレスとなる。
【０２０８】
２．９  ロード／記憶ユニット
ロード／記憶ユニットは、ＡＧＲＥＧ、アドレス発生器、メモリインレジスタおよびメモリアウトレジスタを有する。
【０２０９】
ロード／記憶ユニットは、ＡＬＵデータパスの実行に並行して、データメモリに対するアドレスを発生する。ロード／記憶ユニットは、最大８つのベースポインタをサポートする。８つのベースポインタのうち１つは、スタック演算（プッシュ、ポップ、呼び出し、ｒｅｔ）が使用されている場合には常に、スタックポインタとして専用に使用される。Ｃコンパイラでは、別のベースポインタがフレームポインタｆｐとして専用に使用される。さらにｂｐ５およびｂｐ６は、ポストインクリメント／ポストデクリメントによるアドレスポインタａｐ０およびａｐ１として使用することができる。
【０２１０】
【表２】
2008530642.tif 000007
【０２１１】
表３：ＡＧＲＥＧ機能
２．９．１  アドレス発生器
すべてのロード／記憶アクセスは、メモリアドレスを発生するためにベースポインタｂｐ０．．．ｂｐ７のうち１つを使用する。オプションとして、図３に示されたようにオフセットを加算することができる。データＲＡＭアドレス出力が、バイトアドレスを供給する。
【０２１２】
１  このことは、戻りアドレスに１を加算する通常のマイクロプロセッサインプリメンテーションとは異なる。
【０２１３】
アドレス発生器は、以下のソースを加算するのに使用される：
・ａｐ０（表４のポストインクリメントモード／ポストデクリメントモードを参照されたい）
・ａｐ１（表４のポストインクリメントモード／ポストデクリメントモードを参照されたい）
・0
・ロード演算のためのオペコードに由来する６ビット正負符号付き定数
・レジスタｒ０．．．ｒ７
・ｅ１，ｅ３，ｅ５，ｅ７に制限されたＥＲＥＧレジスタ
2008530642.tif 000008
図３：アドレス発生器およびＡＧＲＥＧ
表４に、自動増分モード／自動減分モードを定義する任意選択肢がまとめられている。これらの任意選択肢は、ｂｐ５／ａｐ０およびｂｐ６／ａｐ１に使用可能である。
ポストインクリメントおよびポストデクリメントを行うためのモードは、オペコードに依存する。バイトロード／記憶（stb, ldbu, ldbs, cpw）では、ａｐ０ないしはａｐ１はそれぞれ１つずつ増分または減分される。ワードロード／記憶（stw, ldw, cpw）では、ａｐ０ないしはａｐ１はそれぞれ２つずつ増分または減分される。
【０２１４】
【表３】
2008530642.tif 000009
【０２１５】
表４：アドレス発生器モード
２．１０  メモリロード／記憶命令
記憶演算は、データをメモリに書き込む際にパイプラインステージを使用する。しかしハードウェアインプリメンテーションは、プログラマからパイプラインを隠す。メモリ記憶演算は常に、アドレス計算のためにアドレス発生器を使用する。記憶演算は、バイトで実行されるかまたは１６ビットワードで実行される。バイト順序はリトルエンディアンであるから、アドレスライン０＝０は１６ビットワード１のＬＳＢを選択する。
【０２１６】
注意点：
オペコードごとに実行できるロードまたは記憶演算は１つだけである。
【０２１７】
【表４】
2008530642.tif 000010
【０２１８】
表５：記憶命令
先行のサイクルでロード命令によって読み出されたデータは、ＡＬＵデータパスのｍｅｍレジスタで使用できる。このデータは、ロード演算結果が出された後の１サイクル後に、ターゲット（たとえばレジスタのうち１つ、ＡＬＵ入力端）において使用される。ロード演算は１６ビットワードのロードと、正負符号付きバイトおよび正負符号無しバイトとをサポートする。
【０２１９】
１  デバッガは、ワードの右側にＬＳＢを有する１６ビットワードとして定義されたメモリセクションを示す。
【０２２０】
【表５】
2008530642.tif 000011
【０２２１】
表６：ロード命令
Ｍｅｍ‐ｏｕｔからレジスタへの読み出しには、移動演算が必要である。
スタック演算にはｂｐ７／ｓｐが必要であり、各演算はそれにしたがってｓｐを変更する。
【０２２２】
【表６】
2008530642.tif 000012
【０２２３】
表７：スタック命令
２．１１  ローカルメモリ
ＦＮＣ‐ＰＡＥはハーバード処理モデルを使用してインプリメントされる。それゆえ少なくとも１つのメモリと１つの命令メモリとが必要とされる。両メモリとも高速ＳＲＡＭとしてインプリメントされるので、１つのパイプラインステージのみによる演算が可能である。
【０２２４】
２．１１．１  命令メモリ
命令メモリは２５６ビット幅である。これによって、ＶＬＩＷと同様の命令フォーマットがサポートされる。典型的な埋込アプリケーションでは、プログラムメモリは１６〜２５６エントリの大きさでなければならない。プログラムポインタｐｐは、１つのオペコードを保持するプログラムメモリの１つの２５６ビットワードをアドレス指定する。
【０２２５】
低優先度継続（ＬＰＣ）を遅延スロット無しでサポートするためには、第２の命令メモリが必要とされる。しかし、第２の命令メモリは格段に小さくすることができ、典型的にはメイン命令メモリの１／４〜１／１６で十分である。
【０２２６】
２．１１．２  ローカルデータメモリ
ＡＬＵワード幅に関しては、データメモリは１６ビット幅である。典型的な埋込アプリケーションでは、データメモリは２０４８〜８１９６エントリの大きさでなければならない。メモリには、アドレス発生器と、メモリ書き込み用のＭｅｍ‐ｉｎレジスタと、メモリ読み出し用のＭｅｍ‐ｏｕｔレジスタとを使用してアクセスする。
【０２２７】
データメモリは、第１レベルキャッシュとしてメモリ階層構造に組み込まれる。キャッシュの選択は、タイムクリティカルなデータのタイミング挙動を予測可能にするために、ロックすることができる。
【０２２８】
付加的なブロック移動コマンドによって、ＡＬＵデータパスを使用せずに、メモリ間転送と外部メモリとのデータ交換とを実現できる。
【０２２９】
ブロック移動ユニットは、未だインプリメントされない。
【０２３０】
２．１２  ＡＬＵ
２．１２．１  ＡＬＵ命令
ＡＬＵは基本的な計算機能を提供する。すべてのオペコードがすべての位置において有利または可能であるというわけではなく、命令メモリにおいて使用可能なオペコードビットのビット数は２５６に制限される。さらに、オペコードの許可されているソースおよびターゲット（表８を参照せよ）は、ロウ間ののＡＬＵと異なることができる。
【０２３１】
１  キャッシュのインプリメンテーションに関する詳細は、使用中のインプリメンテーションに依存する。
【０２３２】
【表７】
2008530642.tif 000013
【０２３３】
表８：ＡＬＵハードウェア命令サマリ
２．１２．２  命令の可用性
以下の表に、ＡＬＵ命令の可用性がまとめられている。行はＡＬＵを指定し、列は、許可されるオペランドソースおよびオペランドターゲットを指定する。
【０２３４】
・（ｘ）：命令が使用可能である
・（ｏ）アドレス発生器に対するオフセットソース＋ベースポイントのうち１つ・（ｆ）ｓｒｅｇに書き込まれる結果フラグ
・（ｉ）未だインプリメントされていないシャドウレジスタサポート
・（ｂ）状態ポートへ転送されるビットは２つのみである
・（？）最終的なインプリメンテーションに依存する
２．１２．２．１  算術命令、論理命令およびＳＦＵ命令
これらの命令が２つのソースおよび１つのターゲットを定義する。算術／論理オペコードには、 nop, not, , and, or, xor, add, sub, addc, subc, shru, shrs および shlが含まれる。
【０２３５】
【表８】
2008530642.tif 000014
【０２３６】
表９：算術命令、論理命令およびＳＦＵ ＡＬＵ命令
２．１２．２．２  移動命令
この命令は、ソースをターゲットに移動する。
【０２３７】
【表９】
2008530642.tif 000015
【０２３８】
表１０：移動命令
２．１２．２．３  ロード／記憶命令
この命令はＡＬＵ間でデータを転送するか、またはレジスタファイルをメモリから転送しメモリへ転送する。このコピー命令によって、メモリ内においてソースおよびターゲットを定義することができる。アドレス発生器は前記ベースポインタ（ｂｐ０．．．ｂｐ７）のうち１つと、テーブルで指定されたオフセットとを使用する。オプションとして、ポストインクリメント／ポストデクリメントをａｐ０およびａｐ１とともに使用することができる。
【０２３９】
【表１０】
2008530642.tif 000016
【０２４０】
表１１：メモリロード／記憶命令
プッシュ／ポップは、ポストデクリメントまたはプリインクリメントのいずれかを伴うスタックポインタとしてｂｐ７／ｓｐを使用する。スタックからのポップにより、結果はレジスタに直接ロードされる。すなわち、ｍｅｍ‐ｏｕｔレジスタを使用せずに、ロード／記憶演算と同様にロードされる。
【０２４１】
【表１１】
2008530642.tif 000017
【０２４２】
表１２：プッシュ／ポップ命令
２．１２．２．４  プログラムポインタ変更命令
この命令は、プログラムポインタを暗示的に変更する。ＳＥＴＬＮＫオペコードをここに挙げる。その理由は、ＳＥＴＬＮＫオペコードはｐｐを、次のｒｆｌ命令によって間接的に変更するからである。
【０２４３】
【表１２】
2008530642.tif 000018
【０２４４】
表１３：ｌｎｋを介するジャンプ、呼び出し、呼び出し
【表１３】
2008530642.tif 000019
【０２４５】
表１４：リンクレジスタロード命令
戻りを行うためには、スタック、ｌｎｋレジスタまたは割込ｌｎｋレジスタｉｎｔｌｎｋを使用することができる。
【０２４６】
【表１４】
2008530642.tif 000020
【０２４７】
表１５：サブルーティンおよびｌｎｋからの戻り
２．１２．２．５  ポート読み出し／書き込み命令
この命令はポートへの読み出しまたは書き込みを行う。ＲＤＳおよびＷＲＳが、状態レジスタの２つのビットをポートから転送し、ポートへ転送する。
【０２４８】
【表１５】
2008530642.tif 000021
【０２４９】
表１６：ポート読み出し／書き込み命令
２．１２．２．６  雑命令
・hitはプロセッサを停止する。
【０２５０】
・intenは割込をイネーブルする。
【０２５１】
・intdisは割込をディスエーブルする。
【０２５２】
【表１６】
2008530642.tif 000022
【０２５３】
表１７：雑命令
２．１２．３  多義的なターゲット
複数のＡＬＵが１サイクル内で、同一のターゲットレジスタに書き込みを試行することができる。この場合、以下の優先度リストを適用する：
【表１７】
2008530642.tif 000023
【０２５４】
表１８：レジスタ書き込み優先権
最高優先度を有するオブジェクトのみがターゲットに書き込む。別のオブジェクトの書き込み試行は破棄される。
【０２５５】
２．１３  レジスタサマリ
以下のセクションの表には、ＦＮＣ ＰＡＥ内のレジスタがまとめられている。
【０２５６】
２．１３．１  汎用レジスタ
【表１８】
2008530642.tif 000024
【０２５７】
表１９：汎用レジスタファイル
２．１３．２  アドレス発生器レジスタ
【表１９】
2008530642.tif 000025
【０２５８】
表２０：ＡＧレジスタ
２．１３．３  Ｍｅｍ‐ｉｎレジスタ、Ｍｅｍ‐ｏｕｔレジスタ
メモリレジスタは、ＦＮＣコアとメモリとの間の転送に使用される。メモリ（ｌｄｗ，ｌｄｂｕ，ｌｄｂｓ）からの読み出しにより、ｍｅｍ‐ｏｕｔに結果値がロードされる。ＡＬＵは次のサイクルでレジスタにアクセスすることができる。レジスタへの書き込みは、記憶命令によって暗示的に実行される。Ｒａｍは次のサイクルで書き込まれる。
【０２５９】
【表２０】
2008530642.tif 000026
【０２６０】
表２１：Ｍｅｍレジスタ
２．１３．４  リンクレジスタおよびIntlnkレジスタ
ｌｎｋレジスタおよびintlnkレジスタはプログラムポインタを記憶する。レジスタを読み出すことはできない。
【０２６１】
【表２１】
2008530642.tif 000027
【０２６２】
表２２：リンクレジスタ
２．１３．５  状態レジスタ
状態レジスタに直接アクセスすることはできないが、第１のＡＬＵロウにおける条件付きステートメントはこのレジスタを使用する。
【０２６３】
【表２２】
2008530642.tif 000028
【０２６４】
表２３：状態レジスタビット
２．１３．６  ポート
Ｉ／Ｏポートの使用は、以下のように定義されている。
【０２６５】
【表２３】
2008530642.tif 000029
【０２６６】
表２４：ポート
２．１４  ＳＦＵ
ＦＮＣ‐ＰＡＥは最大１６個のＳＦＵをサポートし、これらはそれぞれ、最大７つの異なる定義のＳＦＵ命令を実行することができる。ＳＦＵはＡＬＵデータパスに並列して動作する。各命令は最大２つのＳＦＵコマンドを含むことができる。各ＳＦＵコマンドは、ボトムロウにおいてａｌ３またはａｒ３をディスエーブルする。ＳＦＵ演算の結果はボトムマルチプレクサへ供給され、ディスエーブルされたａｌ３の結果は供給されない。ＳＦＵ命令は無条件であり、各ＡＬＵパスがアクティブであるか、またはそうでないかで実行される。
【０２６７】
ＳＦＵは、ソースとしてすべてのレジスタにアクセスできるが、ＡＬＵ出力側にはアクセスできない。
【０２６８】
表２５に、ＳＦＵ命令フォーマットが示されている。
【０２６９】
ビットフィールド
ビット
2008530642.tif 000030
【０２７０】
表２５：ＳＦＵ命令フォーマット
ＳＦＵは３２ビットの結果を生成することができる（たとえば乗算）。この場合、結果は２つの隣接するレジスタに書き込みされ、ターゲットレジスタは偶数であることが要求される。結果の最下位の１６ビットワードは偶数のレジスタに書き込まれ、最上位ワードは奇数のレジスタに書き込まれる。
【０２７１】
１６個のＳＦＵではそれぞれ、コプロ命令＝７がマルチサイクルＳＦＵのために確保されている。（２．１４．１を参照されたい）Ｃｏｐｒｏ＃は、最大１６個のＳＦＵのうち１つを選択する。ＳＦＵ０〜７は、ＰＡＣＴ標準版のために確保されている。
【０２７２】
２．１４．１ マルチサイクルＳＦＵ
典型的にはＳＦＵは、ＡＬＵデータパスによって決定されたタイムスロット（１サイクル）内で演算を処理することが要求される。ＳＦＵが複数のサイクルを必要とする場合（たとえば分割）、結果の使用の可否を識別する有効フラグをサポートしなければならない。パイプラインＳＦＵ演算は、複数のＳＦＵコマンドを出すことによってサポートされる。結果が使用可能であることが有効フラグによって示され、かつ新規のＳＦＵコマンドが出された場合、その結果はレジスタファイルに書き込まれる。ＳＦＵはすべて、レジスタファイルに使用可能な結果を書き込む"SFU Write Back" コマンド（ＣＷＢ，ＣＭＤ＝７）をサポートしなければならない。
【０２７３】
２．１４．２  ＳＦＵ ０
ＳＦＵ ０は、１６ビットオペランドに符号付き乗算および符号無し乗算を施す。その結果の最下位ワードは、指定されたターゲットレジスタに書き込まれる。最上位ワードは破棄される。
【０２７４】
結果はそのターゲットレジスタにおいて、次のクロックサイクルで使用される。
【０２７５】
【表２４】
2008530642.tif 000031
【０２７６】
表２６：ＳＦＵ ０命令
２．１４．３  ＳＦＵ １
ＳＦＵ１は、ポートからのビットのブロックを読み出しおよび書き込みする特別関数を提供する。
【０２７７】
ビットブロック入力（ｉｂｉｔ）
ＳＦＵはポートから１６ビットワードを読み出し、指定された数のビットをターゲットにシフトする（左シフト）。すべてのビットが「消費」完了されると、新規の１６ビットワードが読み出される。
【０２７８】
ビットブロック出力（ｏｂｉｔ）
ソースの指定された数のビットは、ＳＦＵに左シフトされる。１６ビット全体がシフト完了されると直ちに、ＳＦＵはこのワードを出力ポートに書き込む。
【０２７９】
【表２５】
2008530642.tif 000032
【０２８０】
表２７：ＳＦＵ １命令
メモリ階層構造
ＦＮＣ‐ＰＡＥは、データ（ＤＭＥＭ）と符号（ＩＭＥＭ）とで別個のメモリを使用する。異なるコンセプトがインプリメントされる：
・ＤＭＥＭは密結合されたメモリ（ＴＣＭ）であり、プログラマによって明示的に制御される。
【０２８１】
・ＩＭＥＭは、４方向結合のキャッシュとしてインプリメントされ、プログラマに対してトランスペアレントである。
【０２８２】
ＦＮＣ‐ＰＡＥの外側の次の階層レベルは、ＳｏＣにおけるシステムインプリメンテーションに依存する。本マニュアルでは、面積とパフォーマンスとの間で良好な均衡性を提供する参考的設計を想定する。この参考的設計は、４方向結合キャッシュと、外部のＧＧＤＲ３ ＤＲＡＭに対するインタフェースとから成る。幾つかの機能ＰＡＥは汎用３２ビットアドレス空間にマッピングされ、両インタフェースを共用する。インタフェースへのアクセスは公平に調停される。
【０２８３】
2008530642.tif 000033
【０２８４】
図４：メモリ階層構造
図４は、幾つかのＰＡＥにわたるメモリ階層構造の基本的構造と、共用Ｄキャッシュと、共用Ｓｙｓｍｅｍインタフェースとを示す。命令デコーダはローカルＩＲＡＭにアクセスし、ローカルＩＲＡＭは該ローカルＩＲＡＭのＬＲＵアクセスメカニズムにしたがって内容を自動更新する。ロード‐記憶ユニットは、ローカルＴＣＭまたは共用Ｄキャッシュまたは共用ＳＹＳＭＥＭにアクセスすることができる。ＴＣＭはプログラムの明示的制御によって、ロード／記憶オペコードを使用して更新するか、またはブロック移動ユニットを使用して更新しなければならない。すべてのデータバスは２５６ビット幅である。したがって、２５６ビットオペコードを１サイクルで転送するか、ブロック移動ユニットを使用して最大８×１６ビット（１６ビット配列）を転送することができる。
【０２８５】
注意点
ＤキャッシュおよびＳＹＳＭＥＭのインプリメンテーションは、本書の記載にはない。
【０２８６】
しかし、ＳＹＳＭＥＭは可能な限り高い帯域幅をサポートするように設計しなければならない。
【０２８７】
（たとえば外部ＤＲＡＭへのバースト転送を使用することによって設計する）。
【０２８８】
Ｄキャッシュ調停：
・最高優先度はＦＮＣ０を有する。
【０２８９】
・ＦＮＣ１〜ＦＮＣｎはラウンドロビンを使用する。
【０２９０】
ＳＹＳＭＥＭ調停：
・最高優先度はＦＮＣ０を有する。
【０２９１】
・ＦＮＣ１〜ＦＮＣ３の優先度は下降していく。
【０２９２】
・ＦＮＣ４〜ＦＮＣｎはラウンドロビンを使用する。
【０２９３】
２．１５．１１  ブートストラップ
定義する必要がある
２．１５．１．２  ＡＬＵ／ＲＡＭ‐ＰＡＥアレイ（リ）コンフィギュレーションおよびＦＮＣ‐ＰＡＥブート
ＦＮＣ‐ＰＡＥのうち１つのＦＮＣ‐ＰＡＥのブロック移動ユニットは、別のＦＮＣ‐ＰＡＥをブートするか、または、外部メモリから符号またはコンフィギュレーションデータをフェッチすることによって、ＡＬＵ／ＲＡＭ‐ＰＡＥのアレイを（再）構築することができる。別のデバイスが構築されている間は、ブロック移動ユニットは再構築またはブートすべきターゲットを選択する。それと同時に、ブロック移動ユニットはコンフィギュレーション出力信号を上昇して、ターゲットユニットに対してコンフィギュレーションサイクルを指示する。
【０２９４】
２．１６  ＸＰＰアレイへの組み込み
ＦＮＣ‐ＰＡＥは、ＸＰＰアレイの偶数ロウのＲＡＭ‐ＰＡＥの近傍に接続される。ＦＮＣ‐ＰＡＥは、ＸＰＰアレイデータパスを通る必要なく、ＦＮＣ‐ＰＡＥコア間または外部コンポーネント間でデータを直接交換するためのポートを有する。
【０２９５】
２．１７  プランニングされている拡張
幾つかのフィーチャは未だインプリメントされておらず、以下のセクションでまとめる。
【０２９６】
２．１７．１  シャドウレジスタファイル
ｐｐを変更するすべての命令はＳＤＷ（シャドウ）ビットを有し、ジャンプ後に使用すべきレジスタファイルを選択する。ＳＤＷが１にセットされている場合、シャドウレジスタファイルは使用されている。ｒｅｔ命令およびｌｎｋ命令に対しては、ＳＤＷビットは呼び出しサブルーティンによって復元される。
【０２９７】
シャドウレジスタの使用は、未だインプリメントされていない。
【０２９８】
２．１７．２  遅延スロットにおけるオペコード実行
メモリがアクセスされている間、パイプラインステージに起因して遅延スロットを引き起こすオペコードが幾つか存在する。ＨＰＣは遅延スロットを発生しないが、ターゲット命令を次のサイクルで実行する。パフォーマンスが低いインプリメンテーションでＬＰＣによって引き起こされる遅延スロットは、両立性の理由から使用すべきではない。ＩＪＭＰ０によって引き起こされる遅延スロットは、別のオペコードを実行するために使用することはできない。
【０２９９】
ｊｍｐおよびｃａｌｌ（アセンブラステートメントＪＭＫＬ，ＣＡＬＬ）は、別のオペコードによって使用できる遅延スロットを１つ引き起こす。ｒｅｔは２つの遅延スロットを引き起こす。
【０３００】
遅延スロットをオペコード実行に使用することは、アプリケーションの種類でこのようなふるまいが許容される限りは、ジャンプ中のパフォーマンス低減を解消する。しかし、プログラムまたはスタックポインタを変更する演算は禁止される。さらに、ＲＥＴによって引き起こされた第１の遅延スロット中は、メモリアクセスは不可能である。
【０３０１】
現在のインプリメンテーションでは、遅延スロットを使用することはできない。
【０３０２】
２．１７．２．１  複数のセグメントにわたるジャンプ
ＦＮＣオペコードの定義は、最大４つのプログラムセグメントポインタ（ｐｓｐ）を使用してロングジャンプを行うためのビットを確保している。
【０３０３】
このフィーチャは、将来の拡張のためにプランニングされている。
【０３０４】
２．１７．３  データセグメントポインタ
この命令フォーマットは、最大４つのデータセグメントポインタを定義するために使用される。セグメントを選択することにより、アドレス指定可能なメモリ空間が拡張される。
【０３０５】
第３章
アセンブラ
機能ＰＡＥはアセンブラ言語でプログラミングすることができ、第２のプロジェクトフェーズではＣ言語でプログラミングすることができる。ＦＮＣアセンブラは、ハードウェアが提供するすべてのフィーチャをサポートする。したがって、高パフォーマンスのアプリケーションに最適な符号を書き込むことができる。アセンブラ言語は、習得するのが容易な幾つかの要素のみを提供する。標準的なＣプリプロセッサを使用することにより、"#"シンボルが前に置かれたコマンドを定義することができる。たとえば #include は、#if...#endif を有する条件付きアセンブリである。
【０３０６】
組み込まれたアセンブラ、シミュレータおよびデバッガであるＦＮＣＤＢＧは、プログラムをサイクル精度でシミュレートおよびテストするために使用される。デバッガは、すべてのＡＬＵ出力、レジスタファイルおよびメモリ内容を示す。これは、プログラムにわたる単独のステップと、ブレークポイントの定義とを使用する。
【０３０７】
３．１  一般的なアセンブラ要素
３．１．１  オペコード構文
アセンブラは大部分の命令に、典型的なツリーアドレス符号を使用する。ターゲットおよび２つのソースを定義することができる。複数のＡＬＵ命令をマージして１つのＦＮＣオペコードを形成することができる。右側のＡＬＵパスは "|" によって左側のＡＬＵパスから分離される。各ＦＮＣオペコードは、キーワード 'NEXT' によって終了される。
【０３０８】
例である図５に、１つのオペコードの構造が示されている。ＡＬＵのロウが必要でない場合、オープンのままにすることができる（アセンブラはここで自動的にＮＯＰを挿入する）。
【０３０９】
この例には、ＯＰＩ条件によって右側パスに分岐する典型的なオペコードが示されている。
【０３１０】
2008530642.tif 000034
【０３１１】
図５：アセンブラオペコード構造
カラム区切りおよび右側カラムに対する命令を、次の符号ラインに書き込むこともできる。このことにより、コメントの編集および書き込みを簡略化することができる（第３．６．４章を参照されたい）。カラム区切りが定義されていない場合、アセンブラはこの命令を左側カラム（左側パス）にマッピングする。プログラムポインタの変更が必要ない場合、アセンブラはＨＰＣを自動的に、次のオペコードをポインティングするようにセットする。
【０３１２】
３．１．２  コメント
コメントは次のものによって指定される。
【０３１３】
・";" ラインの終了まで
・"//" ラインの終了まで
・/*コメント*/ ネスティングされたコメントが可能である。
【０３１４】
３．１．３  数、定数およびエイリアス
数は、
・正負符号付き１０進数
・構文０ｘ００００を有する１６進数
・構文０ｂ００００００００００００００００を有する２進数
を有することができる。
【０３１５】
定数定義の前に、キーワードＣＯＮＳＴが先行する。定数表現は、小括弧 ( ) 内になければならない。
【０３１６】
例
CONST max_line_count = 96
CONST line_length = 144
CONST frame = max_line_count * line_lenght
CONST macroblock_last_element = ((8*8) - 1)
CONST frame =
CONST MB_I4x4 = 0
エイリアスの前には ALIAS が先行する。
【０３１７】
例
ALIAS state = r6
ALIAS ctx = r7
ALIAS trnsTab = bp3
３．１．４  オブジェクトネーミング、デフォルトエイリアス
【表２６】
2008530642.tif 000035
【０３１８】
表２８：オブジェクトおよびレジスタのアセンブラネーミング
直接値の前には "#" が来る。直接値の許可されたビットの数はＡＬＵ命令に依存する。
【０３１９】
固有の命令に対してどの直接値が使用可能であるかの定義に関しては、表９〜表１７を参照されたい。
【０３２０】
３．１．５  ラベル
ラベルは命令メモリ内のアドレスを定義し、オペコード間であればどこでも定義することができる。ラベルはコロン ":" によって区切られる。命令ＪＭＰＬ，ＪＭＰＳ，ＨＰＣ，ＬＰＣおよびＣＡＬＬはラベルを参照する。さらに、データメモリセクションもラベルを使用してネーミングすることができる。データセクションに関しては、アセンブラはバイトアドレスをラベルに割り当て、プログラムメモリに関しては、アセンブラは絶対的なエントリを割り当てる（２５６ビットオペコードワード）。リセットおよび割込のために確保されたラベルの定義に関しては、セクション３．５を参照されたい。
【０３２１】
オプションとして、ラベルへのジャンプ時に使用されるようにセットされたレジスタセットを、（ＲＳ０）および（ＲＳ１）のいずれかを有する指定子とすることができる。
【０３２２】
３．１．６  メモリ
命令ＲＡＭ
命令ＲＡＭはキーワードＦＮＣ＿ＩＲＡＭ（０）によって初期化される。このパラメータ（ここでは０）は、命令メモリセクションの割当先であるＦＮＣ‐ＰＡＥコアを定義する。ＦＮＣ＿ＩＲＡＭ（０）は、別のＲＡＭセクションが定義された場合にのみ指定すればよい（デフォルトはＦＮＣ＿ＩＲＡＭ（０）である）。
【０３２３】
データＲＡＭ
データＲＡＭセクションは、キーワードＦＮＣ＿ＤＲＡＭ（０）によって指定される。このパラメータ（ここでは０）は、命令メモリセクションの割当先であるＦＮＣ‐ＰＡＥコアを定義する。
【０３２４】
さらに、データメモリセクションもラベルを使用してネーミングすることができる。セクションの長さは、データが初期化されない場合に、指定しなければならない。
【０３２５】
RAMSECTION; BYTE [length] ?
or
RAMSECTION; WORD [length] ?
"?" シンボルは、未初期化データを指定する。長さは、バイトの数またはワードの数のいずれかである。ワードは、ビッグエンディアンバイト順序によって２つのバイトを確保する１。ＭＳＢはアドレスビット０＝０によってアドレス指定される。すなわち、最下位の記憶アドレスで記憶されている。
【０３２６】
データセクションは、値リストを使用して初期化することもできる。
【０３２７】
RAMSECTION: BYTE <list of values>2
１  現在、ビッグエンディアンがサポートされている。また、リトルエンディアンモードも可能にすることがプランニングされている。したがってＦＮＣＤＢＧは、ワード内の確保済みバイトの順序による初期化された該ワードを表示する。
【０３２８】
２  ２００５年１２月２６日からのＸＤＳＤＢＧは、数の前に # シンボルを必要とする。
【０３２９】
この値は、スペース文字によって分離される。第１の値は最下位アドレスにロードされる。
【０３３０】
データセクションはデータＲＡＭにおいて、定義の順序で確保されている。プログラムにおいてＲＡＭセクションをポインティングするために、ラベルを使用することができる。
【０３３１】
例
2008530642.tif 000036
【０３３２】
注意点：
ＦＮＣＤＢＧは未初期化データＲＡＭセクションに、次のようなデフォルト値を満たす：
・0xfefe：確保されたデータセクション
・0xdede：自由なＲＡＭ
ＦＮＣＤＢＧは右側の別個のフレームにおいて、メモリ内容を示す。（複数の）先行のサイクルで変更されたバイトまたはワードは赤色で強調されている。
【０３３３】
2008530642.tif 000037
【０３３４】
図６：ＦＮＣＤＢＧ ＲＡＭ表示
２．７  条件付き演算
算術ＡＬＵ命令および移動ＡＬＵ命令は、条件のうち１つによって事前固定化することができる。どのＡＬＵ命令に条件を指定できるかの制限に関しては、表９〜表１７の「条件」列を参照されたい。
【０３３５】
ＡＬＵの状態フラグは、当該ロウの下の同一のカラムのＡＬＵに対して評価に使用される。条件がＴＲＵＥである場合、このロウの後続のＡＬＵがイネーブルされる。条件が偽である場合、条件ステートメントを有するＡＬＵと当該カラムのすべての後続のＡＬＵは、指定されたソースに結果を書き込まない１。
【０３３６】
ボトムカラム（ａｌ３，ａｒ３）のＡＬＵの状態は状態レジスタに書き込まれ、次のオペコード中に第１のロウにおいてＡＬＵによる評価のために使用される。
【０３３７】
ＯＰＩ（opposite column inactive）条件およびＯＰＡ（opposite column active）条件は、反対側のカラムの動作状態に基づいて、アクティブ状態のカラムをディスイネーブルするのに使用される。ＡＣＴによって、ディスイネーブルされているカラムを再びイネーブルすることができる。
【０３３８】
ＬＣＬ（last column active left）およびＬＣＲ（last column active right）はそれぞれ、先行のオペコードのＡＬＵの最終ロウの状態を反映する条件として使用される。
【０３３９】
このような条件は、３つのＡＬＵフラグから導き出される：
・ＺＥ：結果がゼロであった
・ＣＹ：繰り上げ
・ＯＶ：あふれを伴う結果
１  いずれにせよ、ディスイネーブルされたＡＬＵは出力側で、別のＡＬＵによって使用可能な結果を供給する。
【０３４０】
【表２７】
2008530642.tif 000038
【０３４１】
表２９：条件
３．１．８  プログラムフロー
ＦＮＣ‐ＰＡＥは古典的な意味ではプログラムカウンタを有さず、その代わり、プログラムポインタが次のオペコードをポインティングしなければならない。アセンブラによって、次のオペコードを定義する３つのオペコードフィールドであるＨＰＣ，ＬＰＣおよびＩＪＭＰ０をセットすることができる。このような分岐の最大分岐距離は±３１である。アセンブラ命令は別個のソース符号ラインで定義しなければならない。
【０３４２】
３．１．８．１  ＥＸＩＴ分岐
ＨＰＣ命令、ＬＰＣ命令およびＪＭＰＳ命令は、カラムから出る際に次のオペコードを定義する。ＨＰＣ，ＬＰＣまたはＪＭＰＳを指定できるのは、カラムごとに１回のみである。相対的ポインタは、±１５の範囲内になければならない。この範囲外の分岐では、ＪＭＰＬを使用しなければならない。
【０３４３】
構文
・デフォルト：ＨＰＣ，ＬＰＣまたはＬＭＰＳの指定が無い場合、ＨＰＣフィールドはｐｐ＋１をポインティングする。
【０３４４】
・ＨＰＣ ＨＰＣはｐｐ＋１をポインティングする。
【０３４５】
・ＨＰＣラベル ＨＰＣはラベルをポインティングする。
【０３４６】
・ＨＰＣ #const ＨＰＣはｐｐ＋ｃｏｎｓｔをポインティングする。
【０３４７】
・ＬＰＣ ＬＰＣはｐｐ＋１をポインティングする。
【０３４８】
・ＬＰＣラベル ＬＰＣはラベルをポインティングする。
【０３４９】
・ＬＰＣ #const ＬＰＣはｐｐ＋ｃｏｎｓｔをポインティングする。
【０３５０】
・ＪＭＰＳ ＪＭＰＳはｐｐ＋１をポインティングする。
【０３５１】
・ＪＭＰＳラベル ＪＭＰＳはラベルをポインティングする。
【０３５２】
・ＪＭＰＳ #const ＪＭＰＳはｐｐ＋ｃｏｎｓｔをポインティングする。
【０３５３】
ポインタの定義では、アセンブラは以下のスキームを使用する：
・ＥＬＳＥ分岐の指定（３．１．８．２を参照されたい）が優先権を有する。指定されたポインタは、このようなセッティングによって満たされる。
【０３５４】
その後、アセンブラコードで指定された定義は、未使用のポインタに満たされる。カラムにおいて何も指定されていない場合、ＨＰＣがＪＭＰＳに未だ満たされていない場合にはＨＰＣが使用され、そうである場合には、ＬＰＣがすでにＪＭＰＳに満たされていない場合、ＬＰＣが使用される。
【０３５５】
以下の表（表３０，表３１）は、どのポインタにアセンブラが（設計時に）入るか、どのポインタがカラムの実行時間動作状態に基づいて使用されるかを指定する。「デフォルト」とは、出口ポインタがアセンブラコードで明示的に指定されていないことを意味する。右側カラムに対するセッティングは、左側カラムが非アクティブ状態でありかつ右側カラムがアクティブ状態である場合にのみ適用される。
【０３５６】
注意点：
ＥＬＳＥ分岐による挙動に関しては、３．１．８．２を参照されたい。ＥＬＳＥ分岐が適用される場合、出口セッティングはオーバーライドされる。ロングジャンプ（ＪＭＰＬ）も出口セッティングをオーバーライドする。
【０３５７】
【表２８】
2008530642.tif 000039
【０３５８】
表３０：ＥＸＩＴ挙動（１）
【表２９】
2008530642.tif 000040
【０３５９】
表３１：ＥＸＩＴ挙動（２）
３．１．８．２  ＥＬＳＥ分岐
ＡＬＵ命令の中には、「ＥＬＳＥ」分岐を定義するＡＬＵ命令が幾つか存在する。ＥＬＳＥ分岐は条件付きＡＬＵ命令の結果を評価して、ターゲットまたはデフォルトによって指定されたように次のオペコードをポインティングするようにＨＰＣ，ＬＰＣまたはＪＭＰＳのうち１つを定義する（ターゲットが指定されていない場合）。どのＡＬＵ命令にＥＬＳＥが分岐を許可するかの制限に関しては、表９〜表１７の「ＥＬＳＥ」列を参照されたい。
【０３６０】
条件がＴＲＵＥである場合、ＡＬＵカラムはイネーブルされ、ＥＸＩＴ分岐に対するセッティングが使用される。
【０３６１】
条件がＦＡＬＳＥである場合、ＡＬＵカラムはディスイネーブルされ、ＥＸＩＴ分岐に対するセッティングが使用される。
【０３６２】
ＡＬＵカラムが先行の条件によってディスイネーブルされている場合、ＥＬＳＥ分岐は評価されない。
【０３６３】
１つより多くのＥＬＳＥ分岐がオペコードで定義されている場合、ボトム指定が使用される。
【０３６４】
ロングジャンプ（ＪＭＰＬ）は、両ＥＬＳＥ分岐がアクティブ状態である場合、これらのＥＬＳＥ分岐をオーバーライドする。
【０３６５】
構文：
以下に定義されたようなELSEステートメントは、同一の命令ラインに書き込まれなければならない。
【０３６６】
・！ＨＰＣラベル：先行の命令における条件がＦＡＬＳＥであった場合、ＨＰＣを使用する。
【０３６７】
・！ＬＰＣラベル：先行の命令における条件がＦＡＬＳＥであった場合、ＬＰＣを使用する。
【０３６８】
・！ＪＭＰＣラベル：先行の命令における条件がＦＡＬＳＥであった場合、ＩＪＨＰ０を使用する。
【０３６９】
表３２は、ELSEステートメントに基づいてどのポインタを使用するかを示している。このラインにおける条件がＴＲＵＥである場合、ＥＸＩＴ分岐の指定が使用され（表３０，表３１）、条件がＦＡＬＳＥである場合、ELSEターゲット（ｅ）が使用される。
【０３７０】
【表３０】
2008530642.tif 000041
【０３７１】
表３２：ＥＬＳＥ挙動
３．１．８．３  ロングジャンプ
ロングジャンプはＡＬＵ命令ｊｍｐによって実行され、直接値または別のソースをプログラムポインタに加算する。ロングジャンプ命令が実行される場合、ＨＰＣ，ＬＰＣまたはＩＪＭＰ０は無視される。
【０３７２】
構文：
・ＪＭＰＬソース：実際のプログラムポインタに対して相対的なジャンプターゲットとして、レジスタまたはＡＬＵまたは６ビット直接値を使用する。このソースはｐｐに加算される。
【０３７３】
・ＪＭＥＬ #const：相対的なジャンプターゲットとして直接値を使用する。この一定値はｐｐに加算される。
【０３７４】
注意点：
各オペコードごとに許可されるＪＭＰＬ命令は１つだけである。
【０３７５】
３．２  アセンブラ命令
アセンブラは大抵の場合、ＡＬＵ命令を使用する。しかしハードウェア命令のうち幾つかは、プログラミングを簡略化するためにマージされる（たとえばＭＯＶでは、ｍｏｖ、ｍｏｖｒ，ｍｏｖａｉ）。ＡＬＵ命令の他に、命令セットによってプログラムフローをオペコードレベルで制御することもできる（たとえば、次のオペコードをポインティングするためのＨＰＣの定義。先行の章を参照されたい）。
【０３７６】
オブジェクトに対するプレースホルダ：
・ターゲット：結果を書き込む先であるターゲットオブジェクト。ターゲット "-" は、レジスタファイルには何も書き込まれないがＡＬＵ出力は使用可能であることを意味する。
【０３７７】
・ｓｒｃ：ソースオペランド。４ビットまたは６ビットの直接値とすることもできる。
【０３７８】
・ｓｒｃ０：左側ソースオペランド。４ビットまたは６ビットの直接値とすることもできる。
【０３７９】
・ｓｒｃ１：右側ソースオペランド。４ビットまたは６ビットの直接値とすることもできる。
【０３８０】
・const：１６ビットの直接値
・ｂｐｒｅｇ：ＡＧＲＥＧのベースレジスタのうちの１つ
・ポート：Ｉ／Ｏポートのうちの１つ
すべてのＡＬＵ命令がすべてのＡＬＵにおいて使用できるわけではない。制約に関しては、表９〜表１７を参照されたい。
【０３８１】
【表３１】
2008530642.tif 000042
【０３８２】
表３３：アセンブラＡＬＵ命令（１）
注意点：movai（ＭＯＶ‐，＃ＣＯＮＳＴ）は１６ビットの直接値をＡＬＵ出力側へ移動し、これは次のＡＬＵステージによって使用できる。
【０３８３】
【表３２】
2008530642.tif 000043
【０３８４】
表３４：アセンブラＡＬＵ命令（２）
【表３３】
2008530642.tif 000044
【０３８５】
表３５：アセンブラオペコード命令
【表３４】
2008530642.tif 000045
【０３８６】
表３６：アセンブラＳＦＵ ０命令
【表３５】
2008530642.tif 000046
【０３８７】
表３７：アセンブラＳＦＵ１命令
３．３  シャドウレジスタ
シャドウレジスタセットは、以下の手法のうち１つの手法によって選択される：
・ＣＡＬＬ命令、ＪＭＰＬ命令の後ろに指定されるか、またはｌｎｋレジスタがセットされている場合に指定されたＲＳ０（標準的レジスタセット）は、レジスタセット１を選択する。例としてＣＡＬＬ ＲＳ０ラベル１は、標準的レジスタセットを選択する。ＲＥＴは呼び出し側のルーティンのレジスタセットに戻る。
【０３８８】
・ＣＡＬＬ命令、ＪＭＰＬ命令の後ろに指定されるか、またはｌｎｋレジスタがセットされている場合に指定されたＲＳ１（シャドウレジスタセット）は、レジスタセット１を選択する。例としてＣＡＬＬ ＲＳ１ラベル１は、標準的レジスタセットを選択する。ＲＥＴは呼び出し側のルーティンのレジスタセットに戻る。
【０３８９】
・レジスタセットは、構文 label(RS0): または label(RS1): を有するラベルで指定することもできる。ｌｎｋレジスタへのＭＯＶまたはＡＤＤ、このラベルを使用するＣＡＬＬまたはＪＭＰＬはすべて、ラベルによって指定されたレジスタセットに切り換えられる。ＲＥＴは呼び出し側のルーティンのレジスタセットに戻る。
【０３９０】
（ＲＳ０）定義および（ＲＳ１）定義のいずれかのＨＰＣ、ＬＰＣまたはＪＭＰＳは、ラベルをポインティングする。しかし、HPC Ink，LPC Ink，JMPS Ink によってレジスタセットが選択される。
【０３９１】
３．４  入力／出力
スティミュラスをファイルで定義して、ＦＮＣ‐ＰＡＥ Ｉ／Ｏポートを使用して読み出すことができる。その逆に、ポートを介してデータをファイルに書き込むことができる。
【０３９２】
現在は、入力ポートおよび出力ポート０のみがサポートされている。
【０３９３】
ファイルは、コマンド行スイッチを使用して定義しなければならない。
【０３９４】
・-inX <file>、Ｘはポート番号を指定する（現在は０）。
【０３９５】
・-outX <file>、Ｘはポート番号を指定する（現在は０）。
【０３９６】
同様にＳＦＵ命令ＩＢＩＴは、入力ビットフィールドをファイルから読み出す。ＯＢＩＴはビットフィールドをファイルに書き込む。
【０３９７】
ファイルは、コマンド行スイッチを使用して定義しなければならない。
【０３９８】
・-ibit <file>
・-obit <file>
スティミュラスファイル内の番号は１６ビットに適合しなければならず、ホワイトスペース文字によって分離しなければならない。１０進数および１６進数（０×００００）の図形を指定することができる。
【０３９９】
３．５  リセットベクトルおよび割込ベクトル
アセンブラは、プログラムメモリにアドレス０ｘ００００でロードされたリセットおよび割込ベクトルを定義するデフォルトモジュール "ＦＮＣ ＤＩＳＰＡＴＣＨＥＲ" を生成する。これは、リセットおよび最大７つの割込サービスルーティンのエントリポイントへのロングジャンプのリストから成る。
【０４００】
2008530642.tif 000047
【０４０１】
アセンブラは分岐アドレスを、表３８に定義されたような確保済みの各ラベルに挿入する。
【０４０２】
【表３６】
2008530642.tif 000048
【０４０３】
表３８：確保済みラベル
ＦＮＣ＿ＲＥＳＥＴ：ラベルは必須であり、ＩＳＲルーティンのエントリポイントは任意である。
【０４０４】
割込ルーティン（ＩＳＲ）の呼び出し後は、別の割込はディスエーブルされる。ＩＳＲはＥｌ命令によって、ネスティング化された割込に対して、またはＲＥＴＩの実行前に、別の割込をイネーブルしなければならない。
【０４０５】
注意点
ＩＳＲは、スタックまたは別の手段のいずれかを使用して、変更されたレジスタすべてを明示的に保存し、回復しなければならない。
【０４０６】
割込要求は、ＨＰＣを使用するオペコードでのみ許容される。したがって、ＬＰＣまたはＪＭＰＳを使用するオペコードには割込することができない。それゆえ、ループは常に、存在する場合にはＨＰＣおよびＬＰＣを使用しなければならない。
【０４０７】
３．６  例
以下の例は、機能ＰＡＥの基本的なフィーチャを示す。この例では、アーキテクチャのハードウェアフィーチャを示すためにエイリアスを定義しない。
【０４０８】
３．６．１  例１
これらの例はＦＮＣ‐ＰＡＥフィーチャを示すためだけのものであり、幾つかの例は異なって最適化または書かれている場合があるが、このことは例の対象ではない。
【０４０９】
これらの例は、条件無しの基本的な並列演算を示す。
【０４１０】
ｒ１．．．ｒ５およびｅ０．．．ｅ２の内容は累算されてｒ０の結果になる。第１のオペコードは、レジスタに定数をロードする。
【０４１１】
第２のオペコードはレジスタを累算し、結果をｒ０に書き込む。
【０４１２】
ＥＲＥＧＳはロウ０においてソースとして使用できないので、ｒ１．．．ｒ４が第１のロウで加算される。
【０４１３】
2008530642.tif 000049
【０４１４】
３．６．２  例２
この例は、命令レベル（すなわちオペコード内）の条件をどのように使用するかを示す。
【０４１５】
この例では、ｒ１およびｒ２で定義された下限および上限で、レジスタｒ０内の値を区切る。したがって、結果は６ビットの左シフトにより、６４を乗算される。
【０４１６】
2008530642.tif 000050
【０４１７】
図７：命令レベルフローチャート
この演算は、図７に示されたように２つの比較と判定とを必要とする。まず最初に、ｒ０が上限ｒ２と比較される。このことに関しては、ｒ２−ｒ０の減算を行う。結果が０以上である場合（すなわちｒ０≧上限）、カラムＬはディスイネーブルされ、カラムＲはＯＰＩ条件によってイネーブルされる。その後、右側パスはｒ２（上限）をｒ０に移動する。
【０４１８】
第２の比較も左側パスで行わなければならない。ｒ１をｒ０から減算し、結果が下限以上である場合（すなわちｒ０≦下限）、ｒ１はｒ０に移動される。そうでない場合、右側パスがイネーブルされ、さらなる演算は実行されない。図８は実行時間中の挙動を示す。陰影付きのＡＬＵはイネーブルされており、"-" は、これらのＡＬＵがディスイネーブルされていることを意味する。
【０４１９】
2008530642.tif 000051
【０４２０】
図８：異なる３つの実行時間パス（陰影を有するブロックがイネーブルされている）
このコードは、ｒ０に関して３つの異なる値を有する挙動を示す。アセンブラソースで明示的に定義されるＮＯＰオペコードは省略することができる。ＮＯＰがロウで定義されていない場合、アセンブラはこれらを自動的に挿入する。たとえば第２のＯＰＩは必要ではない。というのも、ＮＯＰは何もしないので、ＮＯＰをアクティブ化する必要がないからである。我々は、一般的な原理を図解するためだけにＮＯＰを使用する。
【０４２１】
2008530642.tif 000052
【０４２２】
３．６．３  例３
この例では、命令レベル（すなわちオペコード内）の条件をどのように使用するか、ＨＰＣの条件付き指定によってループをどのように定義するかを示す。さらに、ＦＮＣ‐ＰＡＥコードのコンパクトさも示す。
【０４２３】
この例はｒ０およびｒ１における２つの８ビット番号を連続的に乗算し、ｒ２において結果を得る。ループカウンタはｒ７であり、これは０になるまで減分される。ループカウンタが０でない場合、！ＨＰＣループ（ＥＬＳＥ ＨＰＣ ループ）ステートメントは、ループターゲットアドレスにオペコードのＨＰＣエントリを使用することを指定する。ループカウンタを減分するＳＵＢの結果がゼロでなかった場合、ＨＰＣはラベル "loop" をポインティングする１。そうでない場合（ループの後に）、オペコードのＬＰＣエントリは次のオペコードをポインティングする。それにしたがって、アセンブラはＨＰＣビットおよびＬＰＣビットをロードする。分岐が次のオペコードをポインティングする場合、ＬＰＣは明示的に定義しなければならない。ＡＣＴ条件付きステートメントは、左側カラムを再アクティブ化するために必要である。こうすることによってループカウンタは、ゼロが繰り上げにシフトされた場合に処理される。このようにして、ＡＤＤ命令だけは省略される。
【０４２４】
2008530642.tif 000053
【０４２５】
１  アセンブラはＨＰＣの絶対値を使用する。物理的な側では、ＨＰＣポインタの生成された６ビットは現在のＰＰに対して相対的である。
【０４２６】
３．６．４  例４
この例では、データメモリにアクセスする手法、ＦＮＣＤＢＧにおける可視化、およびアドレスポインタａｐ０およびａｐ１の自動増分の挙動を示す。この例でも、"|" 区切りを次のラインで使用することが可能であることが示されている。このことにより、左側カラムと右側カラムとを別個に注釈するのを簡略化する。
【０４２７】
タスク
第１のループで、データメモリには択一的に、０ｘ１１１１および０ｘ２２２２（initloop）のいずれかがロードされる。
【０４２８】
第２のループ（変更ループ）はメモリの内容を読み出し、該内容を０ｘ１１１１と比較する。０ｘ１１１１が読み出された場合には０ｘ９９９９が足され（結果０ｘａａａａ）、そうでない場合には低いバイトが０ｘ００にセットされる。
【０４２９】
インプリメンテーション４ａ
例４ａのインプリメンテーションは、メモリセクションをバイトとして定義する。デバッガは、左側の最小バイトのアドレスから増大する順にメモリライン内のバイトを示す。
【０４３０】
ベースレジスタｂｐ０はＤｅｍｏＲａｍ０をポインティングする。アドレス発生器はｂｐ０をベースアドレスとして使用し、オフセットｒ３を足してメモリアドレスを構成する。メモリへの書き込みにはバイト記憶ＳＴＢが使用され、ｒ３は１増分しなければならない。ｒ３のオフセットアドレスビット１はチェックされ、次のループに書き込むべき値はｒ０に移動される。変更ループ
メモリからの読み出しはワードアクセスによって行われ、２つのステップを必要とする。ＬＤＷ命令の結果は、１サイクル後にｍｅｍレジスタに使用可能である。したがって、第１のループ中にｍｅｍにおいて使用可能な第１の結果を得るためのループを行う前に、１つのＬＤＷを開始しなければならない。ａｐ０読み出しポインタおよびａｐ１書き込みポインタは２増分される。比較演算は第１のオペコードで実行され、その結果はループ内の第２のオペコードに書き込まれる。
【０４３１】
2008530642.tif 000054
【０４３２】
2008530642.tif 000055
【０４３３】
インプリメンテーション４ｂ
例４ｂのインプリメンテーションは、メモリセクションをワードとして定義する。デバッガは、左側の最小ワードのアドレスから増大する順にメモリライン内のワードを示す。リトルエンディアンモードを使用するので、デバッガは右側に正確に整列されたＬＳＢを示す。
【０４３４】
メモリはバイトアクセスを使用してロードされる。ａｐ０のアドレスビットはチェックされ、２２または１１のうちいずれを次のサイクルで使用すべきかの決定はアドレスビットに依存する。我々はａｐ０のポストインクリメントモードを使用する。ＬＤＢが使用されるので、ａｐ０は１増分される。増分されたａｐ０の値は現在のサイクル中に使用することはできず、ａｐ０が読み出され、ビット１がチェックされる前に１が値に加算される（０ｘ１０とのＡＮＤ）。ループにわたってステップすると、各ワードのＬＳＢが最初に書き込まれることが理解できる。
【０４３５】
変更ループ
メモリからの読み出しは例４ａと同様に、ワードアクセスによって行われる。しかし、ａｐ０読み出しポインタおよびａｐ１書き込みポインタのポストインクリメントモードが使用される。我々はＬＤＪＶまたはＳＴＷのいずれかを使用するので、ポインタは２増分される。
【０４３６】
2008530642.tif 000056
【０４３７】
2008530642.tif 000057
【０４３８】
３．６．５  例５
以下の例は、ＨＰＣ、ＬＰＣまたはＩＪＭＰ０ポインタを使用する分岐の使用を示す。分岐の図解ではループは、一定値と比較されるｒ０を増分する。例５ａでは、完全なアセンブラコードが示されている。例５ｂ〜５ｄは、分岐を制御するためのオペコードのみを示す。
【０４３９】
2008530642.tif 000058
【０４４０】
例５ａ
左側パスと右側パスとでＨＰＣアセンブラステートメントおよびＬＰＣアセンブラステートメントを使用する２つのターゲット分岐を示す。アクティブ状態のパスのＨＰＣステートメントないしはＬＰＣステートメントのみが分岐に使用される。ＬＰＣは付加的なサイクルを必要とする。というのも現在のインプリメンテーションは、１つの命令メモリしか有さないからである。ループエンドラベルでの命令は、１６ビット幅のジャンプを行うためのＪＭＰＬループＡＬＵ命令を使用する。この例では、条件無しのＨＴＣループも使用することができる。
【０４４１】
ハードウェア背景
アセンブラはＨＰＣポインタをｄｅｓｔ０にセットし、ＬＰＣをｄｅｓｔ１にセットする。さらにアセンブラは、左側パスがイネーブルされた場合にＨＰＣポインタを選択するようにオペコードのＥＸＩＴ‐Ｌフィールドをセットし、右側パスが出口においてイネーブルされた場合にＬＰＣポインタを選択するようにＥＸＩＴ‐Ｒフィールドをセットする。
【０４４２】
例５ｂ
ＥＬＳＥ分岐を使用する２つのターゲット分岐と、ＬＰＣを使用する左側パスの出口とを示す。この比較が等しい場合、左側パスはアクティブ化され、ＬＰＣ ｄｅｓｔ０ステートメントは評価される。すなわち、分岐はｄｅｓｔ０に行く。そうでない場合には、ＨＰＣ ｄｅｓｔ１が使用され、ジャンプターゲットはｄｅｓｔ１となる。
【０４４３】
ハードウェア背景
アセンブラはポインタＨＰＣをｄｅｓｔ１にセットし、ＬＰＣをｄｅｓｔ０にセットし、さらに、ＬＰＣを選択するようにオペコードのＥＸＩＴ‐Ｌフィールドをセットする。条件がＴＲＵＥである場合、ＥＸＩＴ‐Ｌフィールドは次のオペコードをポインティングするポインタとしてＬＰＣを選択する。というのも、左側パスがイネーブルされているからである。条件がＮＯＴ ＴＲＵＥである場合、ＡＬＵ命令のＥＬＳＥビットはＨＰＣポインタを選択する。
【０４４４】
注意点：
ＬＰＣ ｄｅｓｔ０ステートメントが省略される場合、アセンブラはデフォルトごとに、次のオペコードをポインティングするようにＬＰＣをセットする（label dest_next）。
【０４４５】
2008530642.tif 000059
【０４４６】
例５ｃ
ＥＸＩＴ分岐とＥＬＳＥ分岐とを使用する３つのターゲット分岐を示す。第１の比較によって、ｒ０≧２である場合には左側パスがイネーブルされ、ＬＥＣ ｄｅｓｔ２が評価され、ＬＰＣポインタが使用される。そうでない場合には、右側パスがアクティブ化される。第２の比較（ＡＬＵ ａｒ１）によって、ｒ０＝１である場合には右側パスがイネーブルされ、ＪＭＰＳ ｄｅｓｔ１が評価され、ポインタＩＪＭＰ０が使用される。そうでない場合には、！ＨＰＣ ｄｅｓｔが評価され、分岐はＨＰＣポインタを使用してｄｅｓｔ０に行く。
【０４４７】
ハードウェア背景
アセンブラはＨＰＣポインタをｄｅｓｔ０にセットし、ＬＰＣをｄｅｓｔ２にセットし、ＩＪＭＰ０をｄｅｓｔ１にセットする。ＥＸＩＴ‐Ｌフィールドは、左側パスがアクティブ状態である場合にＬＰＣを使用することを指定する。ＥＸＩＴ‐Ｒフィールドは、右側パスがアクティブ状態である場合にＩＪＭＰ１を使用することを指定する。ＡＬＵ ａｒ１に対するＮＯＰ命令のＥＬＳＥビットは、条件がＮＯＴ ＴＲＵＥである場合にＨＰＣを使用することを定義する。
【０４４８】
実行時間中、ハードウェアはどのポインタを使用すべきかを決定しなければならない。まず、条件がＮＯＴ ＴＲＵＥである場合、ｅｌｓｅビットはチェックされる。そうでない場合、イネーブルされたパスはそれぞれＥＸＩＴ‐ＬまたはＥＸＩＴ‐Ｒを使用してポインタを選択する。
【０４４９】
注意点：両パスがイネーブルされている場合、ＨＰＣ‐ＬＰＣ‐ＩＪＭＰ０（最下位）の順の優先度が適用される。
【０４５０】
2008530642.tif 000060
【０４５１】
３．６．６  例６
この例は、ファイルからどのように読み出しおよび書き込みするかを示す。２つの種類のポートが存在する。汎用ストリーミングポートと、ＩＢＩＴ命令およびＯＢＩＴ ＳＦＵ命令に対する特別なポート。両タイプが以下の例に挙げられている。これらのファイルは、以下のコマンド行によって指定される：
xfncdbg -in0 infile.dat -out0 outfile.dat -ibit ibitfile.dat -obit obitfile.dat exa6.fnc
【表３７】
2008530642.tif 000061
【０４５２】
スティミュラスファイルは以下のように定義される：
第１のループが８つの値をファイルから読み出し、１０を加算して、結果を outfile.dat にライトバックする。
【０４５３】
第２のループは、ビットフィールドを抽出するためにｉｂｉｔ機能をどのように使用するかと、可変数のビットをどのように連続的に読み出すかということを示す。
【０４５４】
入力ビットストリームは連続した１６ビットワードにパッキングされ、この１６ビットワードの第１のビットは、ＭＳＢに右寄せされている。ビットストリームの最初の４ビットは、読み出さなければならない次のビットの数を定義するコマンドである。コマンドワード＝０は、ループを終了する。ｉビット命令のＳｒｃ０は常に＃０にセットされる。図９は、サンプル ibitfile.dat のシーケンスを示す。この例では、抽出されたビットは累算される。
【０４５５】
【表３８】
2008530642.tif 000062
【０４５６】
図９：図６のｉビットシーケンス
2008530642.tif 000063
【０４５７】
３．６．７  例７
この例では、スタックおよびサブルーティンの呼び出しおよび戻りの使用を示す。呼び出し側ルーティンは、ＲＡＭをポインティングするポインタ Dataram を増分し、これはサブルーティンへパスされる。サブルーティンはレジスタを保存させた後、スタックからポインタを引き出す。サブルーティンは８つの連続したワードの平均値を計算し、その結果を、ポインタがパスされたのと同位置でスタックにライトバックする。サブルーティンは、影響されたすべてのレジスタをスタックに保存し、戻りの前にこれを回復する。一般的に言うと、古典的なマイクロプロセッサ設計との差はない。
【０４５８】
注意点
サブルーティンは大抵の場合、スタック処理およびレジスタの保存でオーバーヘッドを有する。したがってサブルーティンをタイムクリティカルなアルゴリズムの内部ループで使用することは、注意して評価しなければならない。リンクレジスタｌｎｋを使用すると高速な手段が実現されるが、ｌｎｋは同時に１回しか使用することができない。
【０４５９】
表３９は、この例のスタックの使用を示す。
【０４６０】
【表３９】
2008530642.tif 000064
【０４６１】
表３９：例７のスタック使用
2008530642.tif 000065
【０４６２】
2008530642.tif 000066
【０４６３】
2008530642.tif 000067
【０４６４】
付録Ａ
ＦＮＣデバッグベータ（２００５年１０月２８日）
以下のピクチャは、FNCDBG.EXEの現在の状態の注釈付きビューを示す。
デバッガは、初期ファイルを有するコマンド行によって引き起こされる。Ｃプリプロセッサをシステムにインストールしなければならない。
【０４６５】
2008530642.tif 000068
【０４６６】
図１０：ＦＮＣ‐ＰＡＥデバッガ（ベータ）
先行して実行されたオペコードのフレームには、以下のものが示されている：
・緑色：処理された命令
・赤色：ディスエーブルされたＡＬＵ命令。この結果はいずれにせよ、ＡＬＵ出力側で得られる。
【０４６７】
・----：ＮＯＰ
ブレイクポイントは、オペコードを右マウスクリックすることによってトグルすることができる。
【０４６８】
以下の添付書類２は、開示目的で依拠すべきでありかつ本願の不可欠部分として公開すべきである本願の一部分を構成する。
【０４６９】
添付書類２
序文
ＩＳ‐９５は２つのＰＮ発生器を使用して、約１．２５ＭＨｚの物理的な帯域幅にわたって信号出力を均質に拡散する。逆のリンクにおけるこのようなＰＮ拡散はさらに、近似的な直交性も提供するので、各携帯電話機からの信号間の干渉も最小にする。このことにより、使用可能な周波数の帯域を汎用的に再利用することができ、このことがＣＤＭＡの利点であり、ハンドオフをソフトにし、よりソフトにすることができる。
【０４７０】
擬似ランダムノイズ（ＰＮ）シーケンスは２進数のシーケンスであり、たとえば±１であり、ランダムであるように見えるが、実際は完全に決定論的である。このようなシーケンスは、公正な「コイントス」経験に基づいて生成されるのと同じ状態で該シーケンスにバイナリ値および同じバイナリ値のグループまたはランが生じるという点ではランダムに見える。このような経験では、各ヘッドは１つのバイナリ値となり、末尾は別の値となる。ＰＮシーケンスはこのような経験から生成されているかのように見える。ＰＮシーケンスを生成するために設計されたソフトウェアデバイスまたはハードウェアデバイスは、ＰＮ発生器と称される。
【０４７１】
ＰＮ発生器は典型的には、Ｎ個のカスケード接続されたフリップフロップ回路と、特別に選定されたフィードバック回路とから成る。以下にＰＮ発生器が示されている。
【０４７２】
2008530642.tif 000069
【０４７３】
フリップフロップ回路はこのように使用される場合にはシフトレジスタと称される。というのも、フリップフロップに供給された各クロックパルスは各フリップフロップの内容を右にシフトさせるからである。このようなフィードバック接続により、最左側のフリップフロップへの入力が供給される。Ｎ個のバイナリステージでは、シフトレジスタが有することのできる異なるパターンの最大数は２Ｎである。しかし、すべてのバイナリ値がゼロである状態（all-binary-zero）は許容されない。その理由は、このようにするとシフトレジスタの残りの状態のすべてと該状態の出力はバイナリゼロになってしまうからである。モジュール２加算器に入力されるフリップフロップの数が偶数である場合、すべてのバイナリ値が１である状態は、バイナリ１が繰り返される同様の問題を引き起こさない。したがって、ＰＮシーケンスの周期は２Ｎ−１であるが、ＩＳ‐９５は特別なバイナリゼロを導入して２Ｎの周期を達成する。ここでは、Ｎ＝１５である。
【０４７４】
ここに示されているように００１状態のレジスタから開始して、次の７つの状態は１００，０１０，１０１，１１０，１１１，０１１、その後再び００１となり、この状態が繰り返され続ける。最右側のフリップフロップから得られる出力は１００１０１１であり、これが繰り返される。ここに示された3段のシフトレジスタでは、周期は２３−１であるかまたは７である。
【０４７５】
ＰＮシーケンスは一般的に、２Ｎ／２個のバイナリ１と（２Ｎ／２）−１個のバイナリゼロとを有する。たとえば、第２３−１周期のＰＮシーケンス１００１０１１は４つのバイナリ１と３つのバイナリゼロとを有する。さらに、バイナリ１とバイナリゼロとがグループまたはラン内で繰り返される回数も、ＰＮシーケンスが実際にコイントス経験によって生成されたのと同じような状態に見える。
【０４７６】
取り出してモジュール２加算器に供給しなければならないフリップフロップは、１次の既約多項式または因数分解不可の多項式と称される同定された特定のバイナリ多項式を有する上級代数によって決定される。このような多項式は、フィードバックのタップを仕様するのに使用される。たとえばＩＳ‐９５は、同相のＰＮ発生器を特徴的な以下の多項式に基づいて形成しなければならないことを規定する。
【０４７７】
ＰＩ（ｘ）＝ｘ１５＋ｘ１３＋ｘ９＋ｘ８＋ｘ７＋ｘ５＋１（１）
ここで、１５段のシフトレジスタを視覚化する。ここでは最右側の段は０で示されており、左側に向かって連続して１，２，３等が段に与えられ、最終的には最左側の段は１４が与えられている。したがって、数式（１）における１５より小さいべき指数は、段０，５，７，８，９および１３を取り出してモジュール２加算器で加算しなければならないことを示す。加算器の出力は最左側の段に入力される。シフトレジスタＰＮシーケンス発生器を以下に示す。
【０４７８】
2008530642.tif 000070
【０４７９】
ＰＮ拡散は、帯域幅にわたって信号の出力を分布または拡散するためにＰＮシーケンスを使用することである。この帯域幅は、信号自体の帯域幅より格段に大きい。ＰＮ逆拡散は、信号の幅広いＰＮ拡散帯域幅を制限して、該信号を格段に狭い帯域幅で再構築するプロセスである。
【０４８０】
注意点：ＰＮシーケンスを使用して信号出力を幅広い帯域幅に拡散するには、少なくとも２つの手法が存在する。１つは、いわゆる周波数ホッピング（ＦＨ）である。ここでは、狭帯域の信号の中心周波数を、ＰＮ符号を使用して擬似ランダムシフトする。第２の手法はいわゆる直接拡散（ＤＳ）法である。ＤＳでは、実際には狭帯域の信号に広帯域のＰＮシーケンスを乗算することによって、信号出力を広い帯域幅にわたって拡散する。広帯域の信号と狭帯域の信号とが乗算されると、得られる積信号は、広帯域信号の帯域幅にほぼ等しい帯域幅を有するようになる。
【０４８１】
ＩＳ‐９５ではＤＳ ＰＮ拡散を使用して、幾つかの信号伝送上の利点を達成する。このような利点には、帯域幅を拡大してより多くのユーザを受け入れられるようにできること、ＰＮシーケンスの近似的に直交するセグメントを生成して、逆方向リンクにおける複数のアクセスの分離と汎用的な周波数の再利用とを実現できること、干渉に対するトレランスが増大すること、ならびに、ＲＡＫＥ受信器によってマルチパスを解いて建設的に組み合わせることが可能であることが含まれる。マルチパスは、マルチパス成分信号間のマルチパス遅延が信号帯域幅の逆数より大きい場合にのみ分解することができ、かつ建設的に組み合わせることができる。拡散ひいては信号の帯域幅の拡大により、比較的小さい遅延差を有する信号を分解することが可能になる。
【０４８２】
信号ｓ（ｔ）が１９２００ｓｙｍ／ｓｅｃのシンボルレートを有すると仮定する。各シンボルは１／１９２００または５２．０８３３μｓｅｃの持続時間を有する。ｓ（ｔ）が１．２２８８Ｍｃｈｉｐｓ／ｓｅｃのレートでのチップ交代で、ＰＮシーケンスＰＮ（ｔ）にモジュール２加算された場合、各シンボルは１．２２８８×５２．０８３３個のＰＮチップまたはちょうど６４個のＰＮチップを有する。信号の帯域幅は、６４〜６４×１９２００倍増大されるか、または１．２２８８ＭＨｚ増大される。受信された拡散信号はＰＮ（ｔ−ｔ）ｓ（ｔ−ｔ）の形態を有する。受信側では、送信側で使用されるＰＮ発生器の複製品がシーケンスＰＮ（ｔ−ｘ）を生成し、積を形成する。変数ｘがｔに等しく調整される場合、ＰＮ（ｔ−ｘ）ＰＮ（ｔ−ｔ）ｓ（ｔ−ｔ）はＰＮ（ｔ−ｔ）２ｓ（ｔ−ｔ）に等しくなり、所望のシンボルストリームｓ（ｔ−ｔ）に等しくなる。というのも、ＰＮ（ｔ−ｔ）２は常に１に等しいからである。ここでは逆拡散を図解する。
【０４８３】
典型的なＰＮ符号長
ＩＳ‐９５では、２つの異なる種類のＰＮシーケンスが使用される：
【表４０】
2008530642.tif 000071
【０４８４】
ＰＡＥビット論理拡張
ＸＰＰ‐III ＰＡＥは、データパス内の１つの行の論理エレメントをサポートする。最大３つのレジスタがビットロジックライン（ＢＬＬ）にデータを供給することができ、結果は最大２つのレジスタに記憶することができる。
【０４８５】
個々のビットロジックエレメントには３つの入力側と２つの出力側のルックアップテーブル（ＬＵＴ）が含まれる。
【０４８６】
2008530642.tif 000072
【０４８７】
高いシリコン効率を実現するためには、ＢＬＬ内の各ビットを同様に処理する。このことは、ＬＵＴ全体のラインに必要とされるメモリセットは１つだけであることを意味する。
【０４８８】
下記の図は、ＰＮ発生器で使用されるようなＢＬＬのコンフィギュレーションを示す。
【０４８９】
2008530642.tif 000073
【０４９０】
ＰＡＥは最大４つのＢＬＬコンフィギュレーションを記憶し、このＢＬＬコンフィギュレーションには、オペコードと同様のコマンドｂｌ１，ｂｌ２，ｂｌ３およびｂｌ４を使用してアクセスすることができる。
【０４９１】
下記の図は、ＸＰＰ２０プロセッサにおけるビットレベル拡張の構成を示す。メモリＰＡＥに隣接する副次的ＡＬＵ‐ＰＡＥがＢＬＬ拡張を提供する。面積効率上の理由のため、コアＡＬＵ‐ＰＡＥはこのようなインプリメントされた拡張部を有さない。
【０４９２】
2008530642.tif 000074
【０４９３】
ＰＮ発生器インプリメンテーション
各ＬＵＴ内にはモジュロ２加算器が構築されている。各ＬＵＴは同様に構成されているので、ＬＵＴ内にはさらにマルチプレクサもインプリメントされ、これによって加算器は、使用される多項式にしたがってバイパスされる。下記のピクチャは、ＬＵＴの概略図とコンフィギュレーション関連のデータとを示す。
【０４９４】
2008530642.tif 000075
【０４９５】
Ｑ００はフラグレジスタＦＵ３に供給される。フラグレジスタＦＵ３は、生成されたビットを記憶するために使用され、使用されるアルゴリズムをイベントネットワークにわたって分布させる。
【０４９６】
レジスタＲ０にはＰＮデータが記憶されており、Ｒ１はこの例では、各ＬＵＴでマルチプレクサのセッティングによって実施例に示されているように多項式を定義するｐを含む。
【０４９７】
2008530642.tif 000076
【０４９８】
複数回の連続した繰り返しにより、ＰＮシーケンスは発生する：
2008530642.tif 000077
【０４９９】
このように非常に基本的な手法により、最大でＡＬＵのワード長のＰＮシーケンスが生成される。
【０５００】
長いＰＮシーケンス
比較的長いシーケンス（たとえばＩＳ‐９５の長いＰＮ符号は２４２である。）の場合、生成は多重的なパートに分割しなければならない。ＸＰＰ‐IIIは、２４ビット幅のＡＬＵを有するソフトウェア定義ラジオアプリケーションのためにプランニングされたものであり、４２ビット長のＰＮシーケンスを計算するためには２つの処理ステップが必要である。
【０５０１】
2008530642.tif 000078
【０５０２】
第１のステップでは、ＰＮシーケンスの比較的下位の半分を計算する。繰越フラグ（Ｃ）は、シーケンスの比較的上位の半分の最下位ビットをシフタに移動するために使用される。ＦＶ３は、モジュロ２加算器の和をより上位の半分の処理に繰り越しするために使用される。
【０５０３】
2008530642.tif 000079
【０５０４】
比較的上位の半分の処理は、最下位を繰り越しフラグ（Ｃ）に移動し、ＦＶフラグをモジュロ２加算器チェーンのためにＦＶ３フラグを使用する。
【０５０５】
必須条件である場合には、ここに図示された演算は、ループ開始を処理する前に、事前ロードを必要とする。
【０５０６】
アルゴリズム例が下記に挙げられている。ｒ０，ｒ１，ｒ２，ｒ３はコンフィギュレーションによって定数として事前設定されている。ｒ０およびｒ１はＰＮ発生用のベース値を有し、ｒ２およびｒ３はＰＮ処理の高次の部分と低次の部分とに対する多項式定義を含む。ｒ１は右シフトされることにより破壊されるので、直ちにコンフィギュレーションメモリから再ロードされる。
sr r1, r1; # Preload C R1 scratch
load r1, <const>;
loop: bl1 r0, r0, r2; # process lower half with key r2
bl2 r1, r1, r3; # process higher half with key r3
write fu3;
jmp loop;
このコードは、コンフィギュレーションメモリにおいて７つのエントリを必要とする。
【図面の簡単な説明】
【０５０７】
【図１】本発明によるプロセッサ（ＸＭＰ）のデータパスの基本的な構成を示す。
【図２】図１のＡＬＵステージ構成体０１３０のプログラムフロー制御が示されている。
【図３】１つの実施形態を示す。
【図４】ＡＬＵステージ構成体０４０１（上記の実施形態における０１０１〜０１０４に相応する）が多重化によって２重化され、０４０２＝｛０１０１ａ〜０１０４ａ｝から０４０３＝｛０１０１ｚｚ〜０１０４ｚｚ｝までのｚｚ‐ＡＬＵステージ構成体の分岐のためにインプリメントされている相応の構成体を示す。
【図５】ＸＭＰプロセッサモジュールの全体的構成を示す。
【図６】オペコードフェッチユニットのインプリメンテーションを示す。
【図７】複数のＸＭＰの相互接続と、ＸＰＰとの結合とを示す。
【図８】異なる要素の構成が示されている。
【図９】本発明によるデータパスの構成の詳細を示す。
【図１０】２倍精度の演算を実現するための構成が開示されている。
【図１１】異なる符号命令を使用する択一的なインプリメンテーションが示されている。
【図１２】本発明の一例を示す。
【図１３】ＡＬＵ間での状態情報の交換を示す。
【図１４】高パフォーマンスの実施形態を示す。
【図１】
2008530642.tif 000080
【図２】
2008530642.tif 000081
【図３】
2008530642.tif 000082
【図４】
2008530642.tif 000083
【図５】
2008530642.tif 000084
【図６】
2008530642.tif 000085
【図７ａ】
2008530642.tif 000086
【図７ｂ】
2008530642.tif 000087
【図７ｃ】
2008530642.tif 000088
【図８】
2008530642.tif 000089
【図９】
2008530642.tif 000090
【図１０】
2008530642.tif 000091
【図１１】
2008530642.tif 000092
【図１２】
2008530642.tif 000093
【図１３】
2008530642.tif 000094
【図１４】
2008530642.tif 000095
【国際調査報告】
2008530642.tif 000096
2008530642.tif 000097
2008530642.tif 000098
2008530642.tif 000099
2008530642.tif 000100