(57)【要約】代替ビット反転を有する基本コンピュータである。２つの１８ビットのレジスタ（３２）、（３４）は、論理演算ユニット（ＡＬＵ）（３６）に接続されリップルキャリー加算を実行し、１−ｈｉｇｈ表現は奇数のビット位置に対応する回路部分において実行され、また反転表現は偶数のビット位置に対応する回路部分において実行される。代替ビット変換のため、１ビットの加算の桁上げ計算は１個のインバータのレイテンシ内のみで実行可能であり、この結果、リップルキャリー設計によりもたらされる小さいダイ面積を備える高速の１８ビット加算器がもたらされる。
2010514058.tif 000002
【特許請求の範囲】
【請求項１】
物理的特性の２つの個別値は２進数の前記ビット値を表し、
偶数のビット位置において、第１の前記個別値は２進数の１を表し、第２の前記個別値は２進数の０を表し、
奇数のビット位置において、前記第１の前記値は２進数の０を表し、前記第２の前記値は２進数の１を表すことを特徴とする複数のビット位置を有するマルチビット２進数を処理するデジタル論理回路。
【請求項２】
前記デジタル論理回路の第１の複数部分が前記偶数のビット位置に対応し、
前記デジタル論理回路の第２の複数部分が前記奇数のビット位置に対応することを特徴とする請求項１記載のデジタル論理回路。
【請求項３】
前記物理的特性が電位であることを特徴とする請求項１記載のデジタル論理回路。
【請求項４】
前記第１の値が高電位であり、前記第２の値が低電位であることを特徴とする請求項３記載のデジタル論理回路。
【請求項５】
前記第１の値が低電位であり、前記第２の値が高電位であることを特徴とする請求項３記載のデジタル論理回路。
【請求項６】
前記デジタル論理回路が、マルチビット２進数のリップルキャリー加算器であることを特徴とする請求項１記載のデジタル論理回路。
【請求項７】
前記マルチビット２進数が１８ビットの２進数であることを特徴とする請求項６記載のリップルキャリー加算器。
【請求項８】
前記デジタル論理回路が２つのマルチビットレジスタ及びマルチビット論理演算ユニットを備え、前記マルチビット論理演算ユニットは動作可能に内部接続されており、これにより、前記レジスタに配置された２つの数のリップルキャリー加算を実行すると共にその和を前記レジスタの１つに入力することを特徴とする請求項１記載のデジタル論理回路。
【請求項９】
前記デジタル論理回路が非同期性論理回路であることを特徴とする請求項１記載の回路。
【請求項１０】
前記マルチビット論理演算ユニットが１８ビットの論理演算ユニットであることを特徴とする請求項８記載の回路。
【請求項１１】
前記数は複数のビット位置を有し、
前記デジタル論理回路の物理的特性の２つの個別値は２進数の前記ビット値を表し、
偶数のビット位置に関して、第１の前記個別値は２進数の１を示し、第２の前記個別値は２進数の０を示し、
奇数のビット位置に関して、前記第１の前記値は２進数の０を示し、前記第２の前記値は２進数の１を示すことを特徴とするデジタル論理回路内のマルチビット２進数の操作方法。
【請求項１２】
前記デジタル論理回路の第１の複数部分が前記偶数のビット位置に対応し、
前記デジタル論理回路の第２の複数部分が前記奇数のビット位置に対応することを特徴とする請求項１１記載の方法。
【請求項１３】
前記物理的特性が電位であることを特徴とする請求項１１記載の方法。
【請求項１４】
前記第１の値が高電位であり、前記第２の値が低電位であることを特徴とする請求項１３記載の方法。
【請求項１５】
前記第１の値が低電位であり、前記第２の値が高電位であることを特徴とする請求項１３記載のデジタル論理回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、同じ発明者によって２００６年１２月２１日に出願された同時係属中の米国仮特許出願第６０／８７６，３７９号の利益を主張するものであり、その全体を参照することにより本明細書に組み込まれることとする。
本発明は演算処理及び計算を実行する電気的なコンピュータに関し、さらに、コンピュータ回路内の２進数の物理的表現に特に関連する。
【背景技術】
【０００２】
デジタルコンピュータは、２進数（Ｔｒｕｅ（真）及びＦａｌｓｅ（偽）論理状態或いはブール値とも呼ばれる）を物性の高い値又は低い値のシーケンスとして操作することにより動作する。このシーケンスは通常、電気回路電位（電圧）である。従来、高電圧値（又は高電圧位）が２進数の１を表現するため、また低電圧値が２進数の０（本明細書では１−ｈｉｇｈ表現という）を表現するため、或いはその逆の場合も同様に（本明細書では１−ｌｏｗ又は逆の表現と言う）、コンピュータ回路内で均一に割り当てられる。様々なビット表現はシリアルデジタル信号伝送及びメモリチップにおいて知られているが、コンピュータ回路においては知られていない。コンピュータ及びデータプロセッサの電気回路における同一の数表現は、電気回路の設計、試験、及び電気回路の命令の書き込みを容易にする。現在の技術において、デバイスの論理ファミリ全体は、固定的且つ同一の表現を用いる。例えば、１．５ボルトのＣＭＯＳは約１．５ボルトの電気回路電位を用いて２進数の１を表し、また約０ボルトの電位を用いて２進数の０を示す。
【０００３】
従来の２進数の表現が回路要件及び回路動作にどのように関連しているかということは、マルチビットの追加等といった基本的なコンピュータ操作の例からわかる。マルチビットの追加により、しばしばコンピュータプロセッサが便利なタスクをどのくらい早く処理するかが特に決定される。図１に示されているのは２入力リップルキャリー（桁上げ）加算器（１０）の概略図で、各ブロック（１２）は１ビットの全加算器を示す組み合わせ回路である。この加算器は二つのマルチビットの加数Ａ、Ｂの一つのビット位置、また隣の下位のビット位置から受信する桁上げ（ｃａｒｒｙ−ｉｎ）値Ｃを加える。すなわち、最下位ビット（ＬＳＢ：ｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔ）を始めとして、４つの下位ビット位置（ブロック０、１、２，３）のみが図示される。図において、Ａ０、Ｂ０、Ａ１、Ｂ１、Ａ２、Ｂ２、Ａ３、Ｂ３は入力された加数ビットの値であり、Ｃ０、Ｃ１、Ｃ２、Ｃ３はビット位置０，１，２，３夫々の桁上げビット値である。各ブロック（１２）はワードＳの和のＳ０、Ｓ１、Ｓ２、Ｓ３のビット値を計算し、またＣ４は隣の高位のビット位置（図示せず）の桁下げ値である。一つのブロックからの桁下げは隣のブロックへの桁上げであることがわかる。これにより、ビット位置の和は連続的に計算される。桁上げ計算のレイテンシは追加可能である。その一方、加数のワードが回路に適用されるとすぐに、桁上げ値に関係のない計算は全て、各組み合わせ回路のレイテンシ内で同時に実行可能である。したがって、ビット数（ワードの大きさ）が大きい場合、桁上げの遅延はレイテンシ全体を支配する。マルチビットの追加を実行するいくつかの異なる技術は、並列性（及びビット位置の分類）が様々な方法で用いられる従来技術において周知である。その一方、異なる技術全ては、任意のビット位置（又はビットの配置）における和から生じるレイテンシの影響を受けやすく、この影響は下位ビット入力の全て、或いは同等に規定された隣接する下位ビットから桁上げを要求する任意のビット位置で１ビット追加することに依存するものである。
【０００４】
図２に示すのは加算器ブロック（１２）の部分（１４）の回路図であり、周知の最適なＣＭＯＳ組み合わせ回路を示す。このＣＭＯＳ組み合わせ回路は、１ビット入力の桁下げ値Ｃ２の計算を実行する。この回路は、レイテンシを引き起こすインバータ（１６）を有する必要がある。これは、各ブロック内の桁上げ及び桁下げの同一の２進数表現のために、出力の論理レベルを調節するためである。同一の数表現のための反転回路部分は、他の周知の技術によるマルチビット追加を実行する回路等の他の組み合わせ回路において必要とされることができる。明らかに、このような数表現の調整のための反転回路部分を必要としない基本回路をもたらす方法を見つけることは有利なことである。このように、回路は、レイテンシを削減すると共により優れたコンピュータのパフォーマンスを有することとなる。より優れているとは、計算及び信号処理のより高速なスピード、ダイ面積及び電源を控えめに利用すること、及びマルチプロセッサ配列及び埋め込みシステムアプリケーションで利用可能である点においてである。しかしながら、発明者の知る限りでは、十分な解決法は本発明以前には知られていない。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
したがって、本発明の目的は、コンピュータ回路内の２進数の代替ビット反転表現のための装置及び方法を提供し、その結果、マルチビット２進数に作用する追加及び組み合わせ操作のより早いパフォーマンスをもたらすことである。
【０００６】
本発明のその他の目的はさらに、より小さい面積を有するコンピュータ回路をもたらす装置及び方法を提供することである。
【０００７】
さらに本発明のその他の目的は、桁上げ算のための反転部分を必要としない加算器回路をもたらす装置及び方法を提供することである。
【０００８】
つまり本発明は、レイテンシの原因となるインバータを排除することによる、コンピュータのレイテンシを削減するための方法及び装置である。これは、特定のデータビットを反転させないでおくと共に、関連する回路内のデータビットを補うことにより達成される。
【０００９】
本発明のこれら及び他の目的及び利点は、本発明を実行する形態の説明を考慮すると、当業者にとって明らかになるであろう。また、本明細書に記載の及び図面のいくつかの図において示されるその産業上の利用可能性も明らかになる。記載の目的及び利点は、本発明の全ての考えられる利点を完全に記載しているものではない。さらに、１又はそれ以上の意図された目的及び／又は利点が本出願に欠如或いは必要とされていない場合であっても、本発明を実施することは可能である。
【００１０】
さらに、本発明の様々な実施形態は全てでなくてよいが１またはそれ以上の記載の目的及び／又は利点を達成することを、当業者は理解している。したがって、本明細書記載の目的及び／又は利点は、本発明の必須要素ではなく、また制限的なものと解釈されるべきではない。
【図面の簡単な説明】
【００１１】
【図１】（従来技術）同一の２進数表現を用いる従来のリップルキャリー加算器を示す記号的なブロック図である。
【図２】（従来技術）１ビットの加算器ブロックの桁上げ計算部をより詳細に示す回路図であって、従来の同一の２進数表現を用いている。
【図３】非同一の２進数表現を用いるリップルキャリー加算器の記号的なブロック図であり、本発明の実施形態に従い代替ビットは反転されている。
【図４】本発明による代替ビット反転を用いた１ビット加算器ブロックの高速な桁上げ計算部の回路図である。
【図５】５ビットの２進数を従来の方法で加えたものと、反転された代替ビットを用いて加えたものを比較している。
【図６】論理演算ユニットに接続された２つの１８ビットレジスタを有する基本コンピュータ回路のブロック図であって、本発明に従い代替ビットは反転されている。
【図７】図６の基本コンピュータ回路の２つの隣接するレジスタセルの回路図であって本発明による代替ビット反転を利用する。
【図８】図６のコンピュータ回路内で動作するのに適した高速な桁上げ計算回路の回路図であって、本発明のその他の実施形態による代替ビット反転を利用する。
【発明を実施するための形態】
【００１２】
本発明は図を参照することにより以下の記述中に説明され、図中における同一の数字は同じ又は同様の要素を表している。本発明はこの発明の目的を達成するための方法という観点から説明される一方で、変更形態は本発明の精神又は範囲から逸脱することなくこれらの教示を考慮して達成されることが当業者にとって容易に理解される。
【００１３】
本明細書に記載及び／又は図面に記載の本発明の実施形態及び変更形態は、例示目的でのみ表わされるものであり、本発明の範囲を制限するものではない。他に特に述べられない限り、本発明の特定の解釈及び構成は省略又は変更可能であり、或いはその結果周知の同等物と代替可能で、又はさらに周知でない代替物等が将来発展可能であり、或いはそれらが将来ふさわしい代替物であるとわかる。請求の範囲に記載の発明の精神及び範囲内に存在する一方、本発明はまた様々な応用に変更可能である。これは、潜在的な応用の幅が大きいと共に、本発明が多数のこのような変更形態に適用可能であるということが意図されているためである。
【００１４】
2010514058.tif 000003
【００１５】
当業者にとっては理解されうるものであるが、例えば加算等の、論理演算及び算術演算の実行におけるコンピュータ回路（２０）の機能性は、２進数表現の選択による影響を受けない。このことは図５に示す通り、２つの例の５ビットの２進数（Ａ＝１１１０１、及びＢ＝１０１１１）の加算を比較することにより説明可能である。これにより５ビット（又は６ビット）の和（Ｓ）が導き出される。この加算は、従来及び代替ビット反転回路を用いて行われる。この比較により、１ビット加算器ブロックの物理回路の電位レベルにおいて何が起こるかが示される。図５において、数字１、０はビット値を２進数で表示し、また文字（Ｈ）、（Ｌ）は、例えば電位等の回路特性の「高」及び「低」値を示す。この電位はビット値を表現するものである。この例において、従来の固定の表現は１−ｈｉｇｈであって、１−ｈｉｇｈはまた、偶数番号がついたビット位置に対応する回路部分で用いられるということが考えられる。数表現は、全てのビット位置で同一であると共に１−ｈｉｇｈとなるよう固定される回路内で、ビット値１、０が回路の電位（Ｈ），（Ｌ）夫々に全ての場所で対応する。したがって、記号（１）は（Ｈ）の代わりに、（０）は（Ｌ）の代わりに利用可能である。したがって、図１のような同一の数表現を用いて、加算は図５の加算（２６）に示される通り行われる。この場合、合計Ｓ１−ｈの下付き文字の１−ｈは、１−ｈｉｇｈ表現がこの例において用いられることを強調するため用いられる。代替ビットが反転されると、（図３のように）本発明によれば、加算は図５の加算（２８）に示されるように進行する。この場合、（マルチビット２進数の連続したビット位置のシーケンスにある）偶数のビット位置に対応する回路部分は、１−ｈｉｇｈ表現を有する。また、奇数のビット位置に対応する第２回路部分は反転し、つまり、１−ｌｏｗ表現を有する。反転した回路表現を備えるビットは図５において太字で示される。図中（Ｓ）の真下にあるＳ１−ｈに示されるように、加算（２８）の和（Ｓ）の値（Ｈ）及び（Ｌ）が同一の１−ｈｉｇｈ表現に変換される場合、その和は加算（２６）の和と同一であるということがわかる。当業者にとって明らかなことではあるが、従来及び代替ビットが反転されている場合の回路動作を比較すると同じ結果に辿り着く。これは１−ｌｏｗ表現が固定表現に利用される場合、或いは反転した回路部分が偶数のビット位置に対応する場合のことである。さらに、所定のビット位置の範囲内で、１又は他の数表現に関わらず、１ビットの加算は通常所定の一連の入力値に対し実行される。また、加数及び和は、桁上げを除いた各２進数のビット値又はビット値の補数のどちらかである。本発明にしたがって反転した代替ビットを用い、普通に計算された桁上げ出力の補数（例：反転した値）は、桁上げ入力として各連続するビット位置に要求される。このことは、図３の連続した相補的な桁上げ値の記号を代替することにより、また、図５の太字及び太字でないビット値の記号を代替することにより示される。
【００１６】
図２の回路は、入力値の特殊な組み合わせ論理関数のトランジスタレベルのＣＭＯＳ表現であって、さらなる反転段が同一の数表現のために求められている。この反転段は、図３の回路のように、代替ビット位置において反転した数表現を用いることにより排除可能である。これにより、動作のレイテンシ及び回路のレイアウトに必要なダイ面積が削減される。このような反転段は、同一の数表現を用いるコンピュータ及びシグナルプロセッサの他の組み合わせ論理回路にも必要とされることが知られている。また、当業者には明らかなことであるが、本発明によると、このような段はいくつかの場合において同様の方法で、コンピュータワードの代替ビット位置で反転された数表現を用いることにより移動可能であることが求められている。したがって、コンピュータ動作のスピードアップ及びダイ面積の削減がなされる。
【００１７】
その他の基本コンピュータ回路内の代替ビット反転の例は、図６から８を参照しつつ説明される。図６において、コンピュータ回路（３０）は論理演算ユニット（ＡＬＵ）（３６）に接続された２つの１８ビットのレジスタ（３２）、（３４）を有している。２進数表現は、回路（３０）の全てのデバイス内の代替ビット位置で反転される。すなわち、ビット値の補数表現によって図中に示される通り、１−ｈｉｇｈ表現は奇数のビット位置に利用可能で、また逆表現は偶数のビット位置に利用可能である。
【００１８】
2010514058.tif 000004
【００１９】
ＡＬＵ（３６）は１８個の１ビットの論理演算ユニット（ＡＬＵ）（５０）を備える。図示の通り、各論理演算ユニット（５０）は、ビット位置に従い夫々のビットセルに接続される。ＡＬＵとＴレジスタ及びＳレジスタの、コンピュータの他の部分（例：メモリ、制御シーケンサ、入力／出力ポート、その他のレジスタ及び電源）へのその他の接続は、制御、データ及び命令転送、及び電力操作等の目的でなされるが、図を明確にするため省略されている。回路（３０）は例えば、リップルキャリー技術に従って、Ｓレジスタ内の１８ビットの数をＴレジスタ内の１８ビットの数に加算し、Ｔレジスタ内にその和を入力するよう構成される。この目的のため、図６に示す通り、Ｓレジスタ（３４）のビットセルの読み込みライン（５４）は、対応する１ビットのＡＬＵ（５０）の１つの加数入力に接続し、またＴレジスタの読み込みライン（４４）は第２の加数入力に接続する。すなわち、ＡＬＵの合計出力ライン（５６）は、パスゲート（４６）を介しＴレジスタの書き込みライン（４８）に接続する。また、桁上げライン（５８）はＡＬＵに直列に接続する。この回路において、各１８ビットの加算が行われる間、桁上げ値はビット０の位置からビット１７の位置へ伝搬する。したがって、加算のレイテンシは１８個の桁上げ計算のレイテンシの和を含む。しかし、代替ビット変換のため、１ビットの加算の桁上げ計算は１個のインバータのレイテンシ内のみで実行可能であり、例えば図４の回路（２４）を用いて実行される。この回路（２４）はＡＬＵ（５０）の上で桁上げ計算部として説明されている。当業者にとって明らかなことであるが、図６に示す通り、回路（２４）は桁上げ出力を桁上げ値及び桁上げ値の補数間の連続するビット位置変換から作られることができる。この桁上げ出力は、Ｔ及びＳレジスタ変換からＡＬＵに加えられた加算ビット値と同じ方法で行われる。この結果、リップルキャリー設計によりもたらされる小さいダイ面積を備える高速の１８ビット加算器がもたらされる。
【００２０】
2010514058.tif 000005
【００２１】
発明の価値又は範囲を変更することなく、様々な変更が発明に対してなされる。例えば、本明細書にて本発明はリップルキャリー加算器（２０）及び基本コンピュータ回路（３０）に関して説明されている一方、他の基本コンピュータ回路を用いることが可能である。この他の基本コンピュータ回路において、反転段は均等効果と共に数表現の調整に従来用いられている。
【００２２】
コンピュータ回路内の発明の代替ビット反転２進数表現の特定の発明が本明細書において議論される一方で、非常に多数の応用がまだ想定されていないものに対してなされる。実際に、本発明の利点の一つであるが、発明の方法及び装置は非常に様々な使用に適用可能である。
【００２３】
上記の全ては本発明の利用可能な実施形態の例の一部のみである。当業者は多数の他の変更及び変形が、本発明の精神及び範囲から逸脱することなくなされることができることに容易に気づく。したがって、本明細書中の開示は限定を意図するものではなく、また付随する請求項は本発明の全範囲を包含するものとして説明される。
【００２４】
以下に示すアプリケーションデータ及びデバイスデータシートは本開示の一部である。アプリケーションガイド及びデータシートは本発明の態様を開示するものであり、従来技術全体に重要な利点をもたらすものである。
【００２５】
インテラシス（ＩｎｔｅｌｌａＳｙｓ）社
ＶｅｎｔｕｒｅＦｏｒｔｈ（商標）
アプリケーションガイド（導入）
＜第１章：はじめに＞
純粋な汗により見出され、編集され、変更され、奮起され、作られたものであり、又はＦｏｒｔｈのプログラマにより形成された技術が、本書は表す。Ｆｏｒｔｈのプログラマは、カリフォルニア州Ｐａｌｏ  ＣｅｄｒｏにあるＩｎｔｅｌｌａＳｙｓ  Ａ／Ｖ  システムエンジニアリング施設の、Ｇｉｂｓｏｎ  Ｅｌｉｏｔ，ＪＲ  Ｓｔｏｎｅｒ，及びＭｉｃｈａｅｌ  Ｄｅｎｎｉｓである。
独自の指導をしてくれたＪｅｆｆ  Ｆｏｘ及びＪｏｈｎ  Ｒｉｂｌｅ、ドキュメント操作をしてくれたＣｈａｒｌｅｓ  Ｓｈａｔｔｕｃｋに感謝を述べる。そして誰よりも、この技術を生み出したＣｈｕｃｋ  Ｍｏｏｒｅの粘り強さに感謝する。
おそらく、もたらされた情報の一部は言うまでもないが、ある偉大な人が私に話してくれた。「君がＶｅｎｔｕｒｅＦｏｒｔｈ（商標）において旅を始めた時、この文書が非常に大きな助けになることが、私たちの心からの願いである」。
＜第２章：規定＞
本文中のニーモニックは太字で示される。
例：ｄｕｐ  ｄｕｐ  ｘｏｒはデータスタックにゼロをもたらす。
タイプ入力を意図した本文中の項目は引用符（“”）内に表される。
例：“１２｛ｎｏｄｅ”をタイプしＥｎｔｅｒキーを押して下さい。
本書におけるスタック表記は、ほとんどのＦｏｒｔｈ実装のように丸括弧を用いるがＲも使用され、これによりデータスタック及びリターンスタックを分離させる。
データスタック（ＤＳ）の上部が“４”を含み、ＤＳ上の第２の項目が“２”であって、リターンスタック（ＲＳ）が“９”を含み、またＲＳ上の第２位置が“７”を含む場合、スタック表記は以下のようになる。
（２  ４    Ｒ：７  ９）
↑            ↑
ＤＳの上部        ＲＳの上部
ＲＳ上に重要なデータがない場合、スタックコメントはＤＳの値を含むのみであって、このように見える。
（２  ４）
↑                    ↑
ＤＳの上部            空白のＲＳ
トラッキングするデータをＲＳが有していない場合、Ｒ：は表記中の左側にあり、そうでないこともある。
注：ＤＳ上部の２つの位置はＴ及びＳレジスタと呼ばれ、トップ（Ｔｏｐ）とセカンド（Ｓｅｃｏｎｄ）を意味する。これらは太字で表される。
完全に空白なスタックはコメントされる必要はないが、“（  --  ）”と表されることもある。
ａ又はｂレジスタの内容を、この例のようにトラックすることもある。
（２  ４    Ｒ：７  ９              ：Ａ＝＄８０、  Ｂ＝ＩＯＣＳ）
↑            ↑                  ↑            ↑
ＤＳの上部      ＲＳの上部          Ａ及びＢレジスタ
＜第３章：開発環境＞
ＳＥＡｆｏｒｔｈの開発環境は、本書において説明される少なくとも一つのＳｗｉｆｔＦｏｒｔｈをそのベースとして使用する。環境はＳｗｉｆｔＦｏｒｔｈ、Ｆｏｒｔｈソースコードのホスト、及びＶｅｎｔｕｒｅＦｏｒｔｈ（商標）コードからなる。Ｇｆｏｒｔｈもまたベースとして、ほとんど変更なく動作する。
（必要条件）
ＳｗｉｆｔＦｏｒｔｈ又はＧｆｏｒｔｈの有効な実装が必要である。それぞれはＡＮＳＦｏｒｔｈである。
コンピュータにＳＥＡｆｏｒｔｈシミュレータファイルを有する必要がある。このフォルダは多数のフォルダを含む。しかし、常に以下を含んでいる。
・ａｐｐｓ
・ｔ１８
・ｂｉｏｓ
（概要）
選択したテキストエディタを用い、“ｍｙｔｅｓｔ．ｍｆ”とａｐｐｓフォルダに作成する。
．ｍｙｔｅｓｔ．ｍｆは以下を含むべきである。
ｉｎｃｌｕｄｅ  ｓｅａｆｏｒｔｈ．ｆ
この“ｉｎｃｌｕｄｅ”の行は、ＶｅｔｕｒｅＦｏｒｔｈ（商標）ファイルがシミュレータにロードされるものを制御する。ＶｅｔｕｒｅＦｏｒｔｈ（商標）ファイルは、ｍａｃｈｉｎｅ  ｆｏｒｔｈを意味する拡張子“．ｍｆ”を用いる。“ｓｅｒｃｈ  ｆｏｒｔｈ．ｆ”と名づけたファイルは実際に、アプリケーションファイルをロードする前にコンプライア／シミュレータをロードした。
ＶｅｔｕｒｅＦｏｒｔｈソースコードファイルの全てはａｐｐｓフォルダ内に当然存在する。このフォルダにおいて、“ｍｙｔｅｓｔ．ｍｆ”はアプリケーションファイルが存在した場合にその残りを探す。
多数のＶｅｔｕｒｅＦｏｒｔｈファイルを作成している場合、それら全てにディスティンクト名を付け、ａｐｐｓフォルダに保存する。そして、上記に示すインクルード線を変更することによって現在テスト中のものを制御することが可能である。
ｍａｃｈｉｎｅｆｏｒｔｈのテストファイルをリロードするため、ＳｗｉｆｔＦｏｒｔｈから抜け再実行し、ｍｙｔｅｓｔ．ｍｆをリロードする必要がある。
（サンプルプログラムの実行）
選択したエディタを用いてａｐｐｓフォルダ内の“ｍｙｔｅｓｔ．ｍｆ”ファイルを開き、以下のコードをそのファイルの中へ入力する。
2010514058.tif 000006
このコードはノード１２でロード及び実行され、またコードをメモリアドレスゼロ内にコンパイルさせるため選択された。実際、｛ｎｏｄｅはコンパイルをセットしてデフォルトによってノードのメモリアドレスゼロにおいて開始する。
“ｒｕｎｓ  ｉｎｉｔ１２”はブート時、このノードをｉｎｉｔ１２へジャンプさせる。
ＳｗｉｆｔＲｏａｄを動作させ、ｍｙｔｅｓｔ．ｍｆファイルをロードする。進行が長く表示される。繰り返される言葉にいくつか小さいエラーがあるかもしれないが、これらは無視してよい。
ロードが完了したら、“ｄｅｃｉｍａｌ”とタイプしＥｎｔｅｒキーを押す。そして“１２  ｎｏｄｅ！”とタイプする。或いは、“ｈｅｘ”とタイプしてから“Ｃ  ｎｏｄｅ！”とタイプすることもできる。しかし、他のユーザインターフェースは、指定した通りに１０進数又は１６進数を返すので、以下のケースにおける通り、結果を解釈する場合は１０進法か又は１６進法なのかを念頭に置かなければならない。
“．Ｃ”とタイプしＥｎｔｅｒキーを押す。以下を参照のこと。
2010514058.tif 000007
上の図は、ノードのメインレジスタのスナップショットである。最も重要なのは、プログラムカウンタ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ（ＰＣ））、命令、及びデータスタックとリターンスタックである。また、Ａ及びＢレジスタの内容はここにおいてしばしば有用である。
そして、“ｓｔｅｐ  ｓｔｅｐ  ｓｔｅｐ  ．ｃ”をタイプしＥｎｔｅｒキーを押す。これにより、ＰＣの演算コードを取り出し、その後実行する。フェッチを実行するのには３サイクル、すなわち３段階必要である。次の表を参照のこと。
2010514058.tif 000008
最後の２つの数字の間で、＠ｐ＋演算コードがアドレス０におけるメモリから取り出され、ＰＣが１に増えていることがわかる。
これで、ＳＥＡｆｏｒｔｈ内のＭａｃｈｉｎｅ Ｆｏｒｔｈが起動することになる。
“ｓｔｅｐ  ｓｔｅｐ  ｓｔｅｐ  ．ｃ”をタイプし再度Ｅｎｔｅｒキーを押す。
2010514058.tif 000009
ＤＳの上部にロードされたゼロをＴレジスタ内に見ることができる。
プログラムカウンタは手動で制御可能である。つまり、コードをアドレス＄１９において隣の“ｓｔｅｐ”上で実行させたい場合、“＄１９  ｐｃ！”とタイプすればよい。
複数のコア上で一度にコードをしばしばテストするため、デバッグの間、あるノードから他のノードへ切り替える方法が必要である。ノード１４へ切り替えるため、“１４  ｎｏｄｅ！”或いは“ｅ  ｎｏｄｅ！”とタイプする。これは、現在どの基底にシミュレータが設定されているかに依存する。
プログラマはほとんど１６進数で作業するのが習慣になっているが、ノード数はほぼ例外なく１０進法により言及されている。
（メモリの内容を調べる）
“．ａｄｒｓ”ワードはメモリの内容及び分解を表示するのに用いられる。メモリの最初の５つのワードを見て、“０  ５  ．ａｄｒｓ”とタイプし、Ｅｎｔｅｒキーを押す。
2010514058.tif 000010
埋め込み式の名前付きメモリ位置が多数存在するので、いくつかの記述を無視することが必要である。以下は同じメモリ表示／分解であり、明確にするため編集されている。
2010514058.tif 000011
“：ｉｎｉｔ１２”を残したのは我々のワードであるからであって、現在利用していないｂｉｏｓコードからのワードではない。
メモリアドレス１内に０があるのがわかる。メモリにこの０をロードするのは＠ｐ＋アドレス０においてである。メモリアドレス３においても１があるのがわかる。＠ｐ＋は、実際の加算演算コードと共にスロット０内のアドレス２に存在する。この実際の加算演算コードは、同じメモリアドレスであるがスロット２内に存在する。
“ｈｅｘ  ０  ５  ．ａｄｒｓ”とタイプしＥｎｔｅｒキーを押す。
2010514058.tif 000012
開発システムは、１０進数（又は８進数）の指令を受けるまで１６進数モードのままである。
＜第４章：ＶｅｎｔｕｒｅＦｏｒｔｈ（商標）が作り出す問題＞
Ｍａｃｈｉｎｅ  Ｆｏｒｔｈは恐らく、プログラマが直面しがちな最も制限されたコマンドセットである。この章では、より顕著な問題のいくつかに取り組むと共に、我々の解決法のいくつかを示す。Ｃ１８が演算コードの大きさにおいて欠如しているものは、容易さにおける効率性で埋め合わせされる。また、各コアの大きさが小さいため、多数のコアが一つのパッケージ内に配置可能である。ＳＥＡｆｏｒｔｈ−２４Ａは２４のプロセッサを含む。
また、我々は最速及びメモリの最小設置面積を達成するために用いた有益な方法を示す試みをしてきた。また、我々の考えるコードクリップ及び技術が現在の問題への直接の適用或いはＳＥＡｆｏｒｔｈファミリーのさらなる理解につながることのいずれかに有用である。
減算演算コードはない。否定はビット単位ＮＯＴ操作によりほぼなされ、これにより１の補数がもたらされる。結果に１を加えると２の補数が生じる。これが求めていた補数であり、なぜならＣ１８は、他の全てのＡＬＵのように２つの補数スキームを用いて符号付きの計算を行うためである。
したがって、減算はＤＳ上に２つの数を配することによってなされる。この時、減算される数が上部にあり、ｎｏｔを適用し、そして（＋）を加え、そして最終的に１を加えて過度のｎｏｔを正す。
９から５を減算したい場合
2010514058.tif 000013
減算はまた以下の方法を用いて実行可能である。この減算はより容易であると共に、実行するための場所及びサイクルをほとんど必要としない。
９から５を減算するために、次はこれらの数字を逆の順番に配置する。
2010514058.tif 000014
（値のテスト及び比較）
最初は２つの基本比較に制限されていることがわかる。これらはｉｆ及び−ｉｆである。
ｉｆはノンゼロをチェックし、−ｉｆはマイナスをチェックする。テストを通過すれば、コードはｉｆ／−ｉｆが実行された後すぐに続く。テストが失敗すると、プログラムカウンタ（ＰＣ）はｔｈｅｎに直ちに続くコードのアドレスに変更される。
では、他の状況はどのようにチェックすればよいのか？
（Ｌｅｓｓ  Ｔｈａｎ（小さい）の場合）
上記の“減算を達成する”ための技術を用い、−ｉｆを用いてマイナスをチェックする。
例：（注：この例及びさらなる例において、スタックをロードするコードについては、説明されているプロセスの実際の部分である限り示さない。）
2010514058.tif 000015
（Ｇｒｅａｔｅｒ  Ｔｈａｎ（大きい）の場合）
日常が致命的であるなら、生命保険証書を更新するべきだ。大きい（Ｇｒｅａｔｅｒ Ｔｈａｎ）場合のテストは。他の数を減算することを除き、小さい（Ｌｅｓｓ  Ｔｈａｎ）場合のものと同じである。例えば、ＢからＡを減算し小さい（Ｌｅｓｓ  Ｔｈａｎ）場合をテストする場合、単純にＡからＢを減算し大きい（Ｇｒｅａｔｅｒ  Ｔｈａｎ）場合をテストする。
（大きい／小さいか等しい（Ｇｒｅａｔｅｒ／Ｌｅｓｓ  Ｔｈａｎ  ｏｒ  Ｅｑｕａｌ）場合）
上記と同じ手順を用いるが、−ｉｆの前に結果への１の加算を除く。すると“＞＝”又は“＜＝”が完了する。
2010514058.tif 000016
（ゼロのテスト）
“ゼロのテスト”又は“等価性のテスト”はない。
これに対処する様々な方法が存在する。本書においては２つの方法を言及する。方法１をここで説明する。ｎｅｘｔの演算コードを生かしてゼロを直接チェックするため、方法２は後に説明する。また、この方法はｎｅｘｔの他の素晴らしい特性を用いて配される方がよい。
方法１：ノンゼロを不適格とするためテストする。ｉｆ操作を用いノンゼロをチェックし、ノンゼロのテストを通過した場合、“ｒｕｎ−ｉｆ−ｚｅｒｏ”コードから分岐することができる。
2010514058.tif 000017
（等価性のテスト）
等価性をテストするため、２つの因数を減算し、ゼロをチェックすることが可能である。しかし、さらに優れた方法がある。
等価性をチェックするより優れた方法は２つのテスト値をｘｏｒすることである。それらが等価である場合、結果はゼロである。次に、ゼロをテストする。
2010514058.tif 000018
＜第５章：メモリアクセス＞
（メモリアクセスのためのレジスタ演算コード）
Ｃ１８のメモリ空間にアクセスするための２つのポインタレジスタ、ａ及びｂレジスタを用いる。レジスタａは従来のレジスタのように書き込まれると共に読み込まれるが、任意のメモリ位置に間接的に読み込み或いは書き込みを行うために用いられることもできる。つまり、ａレジスタの内容を読み込み及び書き込みすることができ、或いは読み込み／書き込みを、ａレジスタの内容が表すメモリアドレスへ／メモリアドレスから行うことができる。
ｂレジスタはａレジスタのように動作するが、レジスタの内容を直接読み込むことができない。レジスタへは書き込みのみ可能である。しかし、レジスタｂが表すメモリ位置は読み込み及び書き込みのどちらも行うことができる。この理由のため、レジスタｂはメモリアクセス専用に用いられる。
本書において、いくつかの桁区切りが省略されているが、これは演算コードとの混同を避けるためである。
・ａレジスタに直接書き込む場合、ａ！を用いる。
・ｂレジスタに直接書き込む場合、ｂ！を用いる。
・ａレジスタから直接読み込む場合、ａ＠を用いる。
・ｂレジスタからは直接読み込みはできない。
・ａレジスタにより指定されたメモリの内容を読み込む場合、＠ａを用いる。
・ｂレジスタにより指定されたメモリの内容を読み込む場合、＠ｂを用いる。
・ａレジスタにより指定されたメモリの内容を書き込む場合、！ａを用いる。
・ｂレジスタにより指定されたメモリの内容を書き込む場合、！ｂを用いる。
＄０８をメモリアドレス＄Ａ０に書き込む。
2010514058.tif 000019
（自動インクリメントを用いたレジスタ演算コード）
メモリ位置の読み込み／書き込み両方を行う２つの非常に有用なレジスタ演算コードが存在する。また、レジスタ内の値を自動インクリメントすることにより、隣のアドレスに書き込み／読み込みが行われる準備をする。ａレジスタのみが自動インクリメント演算コードを有する。これらの演算コードは、循環であってもなくとも、入出力バッファに特に有用である。
！ａ＋はａレジスタにより指定されたメモリアドレスに書き込みを行い、（１）をａレジスタに加える。
＠ａ＋はａレジスタにより指定されたメモリアドレスから読み込みを行い、（１）をａレジスタに加える。
2010514058.tif 000020
（例５．２．１に関する注意）
自動インクリメント読み込み及び書き込み演算コードは、効率的な循環バッファに非常に有用である。これは、その演算コードを何度も実行することが可能であると共に、いくつかの点においてメモリ空間の先頭へロールオーバーする。
現在、ＳＥＡｆｏｒｔｈ−２４ＡのＣ１８コアはＲＡＭの６４ワードで設定される。ａが＠ａ＋にインクリメントされると、アドレス６３を通過した場合０にラップアラウンドする。上記のリーダにおいて、読み込みループはマイクロループであって、これはｍｉｃｒｏ−ｎｅｘｔで終了する一つのワードに適合するものである。これはメモリからの他の命令をフェッチする必要がなく＄４００００回ループし、これによりＲＡＭは何度も完全に上書きされることができる。ループが終了すると、プログラムはデータが上書きされているコードを実行しようと試みるので、これは実用的な例ではなく、単に興味深い例である。プログラムが実行しているのを見ると、何度も０から６３を介し再び０に戻るａレジスタの循環がわかる。
重大なプログラムにおいて、ａレジスタはコードメモリ空間から分離されていることを注意しなければならない。ノード内のプログラムコードが過剰な！ａ＋の攻撃の犠牲に終わらないことを確実にすることは、プログラマの責任である。
もちろん、空きメモリ内で適合する任意の長さのバッファを有することも可能であるが、コードはａレジスタの値を検出すると共に抑制するために存在しなければならない。
＜第６章：ネイバ（ｎｅｉｇｈｂｏｒ）通信の序論＞
ネイバはメモリ位置としてアクセスされる。いかなる所定のノードに関して、メモリアドレスは４つまであり、それらはネイバノードにアクセスするために割り当てられたものである。これらのメモリアドレスを記憶するよりもむしろ、名前付き定数を記憶する必要がある。
ほぼ間違いなく、ネイバ通信で最も重要な気に留めておくべきことは以下の通りである。すなわち、ネイバから読み込み又はネイバへ書き込みを行う任意のノードは、トラックで停止する（スリープモードに入る）と共に、ネイバノードによって提供される読み込み又は書き込みの要求を待つ。一般に、これは“ブロッキング読み込み”又は“ブロッキング書き込み”と呼ばれる。
ＩＯＣＳと呼ばれる特別なメモリアドレスも存在し、これはノードを停止させることなく読み込まれることが可能であり、ネイバがノードから読み込み又は書き込みを要求するかを決定する。例えば、ブロッキング読み込みを実行する必要はなく、ノードが書き込みを待っているかどうかを単に調べる必要がない。
ノード１２は＄０７の値をノード１３に書き込む。
2010514058.tif 000021
＜第７章：Ｎｅｘｔのエクスプロイット＞
（Ｎｅｘｔの性質）
Ｎｅｘｔは、ｆｏｒ−ｎｅｘｔループの一部として通常用いられるものである。
ＦｏｒはＤＳから上部項目を移動させ、ＲＳ上に配する。ｎｅｘｔが遭遇すると、ＲＳの上部にある項目はゼロのテストが行われる。ゼロでない場合、ＲＳの上部にある項目はデクリメントされ、ｎｅｘｔはｆｏｒが発生するアドレスへの分岐をもたらす。
ＲＳの上部がゼロである場合、実行はｎｅｘｔを介しすぐ下に続くワードに移動する。ＲＳ上のデータ（この場合はゼロ）がなくなるが、ゼロの場合のみである。
ＲＳ上のｆｏｒ−ｎｅｘｔカウンタの分配を避けるために注意をしなければならない。通常の状況下では、ｎｅｘｔが実行される場合、カウンタがリターンスタックの上部にあることが望ましい。
つまり、ＲＳがノンゼロの場合、ｎｅｘｔは分岐及びデクリメントされたＲＳをもたらす。ＲＳがゼロの場合、ＲＳの上部にあるゼロはなくなり、プログラムカウンタはインクリメントされる。
コンプライアがｆｏｒ又はｂｅｇｉｎと遭遇する場合、次の操作のアドレスは注意されると共に、以下のｎｅｘｔ（或いはａｇａｉｎ）のリターンアドレスに用いられる。
ｎｅｘｔのアドレスがわかれば、コンパイル時間で演算コードを書き換え、ｎｅｘｔを所望の任意の場所へリダイレクトさせることができる。これはソフトコーディングと呼ばれ、いくらかのプランニングや少しの追加のメンテナンスを必要とする。しかし、ｎｅｘｔの全ての利点は解き放たれる。
Ｆｏｒとｎｅｘｔは常に、少なくとも一度ループする。
2010514058.tif 000022
＜第８章：スタック操作ｖｓリテラルのフェッチ＞
（リテラルのフェッチの実行速度）
（リテラル）
・リテラルをフェッチしスタック上に配するのに３クロックサイクルを要する。リテラルはまた完全なメモリの１８ビットワードに加え、フェッチ演算コード（＠ｐ＋）の他のメモリアドレスの一つのスロットを占める。
・ソースコードは、リテラルが用いられる時しばしばより簡単に読み込まれる。
（スタック操作）
・スタック操作は一般に１サイクル、及びワードの一つのスロットを要する。
・ソースコードは時に、リテラルを用いる同一のコードと同じぐらい読みやすいものではない。しかし、実行することにより、さらなるスタック操作技術を用いてコードを読み込み及び書き込みすることの両方は、進歩的にさらに容易になる。
そして、ＤＳを計画すること及びＤＳを値及びルーチンに必要な“変数“を用いて初期化することにより、ルーチンはさらに高速化すると共にメモリをほとんど占有しない。しかし、これは常にそういうわけではなく、スタックの配置及び自動変換の技術が少し存在する。
十分に注意して、ＤＳ及びＲＳ両方はデータの自動変換に用いられることができる。
2010514058.tif 000023
これは簡単に読み込み可能であるが、１は４サイクルを要する。このルーチンは約４ワードに、これらのワードの３つを占めているループを用いてコンパイルする。ループは１１サイクル毎に１回実行する。
2010514058.tif 000024
これは、スタック操作がリテラルメソッドと同じくらい読みやすいコードをもたらすよい例である。
このルーチンは、スタック設定を含む５ワードにコンパイルする。しかし、ループは２ワードにコンパイルする。そしてループは８サイクル毎に１回実行する。これは以前の方法の約３分の２の時間である。
（リテラルをフェッチせずに共通値を構築する）
リテラルを直接コンパイルする、或いはメモリからフェッチする際に必要なオーバヘッドのため、スタック操作及びＡＬＵを用いて必要な値を合成することはしばしば有用である。
よく見るもっとも一般的な例はｄｕｐ  ｄｕｐ  ｘｏｒであり、これはＤＳ（Ｔ）の上部にゼロをもたらすものである。これは、メモリのワード全体を要さず、実行するのに３サイクルのみを要する。
１を合成する方法は存在するが、それはより一般的なマクロを含む後の加算において取り扱う。ＤＳ（又はＲＳ）内の便利な場所に１を配するための時間を注げば、数回左に移動させることにより、１だけでなく、２，４又は８（或いはそれ以上）にも利用可能である。
ｐｏｗｅｒ  ｏｆ  ２が大抵必要とされるので、スタック上にｐｏｗｅｒ  ｏｆ  ２のリテラルを配することは、リテラルのコンパイルを避けることにより時間の節約をする一方、ルーチンに必要な値を合成するのにしばしば十分である。
ＤＳ上に配された４は０，１，２、又は８，１６，３２に素早く変換される。これはコンパイルされたリテラルがＤＳにその値を供給するよりももっと早い（ゼロはｄｕｐ  ｄｕｐ  ｘｏｒを用いてより簡単に構築されるが）。
これらの技術がどれほど有用でも、リターンを減少させる非常に現実的な点が存在する。リテラルは、必要な時に直接コンパイルされることがまだしばしばよいとされる。
（ブールフラッグとしての最上位ビット（ＭＳＢ））
ブール論理のためのＭＳＢ（ビット１７）の使用を助けるのにＣ１８プロセッサが指定される。シリアルコミュニケーションを指定するコア上で、ＳＥＡｆｏｒｔｈピンの１つはビット１７（ゼロ基底）に接続されるので、−ｉｆを用いて容易に高入力状態をチェックすることができる。
また、任意の正数に適用されたｎｏｔは結果として負数になるので、またその反対もあるので、ｎｏｔ及び−ｉｆは効率的な真偽のシステムの一部として容易に用いられることができる。任意の負数は真とされ、任意の正数は偽とされる。ｎｏｔは真偽の間で容易に切替えができる。これはよく用いられる。
以下は透過性のテストの章をさらに詳しく述べる例である。ここで、“：？Ｅｑｕａｌ”をｃａｌｌａｂｌｅのワードに変える。これは、Ｔ及びＳが等価である場合、負の値をＴに戻し、或いはＴ及びＳが等価でない場合、負でない値を戻す。
このコードにｃａｌｌを行ったコードはどれでも−ｉｆを用いて結果をテストすることができる。
2010514058.tif 000025
＜第９章：ページ及びワード配列＞
（分岐の制限の理解）
ＳＥＡｆｏｒｔｈプロセッサの現在の実施は、１８ビットメモリ空間による５１２ワードを利用する。異なる製品は異なるメモリ量を有することができるが、構造はなお、ちょうど５１２ワードのメモリマップである。これは、ＰＣが９ビット幅であるためである。全てのアドレスがデコードされているわけではない。２４ＡはＲＡＭの６４ワード＄００−＄３Ａで有し、またＲＯＭの６４ワードを＄８０−ＢＦで有している。特別機能のレジスタはビット８セットを有するので、アドレス＄１００上に存在する。
ページは８ワード境界にある。これは、分岐演算コードがスロット２内に存在し、分岐アドレスのために３ビットのみが残っている場合に、作用し始める。３ビット分岐アドレスはＰＣの上側の６ビットに、ゼロに設定された８ビットを用いて加えられ、分岐の方向を決定する。
ＳＥＡｆｏｒｔｈプロセッサはまた複数の演算コードを各ワードにパックする。４つまでの演算コードはメモリの単一のワードを占めることができる。“ｓｌｏｔ”する演算コードが占有できるものには制限がある。さらに、いくつかの演算コードは、コンパイルされるスロットに依存して様々な操作を行う。
分岐をもたらすことができる演算コードは、この構造により最も影響される。スロットの数が少ないほど、“分岐”演算コードはより自由である。しかしながら、分岐がさらに進むと、所定のワードのスロット０に分岐することのみ可能である。
分岐する演算コード（ｉｆ，−ｉｆ，ｎｅｘｔ，；，−；）及びそれらの宛先アドレスが一定のルールを破った場合、コードはコンパイルしない、或いはコードは無演算命令（．）でパッドされ、ワード配列を向上させる。この構造がどのように作用するかを理解することは不正なコンパイルを避け、高パフォーマンスのコードを書き込むのに役立つ。
（無演算命令のロールアウト−コードの圧縮及び加速）
無演算命令のロールアウトはページ及びワード配列を最適化するプロセスを言う。この最適化はＶｅｎｔｕｒｅＦｏｒｔｈ（商標）コードの最適化を目的とする。
無演算命令のロールアウトの一般的なルールは以下の通りである。すなわち、可能な場合、分岐する演算コード及びその宛先は、同じページ上にあるべきである。そうすることにより、分岐する演算コードがコンパイルされた時、カレントワードへコンパイルするという可能性が増大する。この時、残りのカレントワードをパッドアウトさせて新たなワードを開始させるコンプライアを有さずともよい。
特定の演算コードは特定のスロットに制限されるため、戦略上のポイントにおいて無演算命令を挿入することにより、他の無演算命令のホストがなくなる。同じ理由で、同じ結果を達成するため、演算コード又は演算コードの順番を変える方法を発見することにより、無演算命令、ワードをほとんど有さないコードを結果的にもたらし、したがって、さらに好ましい実行時間をもたらす。
ｏｒｇ、ラベル及び無演算命令をコードを用い、コードを配列させることができる。ルーチンの初期化における無演算命令が、ルーチンの再起部分のワード及びページ配列に全く役立たない場合、通常これらの無演算命令（又はラベル）を用いるのがよい。
非最適なワード配列を調べると共に修正するため、分解された状態を考察する必要がある。
【００２６】
インテラシス（ＩｎｔｅｌｌａＳｙｓ）社
ＳＥＡｆｏｒｔｈ（商標）−２４Ａ
デバイスデータシート（導入）
＜第１章：ＳＥＡｆｏｒｔｈ−２４Ａアレイプロセッサ＞
ＳＥＡｆｏｒｔｈ−２４Ａは最初のスケーラブル・エンベデッド・アレイ（Ｓｃａｌａｂｌｅ  Ｅｍｂｅｄｄｅｄ  Ａｒｒａｙ（商標）（ＳＥＡ））プロセッサチップであり、オンチッププログラム記憶を備える２４個の非常に小型で高速のプロセッサコアとプロセッサ間通信方法を組み合わせ、高レベルの処理能力をもたらす。その両方は１つのドル記号あたり及びミリワットあたりの単位をミップス（ＭＩＰＳ）とする。これにより、ＳＥＡｆｏｒｔｈ−２４Ａは、消費者向けの理想的なエンベデッドプロセッサソリューションとなる。
アレイ内の各ＣＰＵは、ＲＯＭ、ＲＡＭ、及び強力な入出力関数を用いて、１秒間に１０億までの命令を実行することが可能である。ＳＰＩインターフェースポートはシリアルアプリケーションをサポートすると共に１２Ｃ、１２Ｓ，又はＵＳＢ２．０も兼ねることができる。シリアルポートは複数のＳＥＡｆｏｒｔｈ−２４Ａを接続するのに用いることができる。
（図１：ＳＥＡｆｏｒｔｈ−２４Ａのスケーラブル・エンベデッド・アレイのブロック図）
2010514058.tif 000026
図１は装置を示す。装置は２４のＣＰＵコア、さらにメモリ及び入出力で構成される。コアのアーキテクチャはＣ１８と呼ばれ、これは１８ビット幅のＣＰＵであるためである。２４のプロセッサはＮ０からＮ２３まで番号が付けられており、これらは命令及びアーキテクチャの点において等しいが、異なる入出力を有する。各Ｃ１８プロセッサはローカルＲＡＭの６４ワード及びローカルＲＯＭの６４ワードを有すると共に、ウェーク／スリープハンドシェイク回路と共有の通信ポートにより、その隣の夫々に接続される。
動作する２４のコアと共に、設計者はそれらのグループを１８ビットＦＦＴ及びＤＦＴ、ワイヤレス通信、又はＵＳＢ等の特定のタスクに専念することができる。入出力は特にフレキシブルである。ＳＥＡｆｏｒｔｈ−２４Ａは特定の入出力プロトコル専用のシリコンを使用せず、むしろプログラマはソフトウェアの高速のシリアル入出力を実装することが可能になる。その結果、密結合された、特定のタスクに割り当てられる専用プロセッサの特に汎用的なユーザ定義のグループがもたらされる。
各プロセッサは非同期的に、シリコンの本来の全速力で動作する。プロセッサ間の通信は自動的に起こる。つまり、プログラマは同期方法を創る必要がない。通信は専用ポートを介してネイバ間で起こる。ネイバからデータを待つプロセッサはスリープモードに入り、１マイクロワット未満を消失する。同様に、データを受信する用意ができていないネイバにデータを送信するプロセッサは、ネイバがデータを受信するまでスリープモードに入る。入出力ピン上の外部信号はまた、スリープモードにあるプロセッサをウェークする。
（プロセッサコアの概略）
図２はブロック図を示す。ＳＥＡｆｏｒｔｈ−２４Ａ内の２４Ｃ１８コアの夫々は、命令と構造の点において他のコアと同一である（入出力及びサポートするＲＯＭのコードは変化する）。
各コアはネイティブの１８ビットプロセッサであり、従来のＦｏｒｔｈスタックマシンと非常に似ている。その命令セットは、データを操作するためのパラメータスタック及び制御フローネスティングのためのリターンスタックを用いてＦｏｒｔｈの基本命令を実行するのに調整される。Ｆｏｒｔｈの形態で最も頻繁に用いられるのはネイティブのＣ１８命令セットである。ワードとして知られるＦｏｒｔｈの命令の配列は、ネイティブＣ１８命令から構築される。プリフェッチの命令と関連して、Ｃ１８Ｆｏｒｔｈプロセッサは、複雑なパイプライン設計なしで極めて高速に動作する。
様々な命令がスタックから直接オペランドを取得するため、その命令はゼロオペランド命令として知られている。結果として、ほとんどの命令は長さがたった５ビットとなる。これにより３又は４つの命令が、１８ビット命令語内に実装される、或いは１８ビット命令語から実行される。５ビット命令の８つが、ワード内の最後の演算コードとして３ビットスロット内に配置される。
リテラルロード、コール、及びジャンプはオペランド及びメモリ（又はポート）サイクルを必要とする。ジャンプ又はコールは３、８、又は９ビットアドレスのアーギュメントを受け入れることができる。リテラル命令は、スタックにロードされるリテラルを特定するために５ビット演算コード及び１８ビットワードを利用する。
（プロセッサメモリ及び入出力）
ＳＥＡｆｏｒｔｈ−２４Ａデバイスの各Ｃ１８プロセッサは、ＲＡＭの６４ワード及びＲＯＭの６４ワードを有する。各ワードは１８ビット幅であると共に最大４つの実装された命令を保持することができる。
６４ワードのＲＯＭはブート、タスクスイッチ、及びプロセッサ間通信コードを含む。いくつかのプロセッサは、入出力ピンを扱うための特別なＲＯＭコードを有する。６４ワードＲＯＭはブートデバイスからダウンロードされたコードを含む。
デバイスの端にあるプロセッサ（Ｎ２−Ｎ５、Ｎ１１、Ｎ１２、Ｎ１７、及びＮ１８−Ｎ２３）の夫々は、入出力ピンのそれら自身のセットに接続する（Ｎ１及びＮ６は後に述べる特別なケースである）。全ての他のプロセッサは入出力がない。
（ＶｅｎｔｕｒｅＦｏｒｔｈ言語）
ＶｅｎｔｕｒｅＦｏｒｔｈ（商標）は、Ｆｏｒｔｈワードのコアセットであって、ＩｎｔｅｌｌａＳｙｓファミリの各プロセッサにセットされるネイティブの命令としてサポートされるものである。
Ｆｏｒｔｈは、ほとんどのデータをスタック上に維持しようというアイディアを基にした非常に効率的な言語である。１９７０年にＩｎｔｅｌｌａＳｙｓの創設者の１人、Ｃｈｕｃｋ  Ｍｏｏｒｅにより発展したＦｏｒｔｈプログラムは、小さいコードサイズ、高速な実行性、及び容易な拡張性を特徴とするものである。この拡張性はＦｏｒｔｈの“ワード”の概念に基づくものである。ワードは他のワードから組み立てられるものであり、全てＶｅｎｔｕｒｅＦｏｒｔｈディクショナリから始まる。ＶｅｎｔｕｒｅＦｏｒｔｈはＲＯＭ内のＦｏｒｔｈによって拡張される。このＦｏｒｔｈは入出力ライブラリとして機能し、プロセッサ間の通信ルーチン及び入出力の機能性を付加するものである。ＲＯＭ内のデフォルトの入出力ドライバは利用可能であり、又はＲＡＭ内のコードと置き換えられることができる。
ＩｎｔｅｌｌａＳｙｓは、Ｆｏｒｔｈｌｅｔｓ（商標）のサポートを付加することによりＦｏｒｔｈの能力を拡張してきた。Ｆｏｒｔｈｌｅｔｓ（商標）は、特別な処理を行うためにコアからコアへチップ周囲を移動することができるオブジェクト指向のコードである。
（図２：ＳＥＡｆｏｒｔｈ−２４ＡのＣ１８プロセッサコア−２４のうちの１つ）
2010514058.tif 000027
（Ｃ１８レジスタ構造の概略）
Ｆｏｒｔｈはスタック指向の言語である。アドレスに用いられる“通常”のレジスタ、データ及び計算は、表１に要約される通り２つのスタック内に配される。
Ｃ１８上のプログラムカウンタ及びＢレジスタは夫々９ビット幅である。Ｂ及び１８ビットのＡレジスタはアドレス指定に用いられる。Ｂは書き込み可能であるが読み込みは不可であり、フェッチ及びＢをポインタとして用いるストア命令によりサポートされている。Ａレジスタは書き込み及びリードバックが可能であると共に、このようにアドレス指定及び一時記憶装置に用いることが可能である。これはまたフェッチ、ストア、及び自動インクリメントフェッチ及びメモリアクセス後にＡレジスタをインクリメントするストア命令にサポートされる。
特殊目的のレジスタは、隣接するプロセッサと通信する４つの指向性レジスタを含む。指向性レジスタ及びその操作はプロセッサ間通信の章でさらに詳細に論述する。
また、入出力制御及び状態レジスタも存在する。入出力ピン両方の状態及び方向レジスタはこのレジスタ内で読み込まれる。ピンモード及び出力状態はＩＯＣＳレジスタに書き込むことによりセットされる。
（表１：Ｃ１８レジスタ）
2010514058.tif 000028
（表２：方向レジスタ）
2010514058.tif 000029
＜第２章：スタック操作の理解＞
（スタック構造）
Ｃ１８はデュアルスタックのプロセッサであり、ＡＬＵにより操作されるパラメータのためのデータスタック、及びＣＡＬＬ及びＲＥＴＵＲＮ命令により用いられるネストされたリターンアドレスのためのリターンスタックを有する。リターンスタックはまたＰＵＳＨ、ＰＯＰ、及びＮＥＸＴ命令により用いられる。
１０のデータスタックレジスタ及び９のリターンスタックレジスタは全て１８ビット幅である。プログラムカウンタは９ビット幅である。Ｃａｌｌ命令はＰＣをリターンスタックへ押しやる。Ｒｅｔｕｒｎ命令は全ての１８ビットをスタックから取り出すが、上部の９ビットは無視する。
Ｃ１８スタックはスタックポインタによりアクセスされるメモリにおける配列ではなく、むしろレジスタの配列である。データスタック上の上部の２つの位置は、Ｔ（Ｔｏｐの意）及びＳ（Ｓｅｃｏｎｄの意）と名づけられた専用レジスタを有する。これらの下に、８以上のスタックレジスタの循環配列がある。循環配列内の８つのレジスタの１つはＳの下のレジスタとしていつでも選択される。
リターンスタックの上部位置はＲと名づけられた専用レジスタである。Ｒの下は８つのリターンスタックレジスタの循環配列である。この配列内の８つのレジスタの１つはＲの下のレジスタとしていつでも選択される。
（スタックオーバーフロー及びアンダーフロー）
スタックオーバーフロー又はアンダーフロー状況のハードウェア検出はない。スタック上の項目の番号の経過を追うと共に、スタックが維持できる以上の項目を置こうとしないようにすることはソフトウェアの責任である。なぜなら、Ｃ１８のスタックは、スタック領域外でオーバーフロー又はアンダーフローできないスタックの底部にレジスタの循環配列を有しており、８つのスタックレジスタの循環配列の周りを覆うのみであるからである。スタックは有限の深さを有するため、スタックの上部へ何かを押し上げることは底部の何かが書き込み超過の状態であることを意味する。
データをスタックから取り出す時、底部の８つの項目はリピートする。２つのパラメータスタックの読み込み後、Ｔ及びＳは、８つのスタックレジスタの循環配列からの２つの項目のコピーを有する。８回以上の読み込みの後、Ｔ及びＳは同じ値を用いて再びリロードされる。項目を繰り返すことなく或いは項目をスタックへ書き込み返すことなく、何回これら８つの項目が順にスタックから読み込まれるかを制限するものはない。データスタック上（或いはリターンスタック上の８、４、又は２つのセル）の８、４、又は２つのセル内で繰り返すパラメータのセットを周期的に繰り返すアルゴリズムは、底部のレジスタが覆うにつれスタックからパラメータを繰り返し読み込む。
（スタックの策略）
ソフトウェアは様々な方法でスタック底部において循環バッファを利用する。ソフトウェアは単純に、スタックはいつでも「空」であると仮定する。スタックから古い項目を排除する必要はなく、これはスタックが一杯になると古い項目が下方へ押されると共に上書きされるためである。
例えば、シリアルプロセッサ上のＲＯＭコード内において、これはスタートビットを待つループ内で用いられる。コードはＩＯＣＳレジスタから入力ビットを読み込むと共に、−ＩＦ命令を用いてビットが正になるのがわかるまでループする。なぜなら−ＩＦ命令はスタック上の上部項目を除去しないので、ループはＴ内に新しい値を各回残す。１０ループの後、スタックの底部にある古い値は上書きされ、何千もの値はこのループ内のスタック上に配される。しかし、この時点においてプログラムにとって興味深いのは上部の値のみである。上部の値はループを抜けるとまるでスタックが空であったかのように作動する。これによりループはより短く、より小さく、及びより高速になると共に、ジッタの量をループ内のビットテスト及びループからの脱出の間で発生する量よりも減少させる。また、スタックポインタをリセットしてループの終端に空のスタックを得るための追加のコードも必要ないことも意味する。
＜第３章：プロセッサ間の通信＞
（方向の理解）
ＳＥＡｆｏｒｔｈチップファミリは柔軟なメカニズムを用い、個々のＣＰＵコアを通信させることを容易にする。特別なポートは隣接するＣＰＵ間でメールボックスのような役割を果たす。これらのレジスタは共通アドレス上のメモリ空間内にマップされる。どのように動作するかを理解するため、方向を示すためＳＥＡｆｏｒｔｈによって用いられる専門用語をまず明確にすることが役立つ。
慣習により、北、南、東及び西は大域の方向として用いられる。“北”という方向は常により大きな指数を有するコアへ向かい、例えばコアＮ０から北へ行くとコアＮ６に着く。同様に、“東”もまたより大きな指数を有するコアへと向かう。
ローカルコアは「上」、下、右及び左を用いて方向を表示するが、これらは常にＮ、Ｓ、Ｅ及びＷでマップしない。ソフトウェア及びハードウェア両方の効率性の理由から、隣接するコアが共通の入出力ポートアドレスを通信のために共有するほうがよい。したがって、図３に示す通り、個々のコアは共通の番号のポートを共有するよう配向されている。ローカル方向及びそのポートアドレスは表３に要約される。
（表３：プロセッサ間のポート）
2010514058.tif 000030
例えば、コアＮ０及びコアＮ６を共通ポート＄１１５上に有するほうが、アドレス＄１１５又は＄１４５を利用するかトラックするために共通ポートを有するよりもよい。この設計に適応するため、一定のコアにおいて左右及び上下が逆転している。図３に示す通り、薄い黄色でコードされたコアは左右が逆転している。したがって、例えば、コアＮ１８及びＮ１９はポート＄１Ｄ５を介して通信する。明るいシアン色でコードされた他のコアは、上下が逆転している。Ｎ１８はＮ１２と＄１１５を介して通信する。いくつかのコアは両方の逆転を有しており、図中において薄緑色でコードされている。
（図３：ＳＥＡｆｏｒｔｈの方向性の定義）
2010514058.tif 000031
（プロセッサ間の読み込み及び書き込み）
各コアはそのネイバに４つまでウェーク／スリープデータを共有する。ネイバは単一の共通のデータポートを共有する。一般にプロセッサ間の通信はブロッキング及び自己同期であり、つまり、プロセッサは操作が完了するまでスリープ状態になる。
各プロセッサ間の通信ポートはそのネイバに直接接続する。レジスタやＦＩＦＯ（先入れ先出し）はなく、１つのポートの読み込みワイヤはネイバの書き込みワイヤに直接接続される。プロセッサが読み込むと、ネイバプロセッサが書き込むまでブロックする。反対に、プロセッサが書き込むと、ネイバが読み込むまでブロックする。
プロセッサ間の通信をもたらすことに加え、このことは２つのＣＰＵも同様に同期する。所望であれば、ブロッキングは書き込み又は読み込み操作を行う前にステータスビットをテストすることにより回避されることが可能である。しかし、これは非常に効率性が低く、ポート通信が非常に低い重要性を有すると共に非常に稀になされる場合においてのみ用いられるべきである。
ポートを通過した情報はデータ又は命令であることが可能である。コアは、メモリがマップされたデータポートから命令を同時に直接実行する能力を有し、この実行はポート又はマルチポートアドレスにジャンプする或いはポート又はマルチポートアドレスをコールすることによってなされる。
（複数の読み込み及び書き込み）
プロセッサ間通信ポートは入出力空間内に配置される方法のため、各コアは１、２、３又は４つ全てのデータポートを単一の命令を用いて読み込む（又は書き込む）能力を有する。コアは保留中の読み込み或いは書き込みのいくらかが満たされるとすぐに復活する。他の保留中の読み込み／書き込みは、復活したコアが隣の命令へと移動するのでキャンセルされる。この技術はデータを分散すると共に複数のプロセッサのクラスタ間で制御するのに用いられることができる。
いくつかのアプリケーションにおいて、プロセッサは４つ全てのポートから読み込みを実行し、そして必要とされるまでスリープモードになる。これは便利なプログラミング技術であり、例が以下に示される。しかし、２つのプロセッサは、読み込み又は書き込みの両方の実行において、共通データポート上で同時にフリーズしないということをプログラマは注意しなければならない。両方のプロセッサは、ハードウェアのリセット以外でプロセッサを起こすのに利用可能なメカニズムを有さずに、スリープ状態のままである。
プロセッサがいくつかのプロセッサ間の通信ポートの読み込みを同時に実行する場合、プログラマはそのネイバの１つのみが実際に読み込み要求を満たすということを確実にするべきだ。１以上のネイバからの書き込みを同時に受信するとデータ衝突がもたらされ、これは通常所望される結果ではない。
以下のコードフラグメント複数ポートの読み込みの例を示す。ブート上で、ほとんどのコアはコードを用いて初期化されるのを待ちながらウェークし、スリープ状態へ入る。ノード７（内部ノード）はウェークすると共に、４つの方法で読み込みを実行し、これによりノード７はスリープ状態になる。
2010514058.tif 000032
プロセッサ間通信のための入出力ポートマップのフラー版（ｆｕｌｌｅｒ  ｖｅｒｓｉｏｎ）を表４に示す。表の３列目に示す通り、４つの方向はアドレスバスの単一のビットにより夫々選択される。複数のビットを設定することは読み込み又は書き込みのための複数のポートを選択する。
（表４：プロセッサ間の通信ポート−マルチポートアドレスマップ）
2010514058.tif 000033
任意の組み合わせのポートアドレスは、所望のビットを設定することにより２進数の値を構築することによって計算され、そして排他的論理和を＄１５５を用いて実行する。
したがって、＄１５５を有する＄０９０の排他的論理和は＄１Ｃ５をもたらす。（排他的論理和のステップの理由は添付２で説明される。）
プロセッサが読み込めば、組み合わされた読み込み（又は書き込み）により対象とされた任意の要求されるポートのいずれか一つにデータが書き込まれるまで、スリープ状態のままである。その点において、全ての投稿された読み込み（又は書き込み）の要求は、第１の単一の書き込み（又は読み込み）により消去され完全なものとなる。
＜第４章：メモリ及び入出力＞
（メモリ及び入出力の概略）
ＳＥＡｆｏｒｔｈファミリ内の外部メモリ及び入出力の処理において実際に差はない。装置端部周囲のプロセッサのコアは、入出力論理を用い外部の世界と通信するが、中心部のコアは（通常）通信しない。特に、メモリは入出力ポートのペアとして、１つ目はアドレス及び２つ目はメモリへのデータ或いはメモリからのデータとして見られる。
（コアへの入出力の割り当て）
下記に述べるとおり、様々なコアが所定の入出力機能へ接続されている。デバイスの全ての端部又はコアの隅はそれ自身の特性を有している。各コアは特定の入出力ピンおセットへの排他的なアクセスをもたらす。例えば、ＳＰＩインターフェースは、４つの入出力ピンを有するノード上にもたらされる。アナログ入力及び出力はＮ１８及びＮ２３を介してアクセスされる。
（表５：入出力リソース）
2010514058.tif 000034
（ＳＰＩフラッシュブート）
コアＮ５は、ブートの目的のためにシリアルフラッシュをサポートする。コアＮ５はＳＰＩ（Ｓｅｒｉａｌ  Ｐｅｒｉｐｈｅｒａｌ  Ｉｎｔｅｒｆａｃｅ）を実装する４つのピンを有する。ＲＯＭコードはシリアルメモリフラッシュデバイスから任意でブートするための能力をもたらす。通常、デバイスは個々に接続されたフラッシュからブートしようと試みるが、Ｎ５のＳＰＩデータインピン上の高電圧はデフォルトのブートを防止する。
このインターフェースは特徴的に、シリアルＥＥＰＲＯＭ又はフラッシュデバイス等のブートデバイスと通信する。ＳＰＩインターフェースは任意でチップをブートし、２５０Ｋｂｐｓでクロックし、小さい安価なシリアルデバイスからブートすることを可能にする。ブート後、インターフェース上のタイミングは２０Ｍｂｐｓまでの速度においてクロックされることが可能である。ブート後、ＲＡＭベースのコードは他のＳＰＩ機能をサポートすることができる。
（外部メモリ）
コアＮ０は外部メモリにインターフェースで接続し、フラッシュ、ＳＲＡＭ、又は同様のデバイスへのメモリの拡大をもたらす。Ｎ０は、外部メモリ及び他のプロセッサ間でメモリアクセスを送信するようプログラムされている。
アドレスバスは１８ビットを有すると共に、メモリを１８ビットワードと見なす。３つのメモリ制御ピンが含まれている。高速１８ビットＳＲＡＭデバイスをサポートするＲＯＭ内のソフトウェアがもたらされる。ＲＯＭソフトウェアはＮ１及びＮ６のプロセッサを、プロセッサＮ０上のメモリサーバをサポートする入力及び出力のために用いる。Ｎ０への入力はＮ６上でバッファされ、出力はＮ１を介してなされる。Ｎ１及びＮ６はＮ０の外部ＲＡＭサーバをサポートするのに用いられる場合はピンを必要としない。アドレスラインは書き込み専用であり、データバスは入出力レジスタ内のビット１２を介しトリステートになることができる。
ソフトウェアは外部アドレスバス、外部データバス、及び制御ピンが使用される方法を決定する。この外部インターフェースに接続されるデバイスはＳＲＡＭ、ＤＲＡＭ、パラレルバスＥＥＰＲＯＭ又はフラッシュであることができる。実際のバスタイミング及び機能性はソフトウェアにより制御され、ＤＤＲ２等の複雑なメモリバスは所望の通りコードされる。
インターフェースが外部メモリとして利用されない場合、外部アドレス、データ及び制御バスピンは通常の目的の入出力として用いられることができる。
（アナログ入出力）
コアＮ１８及びＮ２３は、アナログからデジタルへ及びデジタルからアナログへの変換装置として機能すると共に、アナログ入力ピン及びアナログ出力ピンを有する。さらに、各コアは、４で割られた電圧制御発振器のデジタル出力のためのピンを有する。ソフトウェア出力は変換率及び分解を制御する。
アナログ出力ピン上の電圧はカウンタを駆動させる電圧制御発振器を駆動させる。ゼロボルトはカウンタを約２ＧＨｚで駆動し、１．４ボルトはカウンタを約１ＧＨｚで駆動させる。アナログからデジタルへの変換は、レジスタ＄１７１から低ビットを読み込むことによってなされる。これは電圧制御発振器（ＶＣＯ）のカウンタ出力であり、アナログ出力の値に対応するものである。これは、値を得るために＄１５５５５と排他的論理和でなければならない反転パターンである。２つの数値は異なる読み込みを得るため減算される。最大速度に関して、差分計算及び任意の線形化はネイバプロセッサによりなされる。２つの間における差分は、ＶＣＯ出力カーブ上の点をあらわす周知の一定時間を数え上げる。
デジタルからアナログへの変換は、９ビットの値をＩＯＣＳレジスタの低ビットへ書き込むことによりなされる。ＩＯＣＳレジスタビット１５、１４及び１３への書き込みを行うことにより、電圧制御発振器の切替えを行うと共に、ＶＣＯの電圧を頻度関数に決定するＰ及びＮトランジスタを制御する。発振器のスイッチを入れて０をデジタル／アナログ変換に送信すると＄０２０００を送信する。
（表６：アナログ−デジタル変換器（ＡＤＣ）及びデジタル−アナログ変換器（ＤＡＣ）操作の制御ビット）
2010514058.tif 000035
（シリアル入出力）
いくつかのコアは２つの入出力ピンを有すると共にこのような機能を非同期性のシリアルインターフェース（ＵＡＲＴ）として実装することができる。このＵＡＲＴはコンソール、シリアル入出力デバイス、又は他のＳＥＡｆｏｒｔｈ−２４Ａデバイスを接続するためのものである。特に、Ｎ３、Ｎ１２、Ｎ１７及びＮ２１上のＲＯＭコードは、その非同期性のシリアルポートを介してブート可能である。Ｎ３及びＮ２１上の入出力ピン、またＮ１２及びＮ１７上の入出力ピンはＩＣの反対側に整列する。これにより、プロセッサのシリアル出力ピンは他のプロセッサのシリアル入力ピンと共に整列し、接続距離を最小限にする。
シリアルインターフェースにより、ＳＥＡｆｏｒｔｈ−２４ＡデバイスがＰＣ、コンソール、シリアル入出力デバイス、又は他のＳＥＡｆｏｒｔｈ−２４Ａデバイスと通信することが可能となる。複数のＳＥＡｆｏｒｔｈ−２４Ａは、さらなる処理能力のためシリアルインターフェースを利用して共に接続されることができる。ＳＥＡｆｏｒｔｈ−２４Ａは任意のＲＯＭベースのシリアルインターフェースからブート可能であるので、共に接続された複数のＳＥＡｆｏｒｔｈ−２４Ａは、全てのＳＥＡｆｏｒｔｈ−２４ＡデバイスをブートさせるのにＳＰＩインターフェースを利用する必要がない。
Ｎ３、Ｎ１２、Ｎ１７及びＮ２２のＲＯＭコードにより、プロセッサはスリープモードからウェークすることができ、これは非同期性のシリアルインターフェースのうちの一つの上にある隣のスタートビットによりなされる。
（ＧＰＩＯ（汎用入出力））
コアＮ２、Ｎ４、Ｎ１１、Ｎ１９、Ｎ２０、Ｎ２１及びＮ２２は、ＧＰＩＯの単一の双方向のピンを有する。
コアのほとんどは、アドレスからの読み込みを介してスリープ状態からウェークし、使用されていないＣＯＭポートを、入出力のビット１７内で読み込まれた入力ピン上の最高値により選択する。（コアはＮ２、Ｎ３、Ｎ４、Ｎ５、Ｎ１１、Ｎ１２、Ｎ１７、Ｎ１８、Ｎ１９、Ｎ２０、Ｎ２１、Ｎ２２及びＮ２３である。）
これらのプロセッサ上で、ピンからの入力は、ネイバを有さないポート上にあるハンドシェイク回路に接続される。これらのピンの一つの上にある最高値は、ネイバに接続しないポートを含む読み込まれたポート上でスリープ状態になった場合、プロセッサをスリープ状態からウェークさせる。ノードが高電圧を入力ピン上に見出した場合、ＲＯＭはこの特性を非同期性シリアルモード状態でウェークするノードに利用する。ウェークした後、これらのノード上のＲＯＭは、ノードがウェークしたのはネイバの作業要求によってか或いはウェークアップ入力ピンを読み込むことによってかを決定する。ピンにかかる高電圧は、ノードがシリアル入力によりウェークされたことを示す。そしてＲＯＭコードはタイミングビットを通信速度を決定するように調節すると共に、非同期的なシリアル入力からブートし始める。ＲＯＭコード内のウェークアップにおけるピンにかかる低電圧は、ネイバによりウェークされ、またプロセッサが書き込まれた共有の通信ポートの夫々を実行することを意味する。
＜第５章：入出力レジスタの詳細説明＞
各コアのプロセッサは、ちょうど一つの入出力状況及びピン制御レジスタを有しており、これは位置＄１５Ｄにアドレス指定されている。このレジスタは２つの機能を実行する。全てのコアに関して、それらの共有のウェーク／スリープ通信ポートレジスタの現在の状況をもたらす。入出力ピンが繋がるこれらのコアに関し、ピンの構成及び読み込み或いは書き込みの両方の方法をもたらす。
コアＮ０は、他のコアが有さない２つのレジスタを有する。メモリアドレスレジスタがポートアドレス＄１７１に、またデータレジスタがポートアドレス＄１４１に存在する。
（表７：入出力レジスタビットの割り当てに用いられる略語）
2010514058.tif 000036
表８は“一般的な”コア入出力レジスタを示す。コアは、プロセッサ間通信レジスタ状態ビットのセットを４つまで有することができ、また外側の世界への“本物の”入出力を有することができる。一般的に、全てのコアは全てのオプションを有しておらず、特に端部のコアはプロセッサ間の通信レジスタ状態ビットの全てを用いない。同様に、中心にあるコアも入出力を有さない。
以下のページに続く個々のレジスタの説明において、ポートアドレス値（例：１Ｄ５）は、ポートが接続するコアの名前と置き換えられる。例えば、コアＮ０上において、１Ｄ５ポートはＮ１に接続し、そのためビット位置１６及び１５はＲｄＮ１及びＷｒＮ１と夫々分類される。ＲＲ＝読み込みレジスタ（Ｒｅａｄ  Ｒｅｇｉｓｔｅｒ）であり、ＷＲ＝書き込みレジスタ（Ｗｒｉｔｅ  Ｒｅｇｉｓｔｅｒ）である。
（表８：一般的なコア入出力レジスタの概略）
2010514058.tif 000037
以下のレジスタの説明全体を通して、他のアウトプットピンの状態を制御する対になる出力ビットが存在する。全ての場合において、ビットの機能は表９に示す通りである。
（表９：入出力ピン配置制御ビット）
2010514058.tif 000038
（表１０：コアＮ０入出力状態ポート＄１５Ｄ）
2010514058.tif 000039
ビット１２、ＤＢＴＳはデータバストリステート制御ビットである。
（表１１：コアＮ１入出力状態ポート＄１５Ｄ）
2010514058.tif 000040
（表１２：コアＮ２入出力状態ポート＄１５Ｄ）
2010514058.tif 000041
（表１３：コアＮ３入出力状態ポート＄１５Ｄ）
2010514058.tif 000042
（表１４：コアＮ４入出力状態ポート＄１５Ｄ）
2010514058.tif 000043
（表１５：コアＮ５入出力状態ポート＄１５Ｄ）
2010514058.tif 000044
（表１６：コアＮ６入出力状態ポート＄１５Ｄ）
2010514058.tif 000045
（表１７：コアＮ７入出力状態ポート＄１５Ｄ）
2010514058.tif 000046
（表１８：コアＮ８入出力状態ポート＄１５Ｄ）
2010514058.tif 000047
（表１９：コアＮ９入出力状態ポート＄１５Ｄ）
2010514058.tif 000048
（表２０：コアＮ１０入出力状態ポート＄１５Ｄ）
2010514058.tif 000049
（表２１：コアＮ１１入出力状態ポート＄１５Ｄ）
2010514058.tif 000050
（表２２：コアＮ１２入出力状態ポート＄１５Ｄ）
2010514058.tif 000051
（表２３：コアＮ１３入出力状態ポート＄１５Ｄ）
2010514058.tif 000052
（表２４：コアＮ１４入出力状態ポート＄１５Ｄ）
2010514058.tif 000053
（表２５：コアＮ１５入出力状態ポート＄１５Ｄ）
2010514058.tif 000054
（表２６：コアＮ１６入出力状態ポート＄１５Ｄ）
2010514058.tif 000055
（表２７：コアＮ１７入出力状態ポート＄１５Ｄ）
2010514058.tif 000056
（表２８：コアＮ１８入出力状態ポート＄１５Ｄ）
2010514058.tif 000057
ＶＣＯ／４、ビット２はＶＣＯ可能である。
（表２９：コアＮ１９入出力状態ポート＄１５Ｄ）
2010514058.tif 000058
（表３０：コアＮ２０入出力状態ポート＄１５Ｄ）
2010514058.tif 000059
（表３１：コアＮ２１入出力状態ポート＄１５Ｄ）
2010514058.tif 000060
（表３２：コアＮ２２入出力状態ポート＄１５Ｄ）
2010514058.tif 000061
（表３３：コアＮ２３入出力状態ポート＄１５Ｄ）
2010514058.tif 000062
（表３４：コアＮ０入出力状態ポート＄１７１）
2010514058.tif 000063
メモリアドレスレジスタは書き込み専用である。読み込みはランダムな結果をもたらす。このレジスタへの書き込みはブロックを行わず、これらの信号に接続される外部論理の動作に関わらず、第２の書き込みは先の値を上書きする。
（表３５：コアＮ０メモリデータレジスタ＄１４１）
2010514058.tif 000064
データレジスタは読み込み／書き込み用である。このレジスタへの読み込み／書き込みはブロックを行わず、これらの信号に接続される外部論理の動作に関わらず、第２の書き込みは先の値を上書きする。
＜第６章：プロセッサの演算コードの説明＞
（演算コード圧縮）
Ｃ１８プロセッサは５つのビットを利用し演算コードを定義する。１８ビット命令語は４つの命令スロットを含む。全ての命令は３つの左端のスロット、すなわちスロット０、スロット１及びスロット２から実行できる。スロット３は特別で、３ビットのみで構成されると共に、下位２ビットが二進数の００であるこれらの命令のみを含むために用いられる。
（ＩＦ及びＮＥＸＴのテスト）
ＩＦ又はＮＥＸＴの命令は、レジスタＴ又はＲが夫々ゼロを含むかどうか素早く決定しなければならない。この決定は、Ｔ又はＲのいずれかを変化させるいかなる命令の実行の一部として、自動的に発生する。ＩＦ又はＮＥＸＴが実行を開始すると、ラッチされた試験結果を利用してすぐにフェッチを開始するまでに次の命令の適切なアドレスを選択する。
（演算コード毎のクロックサイクル）
ほとんどの演算コードは１つのクロックサイクルで実行されるが、いくつかはより長いサイクルを要する。
・入出力レジスタにアクセスするのに２サイクルを要する。
・ネイバノードが既に待機状態であるハンドシェイクポートにアクセスするための基準時間は２サイクルである。
ＲＯＭ又はＲＡＭにアクセスするための時間は３サイクルである。
（ＡＬＵベース命令のタイミング）
図２に示す通り、ＡＬＵはＴ及びＳレジスタにより入力されると共に、その結果をＴレジスタに戻す。ＡＬＵは純粋に組み合わせのものである。ＡＬＵを通過する論理パスのいくつかは他のパスよりも長く、特に、加算命令（Ｐｌｕｓ及びＰｌｕｓ−ｓｔａｒ）はキャリービットを伝搬させるための時間を要する。ＡＬＵはこれが起こるために２つの命令時間を要する。これにより以下の結果が得られる。スタックに影響する命令が加算によりすぐになされる場合、適当な伝搬時間を確実にするためＮＯＰを挿入しなければならず、例えばＰＯＰ、ＮＯＰ、ＰＬＵＳを挿入する。
Ｔ及びＳレジスタが１以上の命令で安定している時、ＮＯＰは必要でない。ＴまたはＳに影響せず、またこのように加算命令の伝搬時間を促進する命令は“Ａｉｄｓ＋”と呼ばれる。これはＰｌｕｓの実行時間を支援（ａｉｄ）するためである。これを行う命令は“Ａｉｄｓ＋“の列で”ｙｅｓ“で示される。
（分岐命令）
分岐演算コードは、ＣＡＬＬ、ＪＵＭＰ、ＩＦ、−ＩＦ及びＮＥＸＴ（ｍｉｃｒｏ−ｎｅｘｔは除く）を含む。分岐がスロット０から実行すると、ＰＣは、１３ビット命令アドレスフィールドからインクリメントされた全ての９ＬＳＢの値を用いてアップデートされる。分岐演算コードがスロット１又は２である場合はいつでも、プログラムカウンタのビット８（９番目のビット）は０になる。したがって、スロット１及び２の分岐は入出力空間に届く（又はその中に留まる）ことができず、ＲＡＭ又はＲＯＭの宛先に制限される。
分岐がスロット１内である時、アドレスの低８ビットはアドレスフィールドからもたらされる。したがって、分岐命令が実行されるその時点で、ＰＣと同じ２５６ワードページ上のアドレスのみを読み込むことが可能である。
分岐がスロット２内である時アドレスの、ビット０から２（低３ビット）はアドレスフィールドからもたらされる。ビット３から７はちょうどインクリメントされたＰＣから生じる。ビット８はゼロである。したがって、スロット２の分岐は同じ８ワードページ上に留まる。
（アドレスインクリメントのルール）
命令を実行する間、アドレスインクリメントのいくつかのインスタンスが存在する。これらはインクリメントを有するリテラルフェッチ、“リテラルストア”、及びＡレジスタフェッチ及びストアと同様に、ＰＣをインクリメントする通常の命令フェッチを含む。アドレスインクリメント機能に組み込まれた特別な論理が存在し、これは全ての使用状況に影響するものである。内部アドレスバスはたった９ビット幅であるので、インクリメントは任意のレジスタの低９ビットのみに影響することができる。ＰＣは既に９ビットに制限されているので、この制限はＡレジスタにのみ影響を有する。
第１の特別なケースは、アドレスがＲＯＭ又はＲＡＭアドレス空間のいずれかを選択する場合いつでも起こる。インクリメントの間、キャリーは低７ビット以内でのみ伝搬する。このアドレス空間内の全ての１２８ワード境界で、インクリメントされたアドレスはページの先頭へラップバックする。メモリはアドレスビット６をデコードしないので、各６４ワード境界において効果的なラップが存在する。
第２の特別なケースはアドレスが内部入出力レジスタ空間を選択する場合いつでも起こる。この領域でのアドレスインクリメントは全体的に抑制されている。これが意味するのは、命令フェッチ、リテラルフェッチ、及び“リテラルストア”が、ポート空間から実行される場合、ＰＣの値に影響を与えることなく利用可能であるということである。ポートからのコールはポートへと戻る。
（表３６：ＳＥＡｆｏｒｔｈ命令セットの要約）
2010514058.tif 000065
2010514058.tif 000066
（ＣＡＬＬ演算コード）
2010514058.tif 000067
Ｒをリターンスタックへ転送し、現在のＰＣをＲの低９ビットへ配置する。次の命令語をｌａｂｅｌのアドレスからフェッチする。“インクリメントされた”アドレスはＰＣにロードされる。
（ＲＥＴＵＲＮ演算コード）
2010514058.tif 000068
隣の命令語をＲの低位９ビットによりもたらされたアドレスからフェッチする。隣の値が下がると、Ｒの１８ビット全てを置き換えるリターンスタックから取り出す（ｐｏｐ）。“インクリメントされた”アドレスはＰＣにロードされる。ＲＥＴＵＲＮを含む命令語内の使用されていない任意のスロットは省略され、実行は新たな命令語のスロット０からレジュームする。
（ＪＵＭＰ演算コード）
2010514058.tif 000069
隣の命令語をｌａｂｅｌのアドレスからフェッチする。“インクリメントされた”アドレスはＰＣにロードされる。
（ＣＯＲＯＵＴＩＮＥ演算コード）
2010514058.tif 000070
隣の命令語をＲの低９ビット内のアドレスからフェッチする。現在のＰＣをＲの低９ビットにロードする。そして、インクリメントされたアドレスはＰＣにロードされる。ＣＯＲＯＵＴＩＮＥを含むワード内の任意の利用されていないスロットは省略され、実行が新たな命令語のスロット０でレジュームする。隣の命令語をフェッチし新たなＰＣをインクリメントする前に、ＰＣは低９ビットと交換されたかのように効果が同一である。この演算コードの利用は計算又はベクタのｃａｌｌ又はｊｕｍｐか、或いはｃｏｒｏｕｔｉｎｅかのいずれかであると考えられることができる。つまり、他方の最終の終了／中止ポイントで、もう片方における実行を中止／継続することが可能な２つの機能の夫々である。これはまた、基本タスクスイッチであるとも考えられることができる。
（ＩＦ演算コード）
2010514058.tif 000071
Ｔレジスタがゼロの場合、隣の命令語のアドレスは、分岐アドレスフィールドから計算されるか、或いは現在のＰＣアドレスが用いられる。隣の命令語はこのアドレスからフェッチされる。“インクリメント”されたアドレスはＰＣにロードされる。
Ｔレジスタがノンゼロの場合、ｉｆ及びｔｈｅｎのニーモニック間に存在するコードが実行される。Ｔがゼロの場合、プログラム制御はｔｈｅｎのニーモニックに続く命令へベクタする（ｉｆ及びｔｈｅｎのニーモニック間の命令は実行される）。ＩＦ演算コードはまたＵＮＴＩＬによってコンパイルされる。その場合、プログラムは、Ｔがゼロの場合後方へ分岐し、或いはループの外へ抜ける。
注：ＩＦは演算コードをコンパイルし、ＥＬＳＥ又はＴＨＥＮは分岐のアドレスを決定すると共にコンパイルされた分岐演算コードの代わりをする。−ＵＮＴＩＬは−ＩＦ演算コードをコンパイルすると共に、分岐アドレスを前のＢＥＧＩＮによってコンパイラのスタック上に残されたアドレスを用いて決定する。
（−ＩＦ演算コード）
2010514058.tif 000072
Ｔの最大有効ビットがゼロの場合、隣の命令語のアドレスは分岐アドレスフィールドから計算される、或いは現在のＰＣアドレスが用いられる。隣の命令語はこのアドレスからフェッチされる。“インクリメントされた”アドレスはＰＣにロードされる。
−ｉｆ及びｔｈｅｎのニーモニック間に存在するコードは、Ｔレジスタの最高位ビットがセットされると実行される。最高位ビットがリセットされた場合、プログラム制御はｔｈｅｎのニーモニックに続く命令にベクタする（−ｉｆ及びｔｈｅｎのニーモニックの間の命令は実行されない）。
注：−ｉｆが演算コードをコンパイルすると、ＥＬＳＥ又はＴＨＥＮは分岐のアドレスを分解すると共に、コンパイルされた分岐演算コードのアドレスフィールドの代わりをする。−ＵＮＴＩＬは−ＩＦ演算コードをコンパイルすると共に、先のＢＥＧＩＮによりコンパイラのスタック上に残されたアドレスを用いて分岐アドレスを分解する。
（ＮＥＸＴ演算コード）
2010514058.tif 000073
Ｒレジスタがゼロでない場合、隣の命令語のアドレスは、分岐アドレスフィールドから計算され、或いは現在のＰＣアドレスが用いられる。隣の命令語はこのアドレスからフェッチされる。“インクリメントされた”アドレスはＰＣにロードされる。Ｒはゼロでなかったという場合、すべての１８ビットはデクリメントされ、新しい値はＲにロードされる。実行の開始時にＲがゼロである場合、リターンスタックは取り出され、Ｒは隣の項目のｄｏｗｎと置き換えられる。現在Ｒに存在する数は、ＮＥＸＴがループの上部に分岐する残り時間の数字を表し、或いはループ本体が実行される回数より少ない数字を表す。ループ回数はループ外にあるＦＯＲ又は明示的なＰＵＳＨ演算コードにより、リターンスタックへ転送されると仮定される。
ループ回数はループ外のリターンスタック上へ転送されなければならないが、ループが完了すれば自動的に除去されることを留意しなければならない。また、隣のループ内のリターンスタックのいかなる他の利用のバランスを取ることにより、ループ回数が隣の実行の間、常に適所にあることを注意しなければならない。
（ＵＮＥＸＴ演算コード）
2010514058.tif 000074
マイクロネクスト（ｍｉｃｒｏ−ｎｅｘｔ）と発音されるＵＮＥＸＴは、アドレスフィールドを含まない。Ｒがゼロでない場合、ｍｉｃｒｏ−ｎｅｘｔは他の命令語をフェッチしないが、スロット０から開始する現在キャッシュしたワードの実行を継続する。Ｒがゼロに到達すると、ｍｉｃｒｏ−ｎｅｘｔはその時ＰＣが指し示す至る所から隣の命令をフェッチする。命令フェッチを行う必要性が排除されるので、高速の４つの命令ループが可能となる。ループを繰り返すのに１つのクロックのみが用いられる。
ループが完了した時、ＵＮＥＸＴがポートアドレスのスロット３から実行されると、同じポートから隣の命令がフェッチされる。これは、アドレスのインクリメントの規則によりポートアドレスが変化することを避けるからである。ポートのネイバが新しい命令語を書き込まれてない場合、ネイバがそれを書き込むまでプロセッサはサスペンドする。ネイバがすでに演算コードを書き込みｍｉｃｒｏ−ｎｅｘｔに従う場合、プロセッサはその演算コードのロード及び実行を行い、ネイバはレジュームする。ループ回数はループ外のリターンスタックに転送されなければならないが、ループが完了すると自動的に排除される。また、隣のループ内のリターンスタックのいかなる他の利用のバランスを取ることにより、ループ回数が隣の実行の間、常に適所にあることを注意しなければならない。
（ＬＩＴＥＲＡＬ演算コード）
2010514058.tif 000075
プログラムメモリの隣のワードを現在のＰＣアドレスからフェッチする。１８ビットの値はデータスタックに転送される。“インクリメントされた”アドレスはＰＣにロードされる。
コンパイラがソースコード内の数値リテラル又は同一の記号に遭遇すると、＠ｐ＋演算コードは、必要であれば新たな命令語を開始して隣の利用可能なスロットに自動的にコンパイルされ、そしてリテラル値を隣のプログラムメモリの利用可能なワードに保存する。これは暗黙リテラルのコンパイルと呼ばれる。リテラルフェッチ演算コードを名前ではっきりとコンパイルすると、プログラマの責任により、リテラル値はプログラムメモリ内の正確な後続する位置に配置され、これにより、＠ｐ＋の実行時に現在のＰＣの値によってフェッチされる。リテラル値はコンマと共に配される計算された数であることが可能であり、或いはポートストアを解して他のプロセッサへ渡されることを意図した他の命令語であることが可能である。この技術を用いる時、スロットの数及び命令語境界は正確に数を数えられることを確実にすることを注意しなければならない。
（ＰＵＳＨ演算コード）
2010514058.tif 000076
データスタック上部の要素はこのスタックから取り出されると共に、リターンスタックへ転送される。
（ＰＯＰ演算コード）
2010514058.tif 000077
リターンスタックの上部の要素はこのスタックから取り出されると共に、データスタックへ転送される。
（ＤＵＰ演算コード）
2010514058.tif 000078
データスタック（Ｔレジスタ）の上部の要素は複製されると共にデータスタックに転送され戻される。そして、Ｓレジスタ及びＴレジスタは同じ値を有する。
（ＤＲＯＰ演算コード）
2010514058.tif 000079
ｐｏｐ操作はデータスタック上で実行され、データスタック（Ｔレジスタ）の上部から排除された要素は破棄される。
（ＯＶＥＲ演算コード）
2010514058.tif 000080
データスタック（Ｓレジスタ）の第２の要素は複製されると共にスタックに転送される。
（Ｂ  ＳＴＯＲＥ演算コード）
2010514058.tif 000081
９ビットＢレジスタは、データスタックから取り出される数と共にロードされる。
（Ａ  ＳＴＯＲＥ演算コード）
2010514058.tif 000082
１８ビットＡレジスタは、データスタックから取り出される数と共にロードされる。
（Ａ  ＦＥＴＣＨ演算コード）
2010514058.tif 000083
１８ビットＡレジスタの内容はデータスタックに転送される。Ａレジスタは変更されないままである。
（ＳＴＯＲＥ  Ｂ演算コード）
2010514058.tif 000084
要素はデータスタックから取り出されると共にＢレジスタにより特定される位置に書き込まれる。Ｂレジスタは変化しないままである。
（ＳＴＯＲＥ  Ａ演算コード）
2010514058.tif 000085
要素はデータスタックから取り出されると共にＡレジスタにより特定される位置に書き込まれる。Ａレジスタは変化しないままである。
（ＳＴＯＲＥ  Ｐ＋演算コード）
2010514058.tif 000086
要素はデータスタックから取り出されると共にプログラムカウンタにより特定される位置に書き込まれる。プログラムカウンタは、アドレスがレジスタ空間に存在しなかった場合インクリメントされる。
（ＳＴＯＲＥ  Ａ＋演算コード）
2010514058.tif 000087
要素はデータスタックから取り出されると共にＡレジスタにより特定される位置に書き込まれる。そしてＡレジスタは、アドレスがレジスタ空間に存在しなかった場合インクリメントされる。
（ＦＥＴＣＨ  Ｂ演算コード）
2010514058.tif 000088
Ｂレジスタにより特定された位置の内容は読み込まれデータスタックに転送される。Ｂレジスタは変更されないままである。
（ＦＥＴＣＨ  Ａ演算コード）
2010514058.tif 000089
Ａレジスタにより特定された位置の内容は読み込まれデータスタックに転送される。Ａレジスタは変更されないままである。
（ＦＥＴＣＨ  Ａ＋演算コード）
2010514058.tif 000090
Ａレジスタにより特定された位置の内容は読み込まれデータスタックに転送される。そしてＡレジスタはアドレスがレジスタ空間に存在しなかった場合インクリメントされる。
（ＡＮＤ演算コード）
2010514058.tif 000091
データスタック（Ｔレジスタ及びＳレジスタ）内の上位の２つの値はデータスタックから取り出され、論理的にＡＮＤ演算され、そして演算結果はスタックに転送され戻される。
（ＸＯＲ演算コード）
2010514058.tif 000092
データスタック（Ｔレジスタ及びＳレジスタ）内の上位の２つの値はデータスタックから取り出され、論理的にｘｏｒ演算され、そして演算結果はスタックに転送され戻される。
（ＮＯＴ演算コード）
2010514058.tif 000093
データスタック（Ｔレジスタ）の２つの値は補完される。
（ＲＳＨＩＦＴ演算コード）
2010514058.tif 000094
この命令はしばしば、ニーモニックの後“２スラッシュ”と呼ばれる。データスタック（Ｔレジスタ）の上位の値は１ビット右側にシフトした位置である。最も重要なビットは変化しないままである。
（ＬＳＨＩＦＴ演算コード）
2010514058.tif 000095
この命令はしばしば、ニーモニックの後“２スター”と呼ばれる。データスタック（Ｔレジスタ）の上位の値は１ビット左側にシフトした位置である。最も重要なビットは変化しないままである。
（ＮＯＰ演算コード）
2010514058.tif 000096
“無演算命令”の演算コードは時間を稼ぐため、或いは命令スロットを満たすため用いられる。
（ＰＬＵＳ演算コード）
2010514058.tif 000097
Ｓ及びＴの演算の合計はＴにロードされ、ＳはＳの下のデータスタックから取り出された隣の値と共にロードされる。この演算コードは加算と呼ばれる。
ある命令クロックは、データワードの約半分の長さを通過する内部のキャリーに十分な時間であるのみである。一定の状況下で、キャリーはよりよく実行するが、これらのケースはスタック上の２つの数の相対位置を含む。このスタックの上から相対位置がもたらされ、どのような命令が相対位置をスタック上に配するために用いられたかがわかる。いずれかの最適なケースを予想しようとすることは価値のあることではない。一般に、１つのビットを殆ど有さない数のみが任意の確実性と共に１つのクロックに加えられる。
Ｓ及びＴの値は、ＰＬＵＳ以外の命令の実行の間ＡＬＵに利用可能である。Ｓ及びＴが変化しない時はいつでも余分に時間を有し、その時間内にＡＬＵは合計の計算を完了する。ＰＬＵＳは最後にＴにラッチするためのＡＬＵ出力はどれかを選択するのに伴われる。Ｓ又はＴを変化しない命令（ＮＯＰ等）はＡｉｄｓ＋の列でｙｅｓの属性を用いて本書で示される。これらの命令のいずれか一つと共に先行するＰＬＵＳ（又はＰＬＵＳ  ＳＴＡＲ）は、入力の任意の組み合わせの正確な１８ビットの結果を保証する。
ＰＬＵＳ（又はＰＬＵＳ  ＳＴＡＲ）が命令プリフェッチにより拡大されたスロット３位置で実行すると、或いは“スロット４フェッチ”により先行されるスロット０位置で実行すると、明確な命令がＰＬＵＳ（又はＰＬＵＳ  ＳＴＡＲ）を先行するにも関わらず、正確な結果をもたらすのに十分な時間が過ぎる。
（ＰＬＵＳ  ＳＴＡＲ演算コード）
2010514058.tif 000098
ＰＬＵＳ  ＳＴＡＲは２つの数を乗算するために用いられると共に、一連の部分積を計算することにより作動する。部分積は生じると加算される。
ＰＬＵＳ  ＳＴＡＲ命令は、Ｔレジスタの最小の有効ビットは乗数を含み、Ｓレジスタの最大の有効ビットは被乗数を含むので、ビット領域は部分的に一致するものではない。Ｔ及びＳレジスタの部分は長さにおいて異なることができるが、Ｔ及びＳ内で利用されるビットの和は１８又はそれ以下でなければならない。
乗数（Ｔ）は符号なし数値として扱われる。Ｓは符号付き数値として扱われる。
2010514058.tif 000099
ＰＬＵＳ  ＳＴＡＲが実行すると、Ｔレジスタの最小の有効ビットがゼロの場合、Ｔレジスタは、符号なしで単に１ビット位置右に移動するのみである。他に何も実行されない。
しかし、Ｔレジスタの最小の有効ビットが１の場合、ＳレジスタはＴレジスタに加えられ、２つの１８ビットの符号付き数値の１９ビットの和を（潜在的に）もたらす。この和は１ビット位置右に移動すると共に、Ｔにロードされる。Ｓはこの命令によって変化しないままである。
ＰＬＵＳ  ＳＴＡＲを繰り返し利用することにより２つのレジスタを乗算する。乗算器内の各ビット位置のＰＬＵＳ  ＳＴＡＲが実行されなければならない。例えば、乗算器が９ビットを有する場合、乗算を完了させるには９つのＰＬＵＳ  ＳＴＡＲ命令を実行しなければならない。これがなされると、結果はＴの中で、右揃えになる。乗数ビットの全ては変化している。Ｓは変化しない。
リップルキャリーの同一の規則及びＰＬＵＳに加える遅延の潜在的な必要性はまたＰＬＵＳ  ＳＴＡＲに加えられる。Ｔの低ビットがゼロの場合、設定時間の遅延は必要とされない。同様にＳの被乗数が９ビット又はそれ以下（左揃え）の場合、リップルキャリーを遅延させる必要はない。
＜第７章：ピン配列及びパッケージ＞
ＳＲＡｆｏｒｔｈ−２４Ａは１００ピンのＱＦＰパッケージに詰め込まれている。シグナル及び機能は表３７に載せている。パッケージの大きさ、ピン配列及び他の機械仕様の完全な詳細については、工場へ問い合わせのこと。
（表３７：シグナルリスト（アルファベット順））
2010514058.tif 000100
2010514058.tif 000101
＜第８章：電気的特性＞
（表３８：絶対最大定格）
2010514058.tif 000102
（表３９：電圧及び温度操作状況）
2010514058.tif 000103
（表４０：デバイス特性）
2010514058.tif 000104
注１：プルアップ又はプルダウンを有するピンを除く
＜付録１：ＳＥＡｆｏｒｔｈ−２４Ａ  ブートプロセス＞
（システムブート）
リセットすると、各Ｃ１８プロセッサはアドレスＡＡｈにおいてＲＯＭコードの実行を開始する。全ての処理ノードがブートで同じことをしない。
ＳＥＡｆｏｒｔｈ−２４ＡがノードＮ５上のＳＰＩインターフェースからブート可能である。ＳＥＡｆｏｒｔｈ−２４Ａはまた、ノードＮ０、或いは４つのＲＯＭ駆動シリアルブートプロセッサノードＮ３、Ｎ１２、Ｎ１７及びＮ２１のいずれかの上にある外部ＲＡＭインターフェースからブート可能である。典型的なシステムはＮ５プロセッサインターフェースからＳＰＩベースブートデバイスにブートする。ブートデバイスは一般的に、ＥＥＰＲＯＭ又はフラッシュストレージデバイスのいずれかである。
Ｎ５上のＲＯＭブートコードはＳＰＩデバイスを初期化させると共に、２５０Ｋｂｐｓの速度でＳＰＩアドレス０からの読み込みを開始するための命令をＳＰＩデバイスに送信する。ＳＰＩブートローダは、コードの６４の１８ビットワードを内部ＲＡＭにロードする。これは、ＳＰＩインターフェースから１４４バイトを読み込むことによりなされる。ＳＰＩにおいて、最大の有効ビットは最初に読み込まれる。６４ワードをロードした後、コードはアドレス０でそのコードにジャンプする。
コードの最初の６４ワードが読み込まれた後にデバイスが何をするかは、ロードされたコードにより決定される。通常、コードはＳＰＩから６４ワードのブロックを読み込み続けるか、或いは他のコアへブートコードを分配し始める。他のコアの全ては、読み込み操作の待機中“スリープ”状態であり、これらのコアは必要な場合又は必要に応じ初期化されることが可能である。各コアのＲＡＭに読み込まれたコードは追加のＳＰＩ特性或いはこれらのピンのその他の使用に役立つ。
Ｎ５はＳＰＩピンからブートされることができない。ＳＰＩのデータイン（Ｄａｔａ−Ｉｎ）が復帰時間で最高値になる場合、ＳＰＩプロセッサはＳＰＩからブートしないと共に、ネイバからの書き込みを待機してスリープ状態になる。そのビットが最低値の場合、チップセレクトピンを変化させると共にＳＰＩクロックピンのトグリングを開始し、ＳＰＩデバイスへ“アドレス０から読み込む”という命令を送信する。
Ｎ３、Ｎ１２、Ｎ１７及びＮ２１は、非同期性シリアルブートをサポートするＲＯＭコードを有する。これらのプロセッサはＩＯＣＳレジスタのビット１７上で読み込むピンを有している。ＩＯＣＳレジスタはシリアル入力及び／又はスリープ状態からウェークするために用いられる。ＲＡＭベースのソフトウェアは、他の使用のためにピン入力特性にピン又はスリープ状態からのウェークを利用することができる。
シリアルからブートするよう命令された場合、コアはスリープ状態になると共に入力ピン上で論理ハイを待つ。論理ハイは、シリアルスタートビットとして説明されるものである。そして、これらのプロセッサは読み込まれた最初のバイトのヘッダにあるタイミングビットを、通信速度を決定するよう調節することを試みる。通信速度が遅すぎると、タイミングビットを調節する試みは失敗し、ＲＯＭコードはプロセッサをスリープ状態にして、ネイバの書き込みを待機するようにする。１２００ボー以下の通信速度はシリアル入力に役立たない。非同期性のシリアル入力の上限は２０ＭＨｚまででなければならず、或いは２つのストップビットが用いられる場合それ以上でなければならない。
スタートビットを発見した後、ＲＯＭコードは６ビットヘッダ内の２倍幅のタイミングビットを調節すると共に、最初の８ビットバイト内の２つの実データビットを読み込む。そして、さらに２つの８ビットバイトが読み込まれると共に、１８ビット数を読み込まれた最後の１８データビットから累算する。基本の非同期性シリアルにおいて、より小さい有効ビットは最初に読み込まれる。６４の１８ビットＣ１８の命令の夫々は、１つのスタートビット及び１又は２つのストップビットを有する３つの８ビットバイトとして読み込まれる。読み込まれた各３つのバイトワードの最初にある２倍幅のタイミングビットは調節されるので、隣のワードのスタートビットが調節される前に読み込まれるビットはほとんどない。速度はその時間で十分にドリフトするため、非常に高いビットレートにあっても絶好のタイミングを逃したり、間違ったビットを読み込むことがほとんどない。
６４の１８ビットワードを読み込みそれらをＲＡＭに格納した後、シリアルプロセッサはアドレス０でそのコードにジャンプする。ＳＰＩブートと同様、これらのプロセッサは可変サイズのシリアル又はロードパケットから６４ワードのパケットをロードし続けることができる。シリアル出力ドライバはロードされ、シリアルプロセッサの第２のピン上のシリアル出力を可能にする。
ＲＡＭサーバのＮ０もまた、追加的にチップをブート可能である。Ｎ０はリセットされると、ＲＯＭはピンのＭｅｍｏｒｙ＿Ｐｒｅｓｅｎｔを読み込み、外部メモリインターフェースからチップをブートすべきか調べる。Ｍｅｍｏｒｙ＿Ｐｒｅｓｅｎｔがリセット時に最高値である場合、Ｍｅｍｏｒｙ＿Ｐｒｅｓｅｎｔは外部メモリインターフェースからブートする。不揮発性ＲＡＭ、フラッシュ、又はエミュレートされた装置が外部メモリインターフェースに接続されると、チップをブートするのに用いることができる。
Ｎ０がリセットされＭｅｍｏｒｙ＿Ｐｒｅｓｅｎｔピンが小さい場合、＿Ｗｒｉｔｅ＿Ｅｎａｂｌｅ＿ａｎｄ＿Ｓｅｌｅｃｔピンを持ち上げて外部メモリを静かな状態に配する。その時Ｍｅｍｏｒｙ＿Ｐｒｅｓｅｎｔが大きい場合、Ｍｅｍｏｒｙ＿Ｐｒｅｓｅｎｔは０のアドレスを出力すると共に、外部メモリからブートするために読み込まれ利用されるワードの数の計算の読み込みを行う。これをするため、最初はアドレス０を出力し、そして制御シグナルを出力し、読み込み、遅延、データバスの読み込み、及び制御シグナルの出力を行う。外部メモリ内の位置でのコード及び計算はブートフォースレット（Ｆｏｒｔｈｌｅｔ）と呼ばれる。
ブートするための１８ビットワードの数の計算を読み込んだ後、ＲＯＭコードは、増加する外部アドレスから１８ビットの数の多数のプラス１の読み込みを実行する。１８ビットの数はローカルメモリ内にアドレス０で格納されると共に、アドレス０にジャンプしてブートする。ＲＯＭコードは異なる外部メモリ装置を１８ビットの数を外部データバス上で読み書きするルーチンを有することによってサポートし、ＲＡＭを介してベクタするように設計される。
＜付録２：内部データ表現及びレベル＞
どのような種類の物理的条件がブール値の真偽を表現するのに用いられるかは、ブール論理の原則に無関係である。便宜上、真偽はしばしば０及び１で記述されるが、これもただの慣例である。長年にわたり、様々なコンピュータシステムは真偽を表現するため様々な電圧値を選択してきて、特に多数のシステムは機会の様々な部分において様々なレベルを用いる。メモリチップはこの習慣を０と１の内部電気表現を変化することにより続ける。もう一方の半分のちょうど反対側にある状態により表現されたビットの半分を見つけることは普通のことである。
プロセッサのＳＥＡｆｏｒｔｈファミリは、少ないゲート数及び低電力を備えるパフォーマンスを最適化するよう設計されている。設計者は様々な内部電気的レベルを用い０及び１を表現することを選択する。ほとんど全ての場合において、これはプログラマの目には効果的に視認不可であるが、内部で何が行われているかを理解することは設計、及び電力及び能力に非常に大きな見識をもたらすという場合がいくつかある。
プロセッサ間の通信レジスタのアドレスビットの操作においての一例を示す。“共通”の用語について言うと、各レジスタは標準的な８−４−２−１配列における単一のビットにより選択される。しかしながら、内部アドレスバスは奇数ビットを、偶数のビットから“反転”した方法で表示する。したがって、Ｖｓｓの側の電圧が０を表示し、Ｖｄｄの側の電圧は１を表示する場合、論理的に０  ００００  ００００であるアドレス値は１  ０１０１  ０１０１となる。
【産業上の利用可能性】
【００２７】
基本コンピュータ回路内の発明の代替ビット反転２進数表現は、非常に様々な応用に広く用いられることが意図されている。スピード、小型の回路領域及びより少ない消費電力が重要であると考えられる組み合わせ回路の応用において、特に有益であることが期待される。
【００２８】
本明細書で前に論じたとおり、本発明の利用可能性は極めて一般的であることが期待されている。これは、一般的であることが基礎レベルでコンピュータ回路にふさわしいためである。本発明は容易にもたらされると共に既存のコンピュータ回路技術等に一体化するため、及び、本明細書に記載の利点がもたらされるため、本発明は容易に産業に受け入れられることが期待される。これら及び他の理由から、本発明の有用性及び産業上の利用可能性の両方は、範囲において有効であると共に耐久性を有するものである。
【図１】
2010514058.tif 000105
【図２】
2010514058.tif 000106
【図３】
2010514058.tif 000107
【図４】
2010514058.tif 000108
【図５】
2010514058.tif 000109
【図６】
2010514058.tif 000110
【図７】
2010514058.tif 000111
【図８】
2010514058.tif 000112
【国際調査報告】
2010514058.tif 000113