JP5379376B2 - プロセッサの例におけるトランザクションレベルモデルとrtlとの間の等価性検証 - Google Patents
プロセッサの例におけるトランザクションレベルモデルとrtlとの間の等価性検証 Download PDFInfo
- Publication number
- JP5379376B2 JP5379376B2 JP2007315517A JP2007315517A JP5379376B2 JP 5379376 B2 JP5379376 B2 JP 5379376B2 JP 2007315517 A JP2007315517 A JP 2007315517A JP 2007315517 A JP2007315517 A JP 2007315517A JP 5379376 B2 JP5379376 B2 JP 5379376B2
- Authority
- JP
- Japan
- Prior art keywords
- implementation
- description
- processor
- instruction
- architecture
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Description
ディジタルハードウェアの検証は、集積回路の生産の1ステップである。ディジタルハードウェアの検証がディジタルハードウェア内のバグをすべて取り除くのに失敗する場合、ディジタルハードウェア用の生産プロセスは、その高い固定費で再開される必要があり得る。また、そのディジタルハードウェアを組み込んでいる製品の市場への導入が、遅延を被るであろう。
● 刺激されなかったバグ:回路デザインに適用される刺激が、刺激されなかったバグを動作させて、回路チェッカーの入力部に至らせるのに失敗するので、これら機能的なバグは見つからない。
● 見落とされたバグ:これら機能的なバグは、チェッカーの入力に対して刺激され繁殖される。しかし、チェッカーが、見落とされたバグを識別するように設計されていない。
● 誤って容認されたバグ:これら機能的なバグは、回路デザインの仕様に対する、実装者および検証エンジニアによる一致した誤解から生じる。
機能検証のための主な方法はシミュレーションである。シミュレーションベースの検証方法は、発見されないバグに関する3つの種類すべての傾向を有する。シミュレータ速度とテスト下にある回路のリアルタイム実行との間に106倍以上の係数の違いがあるため、シミュレーションは、機能的なバグのすべてを刺激するのに失敗する。従って、シミュレーションが、プロジェクトの利用可能な時間内で、回路デザインを徹底的に検証するために必要な刺激のすべてを展開することができるとは限らない。シミュレーション・カバレッジ・メトリクスは、この状況を救済しない。シミュレーション・カバレッジ・メトリクスは、回路設計全域のうち、制限された検証キャパシティの割り当てにおいてのみ助けとなり得る。
フォーマル検証は、シミュレーションベースの検証の代わりとされている。フォーマル機能検証では、RTL記述の適切な動作を保証するために、いわゆるプロパティが回路デザインに対して証明される。フォーマル検証は、数学的な証明の方法を使用する。したがって、フォーマル検証は、あたかも回路があらゆる入力刺激で刺激されたかのように動作する[BCDM86]。したがって、上記した分類の用語において、フォーマル検証は、検証が終わった後のデザインにおいて、刺激されなかったバグの存在を回避する。
フォーマル機能検証に加えて、フォーマル等価性検証[BW99]がある。フォーマル等価性検証のゴールは、RTL記述が設計され検証された後のデザインの、プロセスステップを検証することである。これらデザインプロセスステップの検証は、デザインプロセスステップ前後の回路記述の比較を必要とする。例えば、合成ステップを検証するために、RTL記述は、合成されたネットリストと形式的に比較される。その簡単なユーザインタフェースにより、今日の等価性の確認は、同じデザインの2つの記述を比較するために最も広く用いられているアプローチである。
一般的なタスク
通常、プロセッサは、プロセッサによって実行されるアセンブラコードを記述するプログラマが、プロセッサのハードウェア説明書を詳細に理解する必要のないように開発されている。それよりも、プロセッサが次の命令の実行を開始する前に、あたかも1つの命令が完全に実行されたかのように、プログラマがプロセッサをみなせることで十分である。プロセッサのこのモデルは、アーキテクチャ、或いはプロセッサのアーキテクチャ記述と呼ばれ、以下でより詳細に記述されるであろう。
最先端技術による産業上のプロセッサ検証は、[BB06]に記述されている。シミュレーションベースの検証についての一般的なアイデアは、インプリメンテーション記述およびアーキテクチャ記述の両方に同じプログラムを実行させ、次に、インプリメンテーション記述およびアーキテクチャ記述の両方において、プロセッサとデータメモリとの間の通信トラフィックを比較することである。このアプローチは、各々のインタフェースにおいて観測され得るものに基づいたインプリメンテーションおよびアーキテクチャの検査により、プロセッサ検証を実行する。バグは、インプリメンテーションおよびアーキテクチャのメモリへのトラフィックが互いに逸脱する場合に発見される。
本発明は、より少ないユーザ入力で高レベルの品質を導く、プロセッサ用のフォーマル検証を記述する。プロパティの開発に代えて、設計者は、アーキテクチャ記述と、データバスおよび命令バス上の通信のためのプロトコル情報と、デザインプロセス中で利用可能な情報を捕らえる、いわゆる対応情報とを提供することだけをしなければならない。要求されたユーザ入力の明確な構造は、例えばアーキテクチャ記述の形式化を単一の作業ステップで可能にし、このことは、誤ってバグを受理する危険性を大幅に低減する。
最先端技術に記述されるように、プロセッサが完全に設計された後、得られる検証プロセスが適用され得る。こうした事後の検証に加えて、本発明は、デザインプロセスに平行した検証プロセスも可能にする。それは、フォーマルな証明を使用するステップ・バイ・ステップ方式のプロセッサ開発が、あらゆるステップを検証することを可能にする。
● シミュレータ
● デバッガ
● アセンブラ
● 逆アセンブラ
● リンカ
● コンパイラ
である。
本発明の方法は、プロパティの生成を必要とする。これら生成されたプロパティもまた、シミュレーションベースのアプローチにおいて確認され得る。シミュレーションベースのアプローチは、アサーションベースの検証において標準的な手続である。このことは、アーキテクチャ記述およびインプリメンテーション記述をシミュレートし、次に、アーキテクチャ記述およびインプリメンテーション記述の両方のメモリトラフィックを比較するアプローチに対して、いくつかの利点を有する。
● インプリメンテーションの割り込みからアーキテクチャの割り込みへの明確で単純なマッピング
● プロセッサが実行する命令シーケンスの識別
● バグが命令又は割り込みの実行を妨げる場合、シミュレータがインプリメンテーション記述を実行し、命令の実行又はインプリメンテーションを記述するプロパティを評価すると、バグが見つかるであろう。これは、最先端技術に係るアプローチよりも早く、したがって、容易なデバッギングを可能にする。最先端技術のアプローチでは、バグの影響は、バグが観測可能になる前に、プロセッサ状態で長い間格納され得る。このことは、バグの追跡の困難さを保証する結果となる。
● 発見されないバグの分類の点において、検証がバグを見落とさない傾向を有することが証明され得る。
時相論理ITL
本発明は、以下に示される時相論理ITLで記述されるであろう。しかしながら、本発明はこの時相論理に制限されない。本発明の手続もまた、例えばLTL、PSL或いはSVAといった、他のすべての線形時相論理を使用して適用され得る。
at <time point>: <Boolean condition>;
during [<time point1>, <time point2>]: <Boolean condition>;
within [<time point1>, <time point2>]: <Boolean condition>;
第1のフォームは明示された時点において、第2のフォームは区間内のすべての時点について、そして、第3のフォームは区間内の少なくとも1つの時点について、ブール条件の妥当性を要求する。区間が空の場合、第2のフォームは自明のこととして満たされ、第3のフォームは自明のこととして満たされない。
T2 = B2 + n2 .. m2,
....;
これら表現において、Biは、t、或いは、上記したリスト中で宣言された、j<iの別の時間変数Tjのいずれかである。時間変数に許される値の割り当ては、上記の与えられた条件を満たさなければならない。即ち、Bi+ni<=Ti<=Bi+miが真でなければならない。miは無限大であることができ、その場合、それぞれの宣言は、
Ti >= Bi + ni
或いは、
Ti> Bi + ni
に置き換えられる。
at Ti: signal = value;
論理行は、次のように条件を形成する。最も単純な場合では、条件は論理行を表す。2つの条件の連続は、それらの論理積に対応する。
for each j in m .. n:
Condition(j)
end for each;
は
Condition(m);
Condition(m+1);
...
Condition(n);
のように扱われなければならない。n<mの場合、上記表現は自明のこととして、条件真に適合しなければならない。
for each j in m .. n:
Expression(j)
end for each;
は
Expression(m) and
Expression(m+1) and
... and
Expression(n);
のように扱われなければならない。条件次第で部分的な表現はマクロに要約されることができ、必要であれば、マクロはパラメータを持つことができる。
for timevars: <time variable declaration>;
assume:
<condition 1>;
prove:
<condition 2>;
end property;
<condition 1>は仮定部分と呼ばれ、<condition 2>はプロパティの証明部分と呼ばれる。仮定部分のそれぞれは仮定と呼ばれるであろう。tのすべての値と、<time variable declaration>において明示される時間変数のすべての値とについて仮定部分が満たされ、且つ、証明部分も満たされる場合、プロパティは満たされる。反対の例は、インプリメンテーション記述の動作と、時点tと、<time variable declaration>において明示された、仮定部分を満たすが証明部分を満たさない時間変数についての値のセットとを示す。
termプロパティは、回路動作の様相間の動作関係について記述する時相論理表現に使用されるであろう。そのようなプロパティは、フォーマル検証ツールによりチェックまたは検証され得る。一方においては、回路に対する入力刺激のすべてについて回路の動作関係が適合する場合、フォーマル検証ツールは、その対応するプロパティが適合していると指摘する。このようにプロパティがフォーマル検証ツールによって証明され、プロパティの証明が検証の結果である。一方、回路の動作関係に矛盾する回路動作の入力刺激が少なくとも1つ存在する場合、フォーマル検証ツールは、対応するプロパティが失敗していると指摘する。プロパティもまた、シミュレーションにより検査または検証され得る。その場合、シミュレーションが、すべての入力刺激を検査するほど十分に強くないので、プロパティの適合を実証することができない。しかしながら、シミュレーションは、プロパティの失敗を示すのに十分である。デザイン記述に対するプロパティをシミュレータによって検査するために、デザイン記述は、シミュレータを用いてシミュレートされ、シミュレータは、シミュレータを用いて生成された値のシーケンスについてのプロパティを評価する。評価が、プロパティの失敗を示す場合、エラーメッセージがシミュレータによって発行される。
アーキテクチャ記述
プロセッサのアーキテクチャ記述は、例えばプログラマーズ・マニュアルによって提供される視点を示す。アーキテクチャ記述は、プロセッサが次の命令を開始する前に、プロセッサがすべての命令を完全に実行するという、プロセッサの視点を取る。したがって、アーキテクチャ記述は、クロックサイクル毎に1つの命令を実行する同期式オートマトンと考えられ得る。命令に加えて、アーキテクチャは割り込みも実行する。割り込みは、アーキテクチャ割り込み信号によって、アーキテクチャ記述に合図される。プロセッサが割り込みを受理する場合、プロセッサは、命令の代わりに割り込みを実行する。1つの割り込み又は1つの命令の実行は、「アーキテクチャサイクル」と称されるであろう。
● 実行される命令のアドレスを提供するプログラムカウンタ。
● 命令が動作する1つ又は複数のレジスタファイル。これらレジスタファイルはレジスタの配列であり、単一のレジスタに縮退してもよい。レジスタファイルは、例えば、プロセッサが処理するデータを格納する。別の例は、最後の命令実行に関する情報を提供するブール変数を用いたプログラム・ステータス・ワードである(例えば、オーバフローを生成する最後の命令実行を強調するブール変数、或いは、最後の命令の結果がゼロであることを示すブール変数)。レジスタファイルは、例えば、割り込み優先順位および割り込みマスク(いくつかの割り込みをオフにする)等の、割り込みの受理を決定するために必要とされる情報、或いは、割り込みを実行するために必要とされる情報を格納することもできる。
プロセッサは、一般的に、アーキテクチャ記述で記述されたオートマトンによって実行されない。代わりに、命令実行がパイプラインされる。従って、RTLインプリメンテーションは、複数の命令を同時に扱うことができ、それぞれの命令は、それら異なる実行フェーズ中にある。プロセッサの共通クラスは、1つのパイプラインから構成され、これは、本発明が例示されるであろうクラスである。図8に、単一のパイプラインから構成されるそのようなプロセッサを示す。本発明がそのようなパイプラインに制限されないことに注意されなければならない。
本発明は、アーキテクチャ記述とインプリメンテーション記述との間の等価性を検証する。等価性の正確な概念はここに示されるであろう。
等価性を検証するために、アプローチは、全体のパイプラインによって単一の命令がどのように実行されるのか、或いは、全体のパイプラインによって割り込みがどのように実行されるのかを完全に記述するプロパティを生成する。以下、これら生成されたプロパティ(リセットに関するプロパティを含む)は「メインプロパティ」と称されるであろう。実行が、異なる場合(例えば、条件が満たされる或いは満たされない条件付きジャンプ)を使用して最も良く記述される場合、1つの与えられた命令又は割り込みについて、いくつかのメインプロパティが存在する場合がある。
● プロセッサが命令実行を開始可能な状態にあると仮定する。
● 命令メモリへのアクセスの生成を証明する。
● フェッチされた命令およびプロセッサの状態が、プロパティが役立つ状況についての条件を満たすと仮定する。
● プログラムカウンタが正確に更新されることを証明する。
● プロセッサが次の命令を実行することができる状態に戻ることを証明する。
● アーキテクチャ記述に従って結果が計算されることと、フォワーディングをコントロールする信号が正確にセットされることとを証明する。
● プログラム・ステータス・ワードが正確に修正されることを証明する。
● 結果が適切なレジスタファイル(或いはレジスタ)へ正確に書き戻されることを証明する。
● インプリメンテーションが、データバスの転送方向と、そのアドレスと、書き込みデータ(書き込み転送の場合)とを正確に決定することを証明する。
本発明におけるさらなる要素は、「仮想レジスタ」或いは「仮想レジスタファイル」である。この概念は、プログラム・ステータス・ワード、レジスタファイル、或いは、割り込みコンフィグレーションレジスタまでをも含むような、アーキテクチャレジスタに関係するすべての発行を検証する役目をする。
事前に設計されたインプリメンテーションのフォーマル検証については、図1に示す方法が一度実行され、そして、プロパティチェッカによって検証ステップ207が実行されるであろう。インプリメンテーションの設計と平行したフォーマル検証について、図1に示すプロセスが、同じ対応情報と、アーキテクチャ記述に記述された、ますます多くの命令とを繰り返し実行するであろう。そのアーキテクチャ記述エントリーに記述される命令の数は、インプリメンテーションの開発状態を反映する。このアプローチを用いて、プロセッサの開発は、フォワーディングおよびストールの生成のような中心メカニズムから始まり、そして、割り込みのサポートおよび命令を用いて、開発を段階的に拡張することができる。この例の利点は、プロセッサ設計のあらゆるステップがかように検証され、プロセッサ設計におけるエラーが、プロセッサの設計サイクルの初期に修正され得ることである。
アーキテクチャ記述は、入力in、出力out、状態AS(複数のアーキテクチャレジスタおよびプログラムカウンタから構成される)、次の状態関数NSTATE、および出力関数OUTを用いて、オートマトンを表現する。
IMEM_ADDRESS:命令メモリへ命令アドレスを提供する出力。この命令アドレスの下では、1つの命令を見つけることができると仮定されている。
IW:同じメモリトランザクション内に示された命令アドレスIMEM_ADDRESSへ、命令メモリからの命令「word read」を提供する入力。
DMEM_ADDRESS:データメモリへデータアドレスを提供する出力。
DMEM_ACCESS_VALID:データメモリへのアクセスを有効にするビット出力。
DMEM_RW:データメモリへの読み込み(「0」)アクセスと書き込み(「1」)アクセスとを区別するビット出力。
DMEM_WDATA:当該サイクルにおいてデータメモリに書き込まれるデータを提供する出力。
DMEM_RDATA:DMEM_RWが「0」である場合に、同じメモリトランザクション内のアクセスへ、データメモリから返されたデータを提供する入力。
DMEM_IDLE := DMEM_ACCESS_VALID = ‘0’;
DMEM_READ(addr) := DMEM_ACCESS_VALID = ‘1’ and
DMEM_ACCESS_RW = ‘0’ and
DMEM_ADDRESS = addr;
DMEM_WRITE(addr, wdata) := DMEM_ACCESS_VALID = ‘1’ and
DMEM_ACCESS_RW = ‘1’ and
DMEM_ADDRESS = addr and
DMEM_WDATA = wdata;
割り込みインタフェース
IRPT:例えば割り込みの到着に関する信号のように、割り込みに関係する入力信号のセット。
オートマトンの状態は、アーキテクチャレジスタファイル(単一のアーキテクチャレジスタに縮退可能なアーキテクチャレジスタの配列である)と、アーキテクチャプログラムカウンタPCとによって与えられる。アーキテクチャレジスタファイルの要素はR[k]と呼ばれるであろう。
オートマトンのトランザクションはアーキテクチャ記述エントリーのリストによって与えられる。初期化については、1つのアーキテクチャ記述エントリーが、割り込み実行については、1つのアーキテクチャ記述エントリーが、そして、命令実行を記述するための多くのアーキテクチャ記述エントリーが存在する。
ACTinit=
PC = initPCand
R1[k1] = initR1,k1 and
R2[k2] = initR2,k2 and
…
初期化についてのアーキテクチャ記述エントリーは、アーキテクチャプログラムカウンタPC@1についての初期値から構成されるアーキテクチャ状態、即ちAS@1についての初期値と、すべてのアーキテクチャレジスタR[k]@1についてのすべての初期値とを提供する。
for each k in the index_range of R
if k = INDEX0,R
then next(R[k]) = UPDATE0,R
else next(R[k]) = R[k]
end for each
ここで、INDEX0,RおよびUPDATE0,Rは、アーキテクチャレジスタ、PC、DMEM_RDATA、およびアーキテクチャ割り込み入力IRPTに依存し得る。或いは、レジスタファイルエントリーは、レジスタファイルがその値を保存することを定義する。
foreach k in the index_range of R
next(R[k]) = R[k]
end foreach
PCについての更新エントリーは次のフォームである。
next(PC) = UPDATE0,PC
ここで、UPDATE0,PCは、アーキテクチャレジスタ、DMEM_RDATA、およびアーキテクチャ割り込み入力IRPTに依存し得る。
DMEM_IDLE
もしくは
DMEM_READ(ADDR0)
のフォーム、或いは、アーキテクチャレジスタ、PC、およびアーキテクチャ割り込み入力IRPTに依存し得るデータメモリアドレスADDR0および書き込みデータWDATA0を用いた
DMEM_WRITE(ADDR0, WDATA0)
の何れかのフォームである。
not TRIGGER0and
TRIGGER_IWmand
TRIGGER_STATEm
TRIGGER_IWmは、アーキテクチャ命令語IWにのみ依存し得る。TRIGGER_STATEmは、アーキテクチャレジスタ、PC、DMEM_RDATA、およびIWにのみ依存し得る。
リセットがどのように非アクティブに保持されるのかを記述するブーリアンマクロno_resetが提供されなければならない。このブーリアンマクロは、リセット動作に関する証明を除いたすべての証明中に存在するであろう。
実装されたパイプラインは、2つのメモリポート、即ち、命令を読み込むための1つのポートと、データを読み込む又は書き込むためのもう1つのポートとを持つと予想される。双方のポートにおけるプロトコルは、パイプライン動作に関連して記述される。方向と、アドレスと、そして適用可能であれば、ステージがストールしない場合の書き込みデータとを生成するマクロと共に、パイプラインステージの番号が、それぞれのポートについて提供されなければならない。そのうえ、おそらく別のステージが、読み込みアクセスの場合に読み込みデータを生成するマクロと共に提供されなければならない。単純なプロトコルについては、要求されたマクロが、プロセッサ入力と、命令バス又はデータバスを形成するプロセッサ出力とに依存して定義され得る。より複雑なプロトコルは、パイプラインとバスポートとの間に、バスインタフェースモジュールを必要とする。この場合、パイプラインとバスインタフェースモジュールとの間のインタフェースは、アクセスプロトコル記述を用いて特徴付けられるであろう。要望に応じて、アドレス及びデータが正確に転送されることを示すために、バスインタフェースモジュールの検証が実行され得る。
● 定数iaは、>=1であり、命令アドレスが命令バスに送られるところのステージの番号を表示する。
● 定数ivは、>=iaとなるように選択される。定数ivは、命令が命令バスから返されるところのステージの番号を表示する。多くの場合、定数ivはia+1に等しい。非同期式メモリの状況下では、定数ivは定数iaの値を取り得る。
● 定数daは、データメモリアクセスが開始されるところのステージの番号を記述し、そのところにおいて、アドレスと、そして適用可能であれば、書き込みデータとが提供される。メモリアクセスを取り消すことができないので、ステージdaは、割り込み又はジャンプ命令の何れによっても取り消され得ないことが必要である。
● 定数dvは、読み込みデータがデータメモリから返されるところのステージの番号を記述する。非同期式メモリについては、定数dvは定数daに等しくなることが可能であり、そうでなければ、定数dvは、>=daの値を取るであろう。
プロセッサは環境によって停止され得る。プロセッサを停止させる理由は、命令メモリ又はデータメモリの待ち状態であり得る。プロセッサを停止させるために、プロセッサは、環境から1つ或いは複数の停止信号を受信する。これら停止信号がプロセッサを停止させる必要性を生じる条件は、設計者によるマクロexternal_stallの定義によって、検証に入力されなければならない。
次に、図1のステップ204において設計者が提供しなければならない対応情報を記述する。この対応情報はインプリメンテーションの決定を捕らえ、デザインプロセスから容易に利用可能である。そのうえ、対応情報が検証によって確認されるという意味で、この対応情報はフェイルセーフである。本発明のフォーマル検証に基づく例について、このことは、不適切な対応情報が、検証を誤って失敗とすることはできるが、誤って成功とすることができないことを意味する。
対応情報は、以下で詳細に説明する次の部分を含む:
・パイプラインステージの分類
・ストール条件および取り消し条件、すべてのパイプラインステージの指示
・開始状態
・プログラムカウンタ
・仮想レジスタファイル
対応情報は、個々の命令がパイプラインを通じて移動する方法(パイプラインステージの分類、ストール条件/取り消し条件/Full条件、開始状態)と、パイプラインにおいてレジスタがどのように更新されるのか(プログラムカウンタ、仮想レジスタファイル)とを捕らえている。対応情報は、アーキテクチャ記述とインプリメンテーション記述との間の等価性を確立するのに非常に重要である。
対応情報は、アーキテクチャ記述における命令の実行をマッピングすることを可能とし、そこでは、命令は単一のサイクルで実行される。インプリメンテーション記述においては、命令は多数のサイクルを取得する。パイプラインステージの数によりサイクル数が与えられ、命令は、ストール条件に示されるパイプラインステージあたりのサイクル数、待機しなくてはならない。ハイレベルなコンセプトのストール動作、すなわちパイプラインステージ内での待機動作は、インプリメンテーション記述における具体的な信号と、このようにリンクされる。
そのうえ、仮想レジスタファイルが、アーキテクチャ記述において更新された単純なレジスタを、インプリメンテーション記述のパイプラインにおける、データの複雑な信号レベルでの取り扱いにマッピングすることを可能とする。
パイプラインのステージが1〜nで番号付けされているとしよう。パイプラインステージの役割は、次のように記述されるであろう。
● decは命令実行が実際に開始するステージである。多くの場合、このステージはフォワーディングパスがターゲットとする場所である。命令バスにおけるタイミングに依存するが、多くの場合、ステージdecはステージivもしくはステージiv+1である。如何なる場合も、ステージdecの番号は>=ivとなるであろう。
● jmpm:すべてのアーキテクチャ記述エントリーmについて、プログラムカウンタが次の命令の値にセットされるステージが明示される。単純な命令(算術命令のような)については、これは1であり、ジャンプ及び割り込みについては、それは/=1であろう。
● int=jmp0:これは、割り込みが受理されるか否かを決定するステージを記述する。すべてのmについて<=intとなる値jmpmを有する。データバスへのアクセスを取り消すことができないので、ステージdaの番号>=intである必要がある。
● vstagem,i:m>=1について、これは、アーキテクチャ仕様エントリーmのi番目のレジスタファイルアクセスがなされるステージに関する検証への情報、即ち、VINDEXm,iに関するレジスタファイルアクセスを提供する。多くの場合、フォワーディングパスはすべて、プロセッサのデコードステージをターゲットとする。この場合、すべてのmおよびiについて、ステージvstagem,i=decである。しかしながら、より手の込んだプロセッサは、ステージdecより後のステージへのフォワーディングを可能にする。この場合、vstagem,iは>decの値にセットされ得る。TRIGGER0において読み込まれるすべてのレジスタ値について、vstage0,i=intであり、割り込み実行を記述するアクティビティブロックであるACT0において参照されるすべてのレジスタについて、vstage0,i>=intであることが必要である。
● writebackR:上記した仮想レジスタファイルの点について、すべてのアーキテクチャレジスタファイルRについて、書き戻しステージが提供されなければならない。本発明のこの例は、すべてのレジスタファイルRについて、int<=writebackRを要求する。
[1,n]内のすべてのステージsについて、このステージsがストールする条件が、マクロstallsで提供されなければならない。このマクロstallは、すべてのインプリメンテーション信号に依存し得る。
[1,n]内のすべてのステージsについて、ステージsが取り消される条件が、マクロcancelsで提供されなければならない。このマクロcancelは、すべてのインプリメンテーション信号に依存し得る。
[2,n]内のすべてのステージsについて、マクロfullsが提供されなければならない。それは、ステージsが現在、命令又は割り込みを実行する場合、値1を取り、そうでなければ値0を取る。マクロfullは、すべてのインプリメンテーション信号に依存し得る。
プロセッサインプリメンテーションが新しい命令を開始する際の状態を記述するブーリアンマクロprocess_new_instruction_stateが提供される。
インプリメンテーション状態をインプリメンテーションプログラムカウンタpcの値へマッピングするマクロpcが提供されなければならない。このマクロpcは、一般的に、インプリメンテーションプログラムカウンタを格納するいくつかのインプリメンテーション信号に等しいと定義されるであろう。
アーキテクチャレジスタファイルRのすべてについて次の情報が提供される。
● インプリメンテーションレジスタファイルcurrentR(k)。ここで、kはアーキテクチャレジスタファイルへのインデックスである。
● ステージwritebackR。これは、値がインプリメンテーションレジスタファイルcurrentRに書き込まれるであろうステージを提供する。
● dec+1とステージwritebackRとの間(およびそれらを含む)のすべてのステージsについて、次の○に示すマクロ。
○ ブーリアンマクロresult_writeR,s。これは、ステージs中の命令が新しいデータを作成する場合、真である。ステージsが空の場合、このマクロresult_writeR,sは偽を返す。
○ マクロresult_destR,s。マクロresult_destR,sが真の場合、このマクロresult_destR,sは、ステージsの中の命令が書き込まれるレジスタファイルアドレスを含む。
○ ブーリアンマクロresult_validR,s。これは、ステージs中の命令が、今パイプラインを通じてシフトされる新しいデータを既に生成している場合、真である。ステージsが空の場合、このマクロresult_validR,sは偽である。
○ マクロresult_dataR,s。これは、マクロresult_validR,sが真の場合、現在ステージs中にある命令の、Rについての結果を生成する。
and dataR,s(k) @ t =
(if result_writeR,s+1 and result_destR,s+1 = k
then result_dataR,s+1
else dataR,s+1(k)) @ t
この定義の背後にある理論的根拠は、ステージが昇順に確認されることである。値がまだインプリメンテーションレジスタファイルに書き込まれる場合、この値は、それにもかかわらず、対応するアーキテクチャ状態の値になるであろう。したがって、この関数はフォワーディングの検証に関与する。
validR,s(k) @ t =
(if (result_writeR,s+1 and result_destR,s+1 = k)
then result_validR,s+1
else validR,s+1(k)) @ t for the stages s in [dec, writebackR - 1] and
validR,s(k) @ t = false for the stages s in [1, dec-1].
プロパティ生成
次に述べるものは、プロパティが生成される図1のプロパティ生成ステップ205の記述である。この目的のためにプロパティスキーマが提供される。プロパティスキーマは、プロパティがどのようにして生成されるかの記述である。この目的のために、特別の条件が満たされる場合にのみ、プロパティスキーマは、プロパティのテキストのある部分を繰り返すための、或いは、プロパティテキストのプロパティの他の部分を書くためのメタコマンドを含む。そのうえ、プロパティスキーマは、アクセスプロトコル記述および対応情報を構成する定数およびマクロに、プレースホルダーを提供する。
1. メタコマンドすべての実行、即ち、メタコマンドによって規定されるプロパティテキストの或る部分の繰り返し又は省略。
2. 同じ名前のマクロを有するプレースホルダーのインスタンス化。これらマクロは、対応情報およびアクセスプロトコル記述によって提供される。或いは、マクロは、プロパティスキーマに関する方法でアーキテクチャ記述から導かれる。
3. 例えばia、iv、da、dv、int、およびjmpm等の、プロパティテキスト中或いはマクロテキスト中に生じるパイプラインステージの番号用のプレースホルダーすべての、アクセスプロトコル記述或いは対応情報によって提供される実際の番号への置き換え。
jmpm=1であるすべてのアーキテクチャ記述エントリーm>0について、プロパティは、このセクションにおいて議論されるであろうプロパティスキーマsimple_instructionに従って生成される。
1 property simple_instruction;
dependencies: no_reset;
for time_points:
5 t0= t,
t1> t0,
t2> t1,
…
tn> tn-1;
10
assume:
// The time points where the instruction moves forward
at t0: stall1 = 0 || cancel1 = 1;
during [t0+1, t1-1]: stall1= 1;
15 at t1: stall1= 0;
during [t1+1, t2-1]: stall2= 1;
at t2: stall2= 0;
during [t2+1, t3-1]: stall3= 1;
at t3: stall3= 0;
20 ...
at tn: stalln= 0;
// assume that no preceding property cancelled this one
during [t0+1, t1]: cancel1= 0;
25 during [t1+1, t2]: cancel2= 0;
during [t2+1, t3]: cancel3= 0;
...
during [tn-1+1, tn]: canceln= 0;
30 // assume that the processor is ready to execute next instruction
at t0: process_new_instruction_state;
// assume that instruction execution is not interrupted.
during [t0+1, tint]: not trigger0;
35
<fetch> // This is a cutpoint, see ITL section
// Assume that iw contains the instruction
// that should be handled in this property.
40 at tiv: trigger_iwm;
<validate_regs>
at tdec: trigger_statem;
45
prove:
at tia: ibus_read(pc @ t0+1);
<fetch>
50
// Prove that the virtual register file values are valid
// whenever they are to decide upon trigger_state.
# for each reference z to an architecture register file in
# TRIGGER_STATEm:
55 at tvstage(m,z): validR,vstage(m,z)(vindexm,z);
# end for each;
<validate_regs>
60 // Prove that the virtual register file values are valid
// whenever they are required.
# for each reference z to an architecture register file in
# UPDATEm,R, INDEXm;R, ADDRm, or WDATAm:
at tvstage(m,z): validR,vstage(m,z)(vindexm,z);
65 # end for each;
at t1: process_new_instruction_state;
at t1+1: pc = updatem,PC;
70 // Prove that the full signals are correctly created.
during [t1+1, t2]: full2= 1;
during [t2+1, t3]: full3= 1;
...
during [tn-1+1, tn]: fulln= 1;
75
// Prove that this instruction will not initiate cancels.
during [t1+1, t2]: primary_cancel1= 0;
during [t2+1, t3]: primary_cancel2= 0;
...
80 during [tn-1+1, tn]: primary_canceln-1= 0;
// For all registers that get updated, prove their correct
// handling in the pipeline.
85 # for each register file R with ASSIGNm,R in the architecture
# description entry:
# for each stage s = dec + 1, dec + 2, ... writebackR-1
at ts: if result_validR,s = 1
then next(result_validR,s+1) = 1
91 end if;
# end for each stage
# for each stage s = dec + 1, dec + 2, ... writebackR
during [ts-1+1, ts]: result_writeR,s = 1;
during [ts-1+1, ts]: result_destR,s= indexm,R;
95 during [ts-1+1, ts-1]: if (result_validR,s = 1)
then next(result_validR,s) = 1
end if;
during [ts-1+1, ts]: if (result_validR,s = 1)
then result_dataR,s = updatem,R;
100 end if;
# end for each stage
at twritebackR+1: currentR(indexm,R) = updatem,R
# end for each register
# for each register file R with NO_ASSIGNR in the arch. entry:
105 # for each stage s = dec + 1, dec + 2, ... writebackR
during [ts-1+1, ts]: result_writeR,s = 0;
# end for each stage
# end for each register
# if the architecture description entry contains DMEM_READ(ADDRm)
110 at tda: dbus_read(addrm);
# else if it contains DMEM_WRITE(ADDRm, WDATAm)
at tda: dbus_write(addrm, wdatam);
# else // it contains DMEM_IDLE
at tda: dbus_idle;
115 # end if
left_hook: t0;
right_hook: t1;
end property;
5〜9行目は時間変数t0,t1,t2,…tnを導入する。12〜21行目は、これら時間変数t0,t1,t2,…tnを、命令実行を前進させることが可能な時点に関連付ける。これはすべてのステージについて遂行される。stalls条件およびcancel0条件は、対応情報で提供される。
jmpm/=1であるすべてのアーキテクチャ記述エントリーm>0について、プロパティは、プロパティスキーマjump_instructionに従って生成される。
1 property jump_instruction;
dependencies: no_reset;
for time_points:
5 t0= t,
t1 > t0,
t2> t1,
…
tn> tn-1;
10
assume:
// The time points where the instruction moves forward
at t0: stall1 = 0 || cancel1 = 1;
during [t0+1, t1-1]: stall1= 1;
15 at t1: stall1= 0;
during [t1+1, t2-1]: stall2= 1;
at t2: stall2= 0;
during [t2+1, t3-1]: stall3= 1;
at t3: stall3= 0;
20 ...
at tn: stalln= 0;
// assume that no preceding property cancelled this one
during [t0+1, t1]: cancel1= 0;
25 during [t1+1, t2]: cancel2= 0;
during [t2+1, t3]: cancel3= 0;
...
during [tn-1+1, tn]: canceln= 0;
30 // assume that the processor is ready to execute next instruction
at t0: process_new_instruction_state;
// assume that instruction execution is not interrupted.
during [t0+1, tint]: not trigger0;
35
<fetch> // This is a cutpoint, see ITL section
// Assume that iw (the freeze variable) contains the instruction
// that should be handled in this property.
40 at tiv: trigger_iwm;
<validate_regs>
at tdec: trigger_statem;
45
prove:
at tia: ibus_read(pc @ t0+1);
<fetch>
50
// Prove that the virtual register file values are valid
// whenever they are to decide upon trigger_state.
# for each reference z to an architecture register file
#in TRIGGER_STATEm:
55 at tvstage(m,z): validR,vstage(m,z)(vindexm,z);
# end for each;
<validate_regs>
60 // Prove that the virtual register file values are valid
// whenever they are required.
# for each reference z to an architecture register file
# in UPDATEm,R, INDEXm,R, ADDRm, or WDATAm:
at tvstage(m,z): validR,vstage(m,z)(vindexm,z);
65 # end for each;
at t1: process_new_instruction_state;
at tjmp+1: pc = updatem,PC;
70 // Prove that the full signals are correctly created.
during [t1+1, t2]: full2= 1;
during [t2+1, t3]: full3= 1;
...
during [tn-1+1, tn]: fulln= 1;
75
// Prove that wrongly fetched instructions are cancelled.
at tjmp: primary_canceljmp-1= 1;
// Prove that the cancel creates empty stages
80 at tjmp + 1: full2= 0;
at tjmp + 1: full3= 0;
...
at tjmp + 1: fulljmp= 0;
85
// Prove that this instruction will not initiate further cancels.
during [tjmp+1, tjmp+1]: primary_canceljmp = 0;
during [tjmp+1+1, tjmp+2]: primary_canceljmp+1 = 0;
during [tjmp+2+1, tjmp+3]: primary_canceljmp+2 = 0;
90 ...
during [tn-1+1, tn]: primary_canceln-1 = 0;
// For all registers that get updated, prove their correct
95 // handling in the pipeline.
# for each register file R with ASSIGNm,R in the architecture
# description entry:
# for each stage s = dec + 1, dec + 2, ... writebackR-1
at ts: if result_validR,s = 1
100 then next(result_validR,s+1) = 1
end if;
# end for each stage
# for each stage s = dec + 1, dec + 2, ... writebackR
during [ts-1+1, ts]: result_writeR,s = 1;
105 during [ts-1+1, ts]: result_destR,s= indexm,R;
during [ts-1+1, ts-1]: if (result_validR,s = 1)
then next(result_validR,s) = 1
end if;
during [ts-1+1, ts]: if (result_validR,s = 1)
110 then result_dataR,s = updatem,R;
end if;
# end for each stage
at twritebackR+1: currentR(indexR) = updatem,R;
# end for each register
115 # for each register file R with NO_ASSIGNR in the arch. entry:
# for each stage s = dec + 1, dec + 2, ... writebackR
during [ts-1+1, ts]: result_writeR,s = 0;
# end for each stage
# end for each register
120 # if the architecture description entry contains DMEM_READ(ADDRm)
at tda: dbus_read(addrm);
# else if it contains DMEM_WRITE(ADDRm, WDATAm)
at tda: dbus_write(addrm, wdatam);
# else // it contains DMEM_IDLE
125 at tda: dbus_idle;
# end if
left_hook: t0;
right_hook: tjmp;
130 end property;
1〜71行目は、プロパティスキーマsimple_instructionと等しく、そこに説明される。
割り込みに関するアーキテクチャ記述エントリー0について、いくつかのプロパティは、プロパティスキーマinterrupthに従って生成される。これは、値h=1,2,…を取る付加的な変数hによって記述される。
● 定数は変更されない。
● R[VINDEX0,z]がdataR,vstage(0,z)(vindex0,z)@tvstage(0,z)に置き換えられる。ここで、vindex0,zは、ここに記述された手順を再帰的に適用することにより、VINDEX0,zから生成される(vstage0,z>=intが要求されることに注意する)。
● PCがpc@t0+1に置き換えられる(これは常に、割り込みによって削除される最も古い命令のプログラムカウンタPCであることに注意する)。
● DMEM_RDATAがdbus_rdata@tdvに置き換えられる。
● IRPTからのアーキテクチャ割り込み信号が、irpt@tirpt中の対応する信号に置き換えられる。
1 property interrupth;
dependencies: no_reset;
for time_points:
5 t0 = t,
t1> t0,
t2 > t1,
...
th-1> th-2,
10
tirpt> th-1,
th = tirpt,
th+1 = tirpt,
15 ...,
tint-1 = tirpt,
tint>= tirpt,
20 tint+1 > tint,
…
tn> tn-1;
assume:
25 at t0: stall1 = 0 || cancel1 = 1;
during [t0+1, t1-1]: stall1 = 1;
at t1: stall1= 0;
during [t1+1, t2-1]: stall2= 1;
at t2: stall2= 0;
30 during [t2+1, t3-1]: stall3= 1;
at t3: stall3= 0;
....
during [th-2+1, th-1-1]: stallh-1= 1;
at th-1: stallh-1= 0;
35
during [th-1+1, tirpt-1]: stallh= 1 and not trigger0;
at tirpt: trigger0;
during [tirpt, tint-1]: stallint= 1;
at tint: stallint= 0;
40 during [tint+1, tint+1-1]: stallint+1 = 1;
at tint+1: stallint+1= 0;
during [tint+1+1,tint+2-1]: stallint+2 = 1;
at tint+2: stallint+2= 0;
...
45 during [tn-1+1, tn-1]: stalln = 1;
at tn: stalln= 0;
during [t0+1, t1]: cancel1= 0;
during [t1+1, t2]: cancel2= 0;
50 during [t2+1, t3]: cancel3= 0;
...
during [th-1+1, tirpt-1]: cancelh= 0;
during [tirpt+1, tint]: cancelint= 0;
during [tint+1, tint+1]: cancelint+1= 0;
55 ...
during [tn-1+1, tn]: canceln= 0;
// assume that the processor is ready to execute next instruction
at t0: process_new_instruction_state;
60
// Focus h on the highest nonempty stage.
at tirpt: fullh+1 = 0;
at tirpt: fullh+2= 0;
...
65 at tirpt: fullint= 0;
prove:
at tint: process_new_instruction_state;
70 // New PC from interrupt
at tint+1: pc = update0,PC;
// Prove that the full signals are correctly created.
during [t1+1, t2]: full2= 1;
75 during [t2+1, t3]: full3= 1;
...
during [th-1+1, tirpt-1]: fullh= 1;
during [tirpt+1, tint]: fullint= 1;
80 during [tint+1, tint+1]: fullint+1 = 1;
during [tint+1+1, tint+2]: fullint+2= 1;
...
during [tn-1+1, tn]: fulln= 1;
85 // Prove that all instructions in the pipeline get removed
at tirpt: primary_cancelint-1= 1;
at tirpt+1: full2= 0;
at tirpt+1: full3= 0;
90 ...
at tirpt+1: fullint-1= 0;
at tirpt+1: if prev(stallint) = 0
then fullint= 0
95 end if;
// Prove that the virtual register file values are valid
// whenever they are required.
// In the index subscripts vstageR,k will be written vstage(R,k).
100 # for each reference to an architecture register file in
# UPDATE0,R, INDEX0,R, ADDR0, or WDATA0:
at tvstage(0,z): validR,vstage(0,z)(vindex0,z);
# end for each;
105 // Prove that there will not be a second interrupt.
during [tirpt+1, tint]: trigger0= 0;
// For all registers that get updated, prove their correct
// handling in the pipeline.
110 # for each register file R with ASSIGN0,R in the arch. entry:
at tint: if (tirpt /= tint and
result_validR,int = 1)
then next(result_validR,int+1) = 1
end if;
115 # for each stage s = int+1, int+2, ... writebackR-1
at ts: if result_validR,s = 1
then next(result_validR,s+1) = 1
end if;
# end for each stage
120
during [tirpt+1, tint-1]: if (result_validR,int = 1)
then next(result_validR,int) = 1
end if;
during [tirpt+1, tint]: result_writeR,int = 1;
125 during [tirpt+1, tint]: result_destR,int = index0,R;
# for each stage s = int + 1, int + 2, ... writebackR
during [ts-1+1, ts]: result_writeR,s = 1;
during [ts-1+1, ts]: result_destR,s= index0,R;
130 during [ts-1+1, ts-1]: if (result_validR,s = 1)
then next(result_validR,s) = 1
end if;
during [ts-1+1, ts]: if (result_validR,s = 1) then result_dataR,s =
135 update0,R;
end if;
# end for each stage
at twritebackR+1: currentR(index0,R) = update0,R;
# end for each register
140 # for each register file R with NO_ASSIGNR in the spec entry:
# for each stage s = dec + 1, dec + 2, ... writebackR
during [ts-1+1, ts]: result_writeR,s = 0;
# end for each stage
# end for each register
145 # if the interrupt description contains DMEM_READ(ADDR0) at tda: dbus_read(addr0);
# else the interrupt description contains
# DMEM_WRITE(ADDR0, WDATA0)
at tda: dbus_write(addr0, wdata0);
150 # else // no transaction to the data memory
at tda: dbus_idle;
# end if
left_hook: t0;
155 right_hook: tint;
end property;
生成されたプロパティは、命令がどのように実行を開始するかを記述し、一方では、命令がその後どのように割り込み実行に置き換えられるかを記述する。
インプリメンテーションのリセット値に関するプロパティを生成するために、アーキテクチャリセット信号をインプリメンテーションリセット信号に置き換えることにより、マクロTRIGGERinitからマクロtriggerinitが導かれる。
property reset;
assume:
at t: triggerinit;
prove:
at t+1: full2 = 0;
at t+1: full3 = 0;
...
at t+1: fulln = 0;
# For each register R[k]
at t+1: currentR(k) = init_valR,k;
# end for each register;
at t+1: PC = init_valPC;
at t+1: dbus_idle;
at t+1: process_new_instruction_state;
right_hook: t+1;
end property;
下記の証明で使用するために、生成されたリセットプロパティは、時点t1,t2,…tnに関連付けられ、tに等しいと定義される。
対応情報からのマクロに関する制限は、次のプロパティスキーマに捕らえられる。これらプロパティスキーマのすべてについて、プロパティスキーマsimple_instructionについて提示された方法で、マクロTRIGGER0からマクロtrigger0が導かれる。
property cancel_correct;
dependencies: no_reset;
prove:
at t: for each i in 2..n:
if canceli = 1
then canceli-1 = 1
end if;
end for each;
end property;
stall_empty:このプロパティスキーマは、fullsマクロに対応する対応情報によって、命令を実行しないステージに、空であることを示すフラグが正確に立てられることを保証する。マクロtrigger0は、上記したプロパティにおいて使用されるマクロである。
property stall_empty;
dependencies: no_reset;
prove:
at t: for each i in 2 .. n
if (not (fulli-1 or (i-1 = int and trigger0))
or stalli-1) and
(not (fulli or (i = int and trigger0))
or not stalli))
then
next(fulli) = 0;
end for each;
end property;
stall_full:このプロパティスキーマは、ステージ中に隣接する2つの命令がマージされないであろうことを保証する。
property stall_full;
dependencies: no_reset;
prove:
at t: for each i in 2 .. n:
if (
(fullior (i = int and trigger0) and
(fulli-1 or (i-1 = int and trigger0) and
not stalli-1)
then stalli = 0
end if;
end for each;
end property;
full_slot:このプロパティスキーマは、fulls対応情報が、命令を実行するステージに正確にフラグを立てることを保証する。
property full_slot;
dependencies: no_reset;
prove:
at t: full1= 1 and
for each i in 1 .. n-1:
if ((fulli = 1 or (i = int and trigger0))
and stalli= 0 and canceli = 0)
then next(fulli+1) = 1
end if;
end for each and
for each i in 2 .. n:
if ((fulli = 1 or (i = int and trigger0))
and stalli= 1 and canceli = 0)
then next(fulli) = 1
end if;
end for each;
end property;
empty_write:このプロパティスキーマは、空のパイプラインステージが仮想レジスタファイルに書き込むことができないことを保証する。empty_writeプロパティスキーマは、アーキテクチャレジスタファイルのすべてについて繰り返されなければならない。
# for each register R file in the architectural state
property empty_writeR;
dependencies: no_reset;
prove:
at t: if (fulldec+1 = 0) then result_writeR,dec+1 = 0 end if and
if (fulldec+2 = 0) then result_writeR,dec+2 = 0 end if and
...
if (fullwritebackR = 0) then result_writeR,writebackR = 0 end if;
end property;
# end for each register;
write_back:このプロパティスキーマは、すべてのアーキテクチャレジスタファイルについてのインプリメンテーションレジスタファイルcurrentR(k)が更新されない場合、それが変わらないであろうことを保証する。
# for each register R file in the architectural state
property write_backR;
dependencies: no_reset;
prove:
at t: for each k in <index range of Ri>
if (stallwritebackR = 1 or
result_writeR,writebackR= 0 or
result_destR,writebackR/= k)
then next(currentR(k)) = currentR(k)
end if;
end for each;
end property;
# end for each register;
empty_cancel:空のステージが取り消し命令を開始することができないようにするために、プロパティスキーマは取り消し状態を空にする。そのうえ、ステージint及びbeyondは、取り消し命令を全く開始することができない。これはステージ間の関係からの結果である。
property empty_cancel;
dependencies: no_reset;
prove:
at t: if (not full2) then primary_cancel1 = 0 end if and
if (not full3) then primary_cancel2 = 0 end if and
...
if (not fullint-1) then primary_cancelint-2 = 0 end if and
if (not (fullint or trigger0)) then
primary_cancelint-1 = 0 end if and
cancelint= 0 and
cancelint+1 = 0 and
... and
canceln= 0;
end property;
interrupt_regs_valid:このプロパティスキーマは、割り込みが受理されるか否かを決定するために必要とされる値が常に有効であることを要求する。
# for each register R[k] evaluated in TRIGGER0.
property interrupt_regs_validR,k;
dependencies: no_reset;
prove:
at t: validR,int(k);
end property;
# end for each
生存プロパティ
上記した証明は、ストール信号がストールを永久に生成しない場合にのみ、アーキテクチャとインプリメンテーションとの間の等価性を示す。続いてのセクションは、プロパティが生成されるところのプロパティスキーマに捧げられ、そのプロパティスキーマは、ストールが永久に続かないであろうことと、その結果として、すべての割り込み又は命令実行が、インプリメンテーションクロックサイクルの有限数だけ起こることとを示す。
トータルウェイトtotalsのこの定義の助けを借りて、次のプロパティスキーマが使用されて、ステージs中のストールが永久に続かないことを示すためのプロパティを生成する。
property liveness_stalls;
assume:
at t: external_stall = 1;
prove:
at t+1: (totals <= prev(totals)) or stalls=0;
end property;
property liveness_nostalls;
assume:
at t: external_stall = 0;
prove:
at t+1: (totals < prev(totals)) or stalls = 0;
end property;
これらプロパティスキーマは、外部のストールが存在しない場合はいつでも、トータルウェイトtotalsが実際に減少すること、或いは、対応性の点において、パイプラインステージsのstallsが存在しないことを示す。外部のストールが存在する場合は、トータルウェイトtotalsは、stallsが存在しない場合にのみ増大することができる。言いかえれば、stallsが永久にアクティブで、且つ、外部のストールが永久にアクティブでない場合は、トータルウェイトtotalsは負の数にならなければならないであろう。それは矛盾である。したがって、上記した2つのプロパティスキーマは、概して、環境がプロセッサをいつまでもストールさせない場合、ステージsへのストール信号がいつまでもアクティブにならないことを証明する。実行される正確なフォワーディングパスについての明示的なユーザ入力を、プロパティスキーマが要求しないことに注意する。言いかえれば、命令がストールされる場合と命令がストールされない場合との正確な条件を、ユーザが退屈にモデル化する必要がない。上記したプロパティスキーマは、パイプライン化された任意のプロセッサが満たさなければならない最小限の要求を形成する。
このセクションは、すべての生成されたプロパティの証明が、アーキテクチャ記述とインプリメンテーションとの間の等価性を証明するのに十分であることを示す。
証明によって検査された状況は、アーキテクチャ記述およびインプリメンテーション記述の等価性の定義に従う。同じ命令の内容を有する命令メモリが、インプリメンテーションおよびアーキテクチャの両方に対して接続される。命令メモリは、まるでその命令メモリがアーキテクチャ用の非同期式メモリであったかのように扱われる。これは、命令メモリが、命令メモリから同じサイクル中のリクエスタへ、要求された情報を返すことを意味する。インプリメンテーション記述について、命令メモリはいくつかのレイテンシを有することができ、インプリメンテーションは、ストールを有すること、或いは、アドレスを発行することにより、パイプラインステージ中の異なる命令で命令を読み込むことを考慮する。
対応情報に定義された仮想レジスタファイルを用いて、インプリメンテーション状態がどのようにアーキテクチャ状態へマッピングされるかが、今示されるであろう。マッピングの結果として、それぞれのメインプロパティは、仮想レジスタファイルが、そのメインプロパティによって記述される命令又は割り込みの実行によってどのように修正されるかを記述する。
● t<=t1の場合、値1
● tが区間[ti-1+1,ti]内にある場合、値i
● t>twの場合、w+1
プロパティスキーマsimple_instructionおよびjump_instructionの状況下において、tがt1とtnとの間に位置することが提供されると、関数S(t)は、命令が時間に依存して実行されるところのステージの番号を返す。このため、この関数S(t)は、時点のシーケンスt1,t2,…twについてのステージ関数と呼ばれる。
and validR,S(v)-1(k) @ v -> (dataR,S(v)-1(k) @ v = dataR,S(w)-1(k) @ w)
一旦これが示されれば、さらなる結論は次のとおりである。定義により、表現validR,writebackR(k)=1であるため、少なくとも時点u=twritebackR+1について、時点uにおける表現validR,S(u)-1(k)は真になる。初期の時点において表現validR,writebackR(k)が真になる場合、時点uにおけるdataR,S(u)-1(k)は、この時点uから前方への時点twritebackR+1まで定数になるであろう。従って、メインプロパティの後の仮想レジスタファイルの値であるとして、仮想レジスタファイルが有効になった後の、仮想レジスタファイルが有する或る特定の値について証明することが正確である。
証明は帰納法によって行われる。帰納法仮定は、すべてのj>=0について、次の推測が適合する。
1. 証明概念に関するセクションからのリセット制限に続くすべての実行トレースについて、実行トレースの最初の部分に一致するメインプロパティの有限のチェーンP0,P1,P2,…Pjが存在する。
2. 仮想レジスタファイルについての整合性表現が、メインプロパティPjについて適合する。
3. すべてのアーキテクチャレジスタR[k]@j+1の値が、メインプロパティPjの後の仮想レジスタファイルの値に等しい。
4. メインプロパティPjがインプリメンテーションの実行トレースに一致する方法で提供される時点right_hook+1において、j番目のアーキテクチャサイクルの後のアーキテクチャプログラムカウンタPC@j+1の値が、インプリメンテーションプログラムカウンタpcの値に等しい。
5. Pjおよびj番目のアーキテクチャサイクルが、データメモリからの或いはデータメモリへの同じトランザクションを記述する。
6. そのうえ、Pjの区間[right_hook+1,tint]内に受理される割り込みが存在しない。即ち、この区間内のすべての時点についてtrigger0=偽である。
ベースケースは、アーキテクチャ及びインプリメンテーション両方のリセットに関する。アーキテクチャのリセットは、アーキテクチャ記述中のリセットのアクティビティブロックであるACTinitに従って、レジスタファイル値を提供する。これは、レジスタファイル値R[k]@1を与え、そしてさらに、プログラムカウンタ値PC@1を与える。レジスタ値およびプログラムカウンタの値PCは、最初のアーキテクチャ状態AS1を形成する。
帰納法ステップは、j番目のアーキテクチャサイクルについて帰納法仮定が適合すると仮定する。帰納法ステップが、j+1番目のアーキテクチャサイクル及びメインプロパティPj+1についても適合することが、今示されなければならない。この目的のために、メインプロパティのチェーンP0,P1,P2,…Pj+1が実行トレースの最初の部分に一致するような、すべての実行トレースについてのメインプロパティPj+1が存在することが示されなければならない。その後、アーキテクチャが、関連するアーキテクチャ記述エントリーを実行し、同じデータを生成することが示されなければならない。
ストール信号の生存性のために、stall1@t’1=0である第1の時点t’1>Tqが存在し、stall2@t’2=0である第2の時点t’2>t’1が存在し、時点t’3,…t’nについても同様に存在する。マクロtrigger0が区間[Tint+1,t’int-1]内のどこかで満たされる場合、この区間[Tint+1,t’int-1]内には、少なくとも1つの受理された割り込みが存在する。tirptを、割り込みが受理される区間内の第1の時点、即ち、trigger0@tirpt=1であるような第1の時点とする。この状況において、Pj+1になることが可能な唯一の候補は、プロパティスキーマinterrupthから生成されたメインプロパティのうちの1つである。ここで、Sはt’1,t’2,…t’nについてのステージ関数であり、h=S(tirpt)である。しかしながら、そのようなプロパティの適用範囲は、まだ確認を必要とする。この確認を容易にするために、時点t0,t1,…tnは、このプロパティスキーマにおいて使用される方法で定義される。即ち、t0=Tq,t1=t’1,t2=t’2,…th-1=t’h-1,th=tirpt,th+1=tirpt,…tint-1=tirptであり、tintは、stallint@tint=0を満たし且つ>=tirptである第1の時点であり、tint+1は、stallint+1@tint+1=0を満たし且つ>tintである第1の時点であり、tint+2,tint+3,…tnについても同様である。
PjとPj+1の候補との間のタイミング関係は、いくつかの図中に例示される。
● 図5は、プロパティスキーマsimple_instructionから生成された2つのメインプロパティPjおよびPj+1を示す。
● 図6は、プロパティスキーマreset(q=n)、jump_instruction(q=jmpm)、simple_instruction、interrupt(tirpt=tintの場合、q=int、tirpt<tintの場合、q=int-1)、もしくはsimple_instructionからプロパティが生成され、引き続き、プロパティスキーマsimple_instruction又はjump_instructionからプロパティが生成される一般的な場合を示す。q=1の場合、図6は図5に縮退する。
● 図7は、プロパティスキーマreset、simple_instruction、jump_instruction、もしくはinterrupthのうちから1つのプロパティが生成され、引き続き、プロパティスキーマinterrupthからプロパティが生成される一般的な場合を示す。ここで、qは上記説明したように割り当てられる。
● 時間にわたる帰納法についてのベースケースはt=max(Tq,T2)+1である。
○ 2<=qの場合、Pjは、プロパティスキーマjump_instruction、interrupth、もしくはresetのうちの1つから生成される。これがq=1に関連付けられるため、Pjはプロパティスキーマsimple_instructionから生成され得ない。従って、T2<=Tqであり、また、メインプロパティPjの証明部分から、full2@Tq+1=0である。
○ q=1の場合、区間が空でないかどうかだけを証明することがあり、このことはT2<t1を要求し、stall2@T2=0である。さらに、t1が、stall1を用いないT1後の次の時点であると定義されたので、stall1@T2=1である。そして、プロパティstall_emptyから、それはfull2@T2+1=0に従う。
● 時間にわたる帰納法についてのステップケース:wを[T2+1,t1-1]内の時点とする。帰納法仮定は、full2@w=0の仮定を可能にする。そして、stall1@w=1であり(t1が、T1後のステージ1の最初のノーストールであるので)、プロパティstall_emptyから、それはfull2@w+1=0に従う。
● ベースケースt=max(Tq,Ts+1)+1は、qおよびs+1の関係にわたる帰納法のケースを要求する。
○ 第1に、s+1<=qが検査される。これは、プロパティPjがプロパティスキーマreset、jump_instruction、もしくはinterrupthから生成されることを意味する。それは、fulls+1@Tq+1=0を直接証明する。
○ q<s+1の場合、Ts+1<tsであるならば、区間[max(Tq,Ts+1)+1,ts]は要素のみを含む。qの定義からTs<Ts+1であり、従ってstalls+1@Ts+1=0である。ts-1とTs+1との関係について、場合分けが行われる必要がある。
■ ts-1<Ts+1の場合、Ts+1は区間[ts-1+1,ts-1]内に存在する。したがって、stalls@Ts+1=1である。そして、プロパティstall_emptyは、fulls+1@Ts+1+1=0と結論され得る。
■ Ts+1<=ts-1の場合、時点Ts+1は区間[ts+1,ts-1]内に存在する。したがって、ステージにわたる帰納法仮定は適用可能であり、fulls@Ts+1=0を示す。Ts+1において受理される割り込みが存在しない場合、或いは、s/=intの場合、プロパティstall_emptyが適用可能であり、fulls+1@Ts+1+1=0を示す。s=int、且つTs+1において割り込みが受理される場合、Ts+1=tirptである。tintはtirpt以上であり、ノーストールを有する最初の時点であると定義される。tint>Tint+1と予想されるので、stalls@Tint+1=1に従う。したがって、プロパティstall_emptyは、さらに、fullint+1@Tint+1+1=0を示す。
● ステップ:区間[max(Tq,Ts+1)+1,ts-1]内のいくつかの時点wについて、fulls+1@w=0が証明されるとする。
○ fulls+1@w+1を決定するために、Ts+1<tsであれば、時間w=tirptにおいて受理される割り込みのみが関連性を有することができる。したがって、s=intである。そのうえ、stallint@tirpt=1である。これは、プロパティstall_emptyの適用を可能にし、このことは、fulls+1@tirpt+1=0を与える。
○ 残りの場合について、時間wにおいて受理された割り込みは、それゆえに除外され得るか、或いは、プロパティstall_emptyの適用には無関係である。
■ w<=ts-1の場合、ステージsに関する帰納法仮定は適用可能であり、fulls@w=0を与える。したがって、プロパティstall_emptyは適用可能であり、これはfulls+1@w+1=0を示す。
■ ts-1<wの場合、wは[ts-1+1,ts-1]内にある。この区間内には、stalls@w=1が存在し、したがって、プロパティstall_emptyの適用が、fulls+1@w+1=0を提供する。
tを、t0+1=Tq+1とtnとの間の(および含む)時点とする。U(t)を、T1,T2,…Tnに関連付けられたステージ関数とする。L(t)を、t1,t2,…tnに関連付けられたステージ関数とする。
● ベース:t<=Tnの場合、メインプロパティPjの仮定部分がcancelU(t)@t=0を提供し、証明部分がprimary_cancelU(t)-1@t=0を提供する。Pjが適用可能であると示されたので、仮定部分はその状況を記述する。これはcancelU(t)-1@t=0を示す。t>Tnの場合、U(t)=n+1であり、canceln@t=0が、プロパティemtpy_cancelから得られる。これはベースケースを証明する。
● ステップ:区間[L(t)+1,U(t)-1]内のいくつかのステージsについて、cancels@t=0であるとする。int<sの場合、帰納法仮定は、プロパティemtpy_cancelから直接的に得られ、cancels-1@t=0である。このようにしてprimary_cancelが定義されるので、s<=intの場合、cancels-1@t=cancels@t、もしくはprimary_cancels-1@tである。帰納法仮定からcancels@t=0であり、プロパティempty_cancelからprimary_cancels-1@t=0であり、よってcancels-1=0である。これは、ステップケース、よって要求全体を証明する。
during [t1+1, t2]: cancel2 = 0;
during [t2+1, t3]: cancel3 = 0;
...
during [tn-1+1, tn]: canceln = 0;
スロットの解体
時点tおよびステージsからのスロットは、
at t: stalls= 0;
during [ts+1, ts+1-1]: stalls+1= 1;
at ts+1: stalls+1 = 0;
...
during [tn-1+1, tn]: stalln= 1;
at tn: stalln= 0;
を用いて、時点(t,ts+1,ts+2,…tn,tn+1)のシーケンスであると定義される。
すべてのアーキテクチャレジスタR[k]については、区間[tdec-1+1,twritebackR]内の2つの時点v<=wの両方について、
validR,L(v) @ v -> validR, L(w) @ w and
validR,L(v) @ v -> dataR,L(v)(k) @ v = R[k] @ j + 1
が証明される。
validR,int(k) @ v and (dataR,int(k) @ v = R[k] @ j + 1)
が証明されるであろう。
validR,s(k) @ t = validR,u(t)-1(k) @ t
が証明される。
validR,s-1(k)@ t = (if (result_writeR,s and result_destR,s = k)
then result_validR,s
else validR,s(k)) @ t
である。
validR,s(k) @ t -> dataR,s(k) @ t = R[k] @ j + 1
が証明されるであろう。
dataR,s-1(k) @ t =
(if result_writeR,s and result_destR,s = k
then result_dataR,s
else dataR,s(k)) @ t
である。
次に、3つのプロパティスキーマsimple_instruction、jump_instructionもしくはinterrupthのうちの1つから生成されたプロパティPj+1が、常に適用可能であることが示されるであろう。プロパティPj+1の候補がプロパティスキーマinterrupthから生成されれば、そのプロパティが確かに適用可能であることが、今示されるであろう。
validR,S(v)-1(k) @ v =
(if (result_writeR,S(v)and result_destR,S(v) = k)
then result_validR,S(v)
else validR,S(v)(k)) @ v
および
validR,S(w)-1(k) @ w =
(if (result_writeR,S(w)and result_destR,S(w) = k)
then result_validR,S(w)
else validR,S(w)(k)) @ w
である。
validR,L(v)-1(k) @ v -> validR,L(w)-1(k) @ w
が適合する。1番目はPj+1の証明部分からの結果であり、2番目はレジスタに関する推論からの結果である。
dataR,L(t)-1(k) @ t =
(if result_writeR,L(t) and result_destR,L(t) = k
then result_dataR,L(t)
else dataR,L(t)(k)) @ t
である。
今、区間[Tint+1,tint]内において割り込みが受理されない場合を考える。この場合、上記定義された時点t0,t1,t2,…もまた存在し、プロパティスキーマsimple_instruction或いはjump_instructionスキーマから生成されたプロパティの時間変数が、それに応じて実証される場合、ストール動作(プロパティスキーマsimple_instructionおよびjump_instruction中の13〜21行目)に関する仮定がさらに満たされる。
● 8つのレジスタを有する1つのレジスタファイルREGを備える。
● プログラムカウンタPCを備える。
● 4ステージのパイプラインによって実装される。
● フォワーディングをサポートする。
● データメモリによって開始されるストールをサポートする。
● いくつかの典型的な命令をサポートする。これら命令は次にリストされ、命令のオペランドが記述されるであろう。完全な命令は、何が行われなければならないかを選択するためのオペコードと、そのオペコードに従って解釈される必要があるオペランドとから構成される。これらはすべて命令語からデコードされる。命令のリストは次の通りである。
○ NOT:コマンドによってレジスタが選択され、レジスタの内容がビット反転される。その結果はデスティネーションレジスタに格納される。デスティネーションレジスタのアドレスも命令によって与えられる。
○ ADD/SUB:コマンドによって2つのソースオペランドレジスタが選択される。その結果はデスティネーションレジスタに書き込まれる。デスティネーションレジスタのアドレスは命令によって与えられる。
○ LD:命令によってレジスタが選択され、いくつかのベースアドレスを提供する。命令によって提供されるオフセットが、ベースアドレスに加えられるであろう。これは、データメモリからデータがロードされるところのアドレスを与える。
○ ST:命令によってレジスタが選択され、ベースアドレスを提供する。命令によって提供されるオフセットが、ベースアドレスに加えられるであろう。これは、データメモリへの書き込み要求のアドレスを与える。命令はまた、レジスタのデータが格納されるところのレジスタのアドレスを提供する。
○ BEQZ:命令によってレジスタが選択される。このレジスタが0である場合、ジャンプが実行されるであろう。ジャンプの実行とは、命令によって提供されるオフセットが、命令メモリ内において命令が見つかるところのアドレスに加えられることを意味する。これは、次の命令のアドレスを与える。レジスタが0でない場合、ジャンプは実行されず、プログラムカウンタは命令のサイズによってインクリメントされるであろう。
● 命令BEQZの場合、プロセッサは命令が得られないと推測する。第2のステージにおいて、ソースレジスタファイルが0であるという条件が確認され、このことは、ステージ1における命令の取り消しを導くことができる。
● 割り込みは、信号int_valid_iを通じてプロセッサに到着する。レジスタREG[0]が0である場合、その割り込みは受理される。割り込みサービスルーチンの後にプロセッサが返さなくてはならないアドレスは、レジスタREG[0]内に格納されるであろう。割り込みの場合には、割り込みサービスルーチンの開始アドレスが、割り込み入力に属する入力int_addr_iによって提供される。
アーキテクチャ入力
標準化されたメモリ入力(上記の記述を参照)に加えて、アーキテクチャは、割り込みが到着し得るところの入力INT_VALID_I、割り込みサービスルーチンの最初のアドレスを定義する入力INT_ADDR_I、およびプロセッサをリセットするための入力RESET_Nを有する。
アーキテクチャ状態は、レジスタファイルREGおよびプログラムカウンタPCである。
初期化
プロセッサはresetをアクティブ化することによって初期化される。この初期化は次の表現によって捕らえられる。
TRIGGERinit:= RESET_N = 0;
初期化が完了した後、プロセッサは、すべてのアーキテクチャ状態が0を生成する状態である。したがって、対応するアクティビティブロックACTinitは次の通りである。
PC := 0;
REG[0] := 0;
REG[1] := 0;
REG[2] := 0;
REG[3] := 0;
REG[4] := 0;
REG[5] := 0;
REG[6] := 0;
REG[7] := 0;
割り込み
割り込みが受理される条件は次で与えられる。
TRIGGER0:= INT_VALID_I and REG[0] = 0;
次に続くアクティビティブロックACT0は、上記で述べられたことに従って、割り込み実行を記述する。
UPDATE0,PC:= INT_ADDR_I;
UPDATE0,REG := PC;
INDEX0,REG := 0;
DMEM_IDLE0
アクティビティブロックの最後のエントリーは、データメモリへのアクセスが実行されないという事実を参照する。
関連する命令についてのオペコードを含む定数add、sub、not、等などが定義されるであろう。
TRIGGER_IW1 := IW[15:11] = add;
TRIGGER_STATE1:= true;
アクティビティブロックは、PCのインクリメントと、命令に従ったレジスタファイルREGの更新とを明示する。
UPDATE1,PC := (PC + 2)[7 :0];
UPDATE1,REG := (REG[IW[10:8]] + REG[IW[7:5]])[15:0]
INDEX1,REG := IW[4:2];
VINDEX1,1:= IW[7:5];
VINDEX1,2:= IW[10:8];
DMEM_IDLE1
同様に命令SUBについて
TRIGGER_IW2 := IW[15:11] = sub;
TRIGGER_STATE2:= true;
UPDATE2,PC := (PC + 2)[7 :0];
UPDATE2,REG:= unsigned((REG[IW[10:8]] - REG[IW[7:5]])[15:0])
INDEX2,REG := IW[4:2];
VINDEX2,1:= IW[7:5];
VINDEX2,2:= IW[10:8];
DMEM_IDLE2
命令NOT
TRIGGER_IW3 := IW[15:11] = not;
TRIGGER_STATE3:= true;
UPDATE3,PC := (PC + 2)[7 :0];
UPDATE3,REG := ~ REG[IW[10:8]]
INDEX3,REG := IW[4:2];
VINDEX3,1:= IW[10:8];
DMEM_IDLE3
メモリ命令
メモリ命令の興味深い部分は、アクティビティブロックがエントリーDMEM_READもしくはDMEM_WRITEを含むことと、読み込み命令のアクティビティブロックが、読み込みデータ用のマクロDMEM_RDATAを使用することとである。
TRIGGER_IW4 := IW[15:11] = ld;
TRIGGER_STATE4:= true;
UPDATE4,PC := (PC + 2)[7 :0];
UPDATE4,REG := DMEM_RDATA;
INDEX4,REG := IW[10:8];
VINDEX4,1:= IW[7:5];
DMEM_READ4((IW[4:0] + REG[IW[7:5]]) [7:0])
命令ST
TRIGGER_IW5 := IW[15:11] = st;
TRIGGGER_STATE5:= true;
UPDATE5,PC := (PC + 2)[7 :0];
No assignment to REG
VINDEX5,1 := IW[10:8];
VINDEX5,2:= IW[7:5]
DMEM_WRITE5((IW[4:0] + REG[IW[7:5]]) [7:0], REG[IW[10:8]])
条件付きジャンプ
ジャンプが起こるか否かに依存して、条件付きジャンプは、本質的に異なる2つの動作を有する。これは、自明でないtrigger_stateマクロを有する2つのアーキテクチャ記述エントリーによって反映される。例示的な命令はBEQZである。
TRIGGER_IW6 := IW[15:11] = beqz;
TRIGGER_STATE6:= REG[IW[10:8]] /= 0;
UPDATE6,PC := (PC + 2)[7 :0];
VINDEX6,1:= IW[10:8];
No update for REG.
DMEM_IDLE6
ジャンプが起こる
TRIGGER_IW7 := IW[15:11] = beqz;
TRIGGER_STATE7:= REG[IW[10:8]] = 0;
UPDATE7,PC := (PC + IW[7:0])[7 :0];
INDEX7,1:= IW[10:8];
No update for REG.
DMEM_IDLE7
対応情報
パイプラインステージの分類
パイプラインステージの総数は次の通りである。
n = 4
また、デコードは第2のステージにおいて行われる。
dec = 2
ほとんどのアーキテクチャ記述エントリーはジャンプに言及しない。アーキテクチャ記述エントリーの最後の1つのみが、ジャンプが起こることに関係する。また、このジャンプは、第2のステージにおいて、取り消されるステージがステージ1のみであるように決定される。
jmp1 = 1
jmp2 = 1
jmp3 = 1
jmp4 = 1
jmp5 = 1
jmp6 = 1
jmp7 = 2
割り込みはステージ3において受理される。これは、他のすべての命令が割り込みによって取り消されるであろうのに対して、ステージ4の命令が、割り込みによって取り消されないであろうことを意味する。
int = 3
1つのアーキテクチャレジスタファイルREGのみが存在し、データはステージ4から書き戻されるであろう。
writebackREG = 4
プロセッサ内のデータはすべて、ステージ2であるデコードステージにフォワードされる。したがって、この命令がステージ2に存在し、且つ、ステージ2がストールしない場合、命令によって必要とされるデータはすべて有効でなければならない。
vstage1,1 = 2;
vstage1,2 = 2;
vstage2,1 = 2;
vstage2,2 = 2;
vstage3,1 = 2;
vstage4,2 = 2;
vstage5,2 = 2;
vstage6,1 = 2;
vstage7,1 = 2;
ストール条件
例証用のプロセッサは、各ステージ毎に、特定のストール信号を1つも持たない。代わりに、ストール条件がいくつかの信号から構成される。これはストールに関する対応情報によって捕らえられる。この対応情報は、関連するステージが命令を前進させない条件を説明する設計者から得られた。
stall1 := id_stall && id_full;
stall2 := id_stall;
stall3 := mem_stall || stall_i;
stall4 := mem_stall;
取り消し条件
プロセッサは特定の取り消し信号を持たない。さらに、取り消し条件は、単一の信号よりもむしろ、複数の表現によって表現される。
cancel1 := (!id_stall && opcode == beqz && full2) || int_valid_i;
cancel2 := int_valid_i;
cancel3 := 0;
cancel4 := 0;
Full条件
full2 := id_full && !id_squash;
full3 := ex_full;
full4 := ma_full;
開始状態
process_new_instruction_state := true;
プログラムカウンタ
pc := if_pc;
レジスタ
プロセッサはレジスタファイルREGのみを持つ。
result_write_REG3 := ex_full && ex_write_reg && !int_valid_i;
result_write_REG4 := ma_full && ma_write_reg;
result_valid_REG3 := ex_full && !ex_read_from_mem;
result_valid_REG4 := ma_full && !mem_stall;
result_dest_REG3 := ex_dest_reg;
result_dest_REG4 := ma_dest_reg;
result_data_REG3 := ex_result;
result_data_REG4 := real_ma_result;
current_REG(unsigned reg_no) := register[reg_no];
アクセスプロトコル記述
命令メモリアドレスは第1のステージにおいて渡される。
ia = 1
その実行が第2のステージにある場合、命令そのものが到着する。
iv = 2
データメモリとのコミュニケーションは、アドレスを渡すためのステージ3と、読み込みデータを受信するためのステージ4とに分割される。
da = 3
dv = 4
これらマクロは、プロセッサがどのように命令メモリに読み込みを合図し、プロセッサ信号がどのようにデータメモリを読み込む、或いはデータメモリに書き込むかを説明する。
ibus_read(net[] pc) := imem_addr_o == pc;
iw := instruction_word;
dbus_idle := !ex_dmem_enable_o || int_valid_i;
dbus_read(net[] addr) := ex_dmem_enable_o
&& ! ex_dmem_write_o
&& ex_result[7:0] == addr;
dbus_rdata := dmem_data_i;
dbus_write(net[] addr, wdata) := ex_dmem_enable_o
&& ex_dmem_write_o
&& ex_result[7:0] == addr
&& ex_dmem_data_o == wdata;
プロパティ生成
add命令についてのプロパティ生成が、このセクションにおいて述べられる。
対応情報に注目すると、関連する置き換えが以下に与えられるであろう。便利であればどこへでも、直接的な置き換えの結果は、より読み取りやすい形式と共に示される。
trigger_iw1 = ((iw @ t2)[15:11] = add)
= (iw[15:11] @ t2 = add)
trigger_state1 = true;
update1,PC = ((pc @ t1) + 2)[7:0];
update1,REG = ((data_REG2 @ t2)((iw @ t2)[10:8])) +
((data_REG2 @ t2)((iw @ t2)[7:5]))
= (data_REG2(iw[10:8]) + data_REG2(iw[7:5])) @ t2;
index1,REG = (iw @ t2)[4:2]
= iw[4:2] @ t2;
vindex1,1 = (iw @ t2)[10:8];
vindex1,2 = (iw @ t2)[7:5];
アクティビティブロックACT1がDMEM_IDLEを明示する(それは、メモリアクセスがなされないことを意味する)ので、DATA1およびWADDR1についての置き換えは必要ではない。
property add_instruction;
dependencies: no_reset;
for time_points:
t0 = t,
t1 > t0,
t2> t1,
t3> t2,
t4> t3;
assume:
// Describe the slot that is occupied by the instruction
at t0: stall1 = 0 || cancel1 = 1;
during [t0+1, t1-1]: stall1= 1;
at t1: stall1= 0;
during [t1+1, t2-1]: stall2= 1;
at t2: stall2= 0;
during [t2+1, t3-1]: stall3= 1;
at t3: stall3= 0;
during [t3+1, t4-1]: stall4= 1;
at t4: stall4= 0;
// assume that no preceding property cancelled this one
during [t0+1, t1]: cancel1= 0;
during [t1+1, t2]: cancel2= 0;
during [t2+1, t3]: cancel3= 0;
during [t3+1, t4]: cancel4= 0;
// assume that the processor is ready to execute next instruction
at t0: process_new_instruction_state;
// assume that instruction execution is not interrupted.
during [t0+1, t3]: not trigger0;
<fetch> // This is a cutpoint, see ITL section
// Assume that iw contains the instruction
// that should be handled in this property.
at t2: trigger_iw1;
<validate_regs>
at t2: trigger_state1;
prove:
at t1: ibus_read(pc @ t0+1);
<fetch>
// Prove that the virtual register file values are valid
// whenever they are to decide upon trigger_state.
// ... trigger_state does not reference them here.
<validate_regs>
// Prove that the virtual register file values are valid
// whenever they are required.
at t2: validREG,2(vindex1,1);
at t2: validREG,2(vindex1,2);
at t1: process_new_instruction_state;
at t1+1: pc = update1,PC;
// Prove that the full signals are correctly created.
during [t1+1, t2]: full2= 1;
during [t2+1, t3]: full3= 1;
during [t3+1, t4]: full4= 1;
// Prove that this instruction will not initiate cancels.
during [t1+1, t2]: primary_cancel1= 0;
during [t2+1, t3]: primary_cancel2= 0;
during [t3+1, t4]: primary_cancel3= 0;
// For all registers that get updated, prove their correct
// handling in the pipeline.
at t3: if result_validR,3 = 1
then next(result_validR,4) = 1
end if;
during [t2+1, t3]: result_writeR,3 = 1;
during [t3+1, t4]: result_writeR,4 = 1;
during [t2+1, t3]: result_destR,3= index1,R;
during [t3+1, t4]: result_destR,4= index1,R;
during [t2+1, t3-1]: if (result_validR,3 = 1)
then next(result_validR,3) = 1
end if;
during [t3+1, t4-1]: if (result_validR,4 = 1)
then next(result_validR,4) = 1
end if;
during [t2+1, t3]: if (result_validR,3)
then result_dataR,3 = update1,R;
end if;
during [t3+1, t4]: if (result_validR,4)
then result_dataR,4 = update1,R;
end if;
at t4+1: currentR(indexR) = update1,R
// there is no register in this example that does not get updated.
// the architecture description contains DMEM_IDLE
at tda: dbus_idle;
left_hook: t0;
right_hook: t1;
end property;
このプロパティのインスタンス化は、部分的なプロパティadd_instruction.fetchおよびadd_instruction.validate_regsの証明部分を等しくする。それは、部分的なプロパティadd_instruction.validate_regsの証明がスキップされることを意味する。
[BD94] Jerry R. Burch, David L. Dill: Automatic verification of Pipelined Microprocessor Control. CAV 1994: 68-80
[VB00] M. N. Velev and R. E. Bryant. Formal verification of superscalar microprocessors with multicycle functional units, exception, and branch prediction. In DAC. ACM, 2000.
[PJB99] Vishnu A. Patankar, Alok Jain, Randal E. Bryant: Formal Verification of an ARM Processor. VLSI Design 1999: 282-287
[BCBZ02] Sergey Berezin, Edmund M. Clarke, Armin Biere, Yunshan Zhu: Verification of Out-Of-Order Processor Designs Using Model Checking and a Light-Weight Completion Function. Formal Methods in System Design 20(2): 159-186 (2002)
[SCLA+04] Oliver Schliebusch, Anupam Chattopadhyay, Rainer Leupers, Gerd Ascheid, Heinrich Meyr, Mario Steinert, Gunnar Braun, Achim Nohl: RTL Processor Synthesis for Architecture Exploration and Implementation. DATE 2004: 156-160
[SHNB+04] Oliver Schliebusch, Andreas Hoffmann, Achim Nohl, Gunnar Brown, Heinrich Meyr: Method and Apparatus for Translating to a Hardware Description Language from an Architecture Description Language, Patent,
Publication number:WO2004017232
Publication date:2004-02-26
Applicant:COWARE INC (US)
Classification: - international:G06F17/50; G06F17/50; (IPC1-7): G06F17/50 - European: G06F17/50D
Application number:WO2003US25602 20030815
Priority number(s):US20020403882P 20020816; US20030641457 20030814
[BCDM86] Browne, Clarke, Dill, Mishra: Automatic Verification of Sequential Circuits Using Temporal Logic.
[BS01] Bormann, Spalinger: ”Formale Verifkation fur Nicht-Formalisten (Formal Verification for Non-Formalists”, Bormann, J. and Spalinger, C: (2001), Informationstechnik und Technische Informatik, Vol. 43, Issue 1/2001, Oldenburg Verlag.
[FKL03]: Foster, Krolnik, Lacey: Assertion Based Design: Kluwer 2003
[BW99]: Bormann, Warkentin: Verfahren zum Vergleich elektrischer Schaltungen, EP 1068580 B1.
[BB05]: Bormann, Busch: Verfahren zur Bestimmung der Gute einer Menge von Eigenschaften, verwendbar zur Verifikation und zur Spezifikation von Schaltungen, European Patent Application 05 020 124.3
[BB06]: Bruno, Blackmore: Verifying the Tricore2 Multithreaded Microprocessor, Design Con 2006
Claims (27)
- プロセッサを備えるコンピュータにおいて、プロセッサのインプリメンテーション記述とプロセッサのアーキテクチャ記述との等価性をフォーマルに検証する方法であって、
前記プロセッサが前記プロセッサのインプリメンテーション記述を読み込むステップと、
前記プロセッサが前記プロセッサのアーキテクチャ記述を読み込むステップと、
同じ初期値を用いた同じプログラムの実行を通じて、前記アーキテクチャ記述によって記述された前記プロセッサのデータ転送シーケンスが、前記インプリメンテーション記述によって実行された前記プロセッサのデータ転送シーケンスにマッピング可能であることを前記プロセッサがデモンストレートすることにより、マッピングが、全単射であることと、前記アーキテクチャ記述によって記述された前記プロセッサの前記データ転送シーケンスの時間的な順序が、前記インプリメンテーション記述によって記述された前記プロセッサの前記データ転送シーケンスの時間的な順序に対応することとを前記プロセッサが確認する、デモンストレートするステップと、
前記プロセッサが、前記デモンストレートするステップにおける前記インプリメンテーション記述と前記アーキテクチャ記述との等価性の検証の結果を出力するステップとを含み、
前記デモンストレートするステップが、
前記プロセッサが、前記マッピングを可能にする対応情報を読み込むステップと、
前記プロセッサが、前記プロセッサの前記インプリメンテーション記述と、前記プロセッサの前記アーキテクチャ記述と、前記対応情報とから、複数のプロパティを生成するステップと、
生成された前記プロパティを前記プロセッサが検証することにより、生成された前記プロパティのすべてが適合することを証明する、或いは、生成された前記プロパティのうち誤りであるものの少なくとも1つを識別する、検証するステップとを含む、方法。 - 前記アーキテクチャ記述によって記述された前記プロセッサの前記データ転送シーケンスから前記インプリメンテーション記述によって記述された前記プロセッサの前記データ転送シーケンスへの前記マッピングが、同じデータがデータメモリの同じアドレスから転送されること、或いは、同じデータがデータメモリの同じアドレスへ転送されることを確認する請求項1の方法。
- 前記インプリメンテーション記述によって記述された前記プロセッサの前記データ転送シーケンスが、アクセスプロトコル記述によって記述される請求項1又は2の方法。
- 前記デモンストレートするステップが、
マッピングされた割り込み信号を有する前記アーキテクチャ記述によって記述された前記データ転送シーケンス信号のマッピングが、前記割り込み信号によって影響を受ける前記インプリメンテーション記述によって記述された前記データ転送シーケンスに対応するために、前記同じプログラムの実行を通じて、前記インプリメンテーション記述の割り込み信号の動作が、前記アーキテクチャ記述の割り込み信号の動作にマッピング可能であることを前記プロセッサがデモンストレートする請求項1の方法。 - 前記デモンストレートするステップが、
前記プロセッサが、読み込んだ前記対応情報を使用する複数のデモンストレーションステップを生成するステップを含み、前記デモンストレーションステップのうちの1つが、前記同じプログラムのサイクルの実行後の、アーキテクチャ記述とインプリメンテーション記述との対応を検証する請求項1に係る方法。 - 前記アーキテクチャ記述および前記インプリメンテーション記述の等価でないペアについて誤った検証を出力しないように、前記プロセッサが前記対応情報を使用する請求項1〜5のいずれか一項に係る方法。
- 前記対応情報が、前記インプリメンテーション記述の、1つ又は複数のパイプラインステージのストール条件を含む請求項1〜6のいずれか一項に係る方法。
- 前記対応情報が、前記インプリメンテーション記述の、1つ又は複数のパイプラインステージの取り消し条件を含む請求項1〜6のいずれか一項に係る方法。
- 前記対応情報が、前記インプリメンテーション記述の、1つ以上のパイプラインステージの分類を含む請求項1〜6のいずれか一項に係る方法。
- 前記対応情報が、前記インプリメンテーション記述からプログラムカウンタを読み込むための関数を含む請求項1〜6のいずれか一項に係る方法。
- 前記対応情報が、前記インプリメンテーション記述のインプリメンテーションレジスタ内の値を、前記アーキテクチャ記述の対応するアーキテクチャレジスタにマッピングするための、1つ以上の仮想レジスタを含む請求項1〜6のいずれか一項に係る方法。
- 1つ以上の前記仮想レジスタが、命令シーケンスの順番で、前記インプリメンテーション記述の1つ以上のパイプラインステージをテストするための関数であり、1つ以上の前記仮想レジスタが、関連するデータを持つ1つ以上の前記パイプラインステージのうちの1つから、少なくとも1つのパイプライン値を返し、1つ以上の前記パイプラインステージの何れもが関連するデータを持たない場合、1つ以上の前記仮想レジスタが、対応する前記アーキテクチャレジスタを実行する前記インプリメンテーションレジスタの値を返す請求項11に係る方法。
- 1つ以上の前記仮想レジスタが、1つ以上のサブ関数から生成された関数である請求項12に係る方法。
- 前記仮想レジスタが仮想レジスタファイル内に組織される請求項11〜13の1の請求項に係る方法。
- 前記デモンストレートするステップがさらに、前記同じプログラムのそれぞれのサイクルが、インプリメンテーションクロックサイクルの有限数によって実行されることを前記プロセッサが確認する請求項1に係る方法。
- 前記同じプログラムの前記サイクルが、命令又は割り込みを含む請求項15に係る方法。
- プロパティを生成する前記ステップが、
前記プロセッサが、1つ以上のプレースホルダーを含むプロパティスキーマにアクセスするステップと、
前記プロセッサが、1つ以上の前記プレースホルダーを、前記対応情報からの値に置き換えるステップとを含み、それによって、少なくとも1つの生成されたプロパティを前記プロセッサが生成する請求項1〜16のいずれか一項に係る方法。 - 生成された前記プロパティのうち誤りであるものの少なくとも1つの前記識別を停止する請求項1〜17のいずれか一項に係る方法。
- 生成された前記プロパティのサブセットが作成され、前記サブセットのメンバプロパティのそれぞれが、インプリメンテーションサイクルのうちの1つの実行を記述する請求項1〜18のいずれか一項に係る方法。
- 前記インプリメンテーションサイクルが、前記インプリメンテーション記述によって実行される命令、もしくは前記インプリメンテーション記述によって実行される割り込みのいずれかである請求項19に係る方法。
- インプリメンテーションサイクルのそれぞれについて、前記インプリメンテーションサイクルを記述する少なくとも1つのプロパティが存在する請求項19又は20に係る方法。
- 生成された前記プロパティの前記サブセットが、前記インプリメンテーションサイクルの前記実行の結果として、1つ以上の仮想レジスタの変化を指摘する請求項19〜21のいずれか一項に係る方法。
- 生成された前記プロパティの前記サブセットが、
どのように前記インプリメンテーションが命令を要求し、いつどのように前記インプリメンテーションがプログラムカウンタを変更するのか;
いつどのようにパイプライン中の命令が取り消されるのか;
いつ、前記インプリメンテーション記述のどの前記データ転送が、前記インプリメンテーションによって実行されるのか;
を検証するためのプロパティから構成され、
前記命令の前記実行に引き続き、前記インプリメンテーションが、さらなるインプリメンテーションサイクルを実行する状態にある請求項19〜22のいずれか一項に係る方法。 - 前記結果が、
生成された前記プロパティのすべての証明の表示、
前記アーキテクチャ記述と前記インプリメンテーション記述との前記等価性の確認、
生成された前記プロパティのうちの1つが誤りであることの表示、或いは、
生成された前記プロパティのうち誤りであるもののリストのいずれかである請求項1〜23のいずれか1の請求項に係る方法。 - 前記同じプログラムが命令メモリ内にある請求項1〜24のいずれかの請求項に係る方法。
- 前記アーキテクチャ記述が、プロセッサのアーキテクチャ記述であり、前記インプリメンテーション記述が、プロセッサのインプリメンテーション記述である請求項1〜25のいずれか1の請求項に係る方法。
- 前記インプリメンテーション記述を読み込む前記ステップが、前記プロセッサが前記インプリメンテーション記述の最初の部分を読み込むことを含み、
前記アーキテクチャ記述を読み込む前記ステップが、前記プロセッサが前記アーキテクチャ記述の最初の部分を読み込むことを含み、
前記プロセッサが、前記インプリメンテーション記述の前記最初の部分と前記アーキテクチャ記述の前記最初の部分との前記等価性を検証するための前記対応情報を使用して、且つ、前記等価性がデモンストレートされる場合に、前記プロセッサが、前記インプリメンテーション記述の残りの部分と前記アーキテクチャ記述の残りの部分とを読み込む請求項1〜26のいずれか一項に係る方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/275,557 US8359561B2 (en) | 2007-12-06 | 2008-11-21 | Equivalence verification between transaction level models and RTL at the example to processors |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
EP06026062.7 | 2006-12-15 | ||
EP06026062 | 2006-12-15 |
Publications (3)
Publication Number | Publication Date |
---|---|
JP2008181490A JP2008181490A (ja) | 2008-08-07 |
JP2008181490A5 JP2008181490A5 (ja) | 2012-09-20 |
JP5379376B2 true JP5379376B2 (ja) | 2013-12-25 |
Family
ID=39725319
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007315517A Active JP5379376B2 (ja) | 2006-12-15 | 2007-12-06 | プロセッサの例におけるトランザクションレベルモデルとrtlとの間の等価性検証 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP5379376B2 (ja) |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5243538B1 (en) * | 1989-08-09 | 1995-11-07 | Hitachi Ltd | Comparison and verification system for logic circuits and method thereof |
JPH0822485A (ja) * | 1994-07-11 | 1996-01-23 | Mitsubishi Electric Corp | 論理等価性検証方法およびその装置 |
JP4099974B2 (ja) * | 2001-10-30 | 2008-06-11 | 日本電気株式会社 | 動作レベル記述とレジスタ転送レベル記述間の等価性検証方法及び装置並びにプログラム |
JP4147842B2 (ja) * | 2002-07-04 | 2008-09-10 | 日本電気株式会社 | 論理検証システム及び方法、論理コーン抽出装置及び方法、論理検証及び論理コーン抽出プログラム |
JP2004145712A (ja) * | 2002-10-25 | 2004-05-20 | Matsushita Electric Ind Co Ltd | 半導体設計における動作記述の等価性検証方法 |
JP2004213605A (ja) * | 2002-11-15 | 2004-07-29 | Fujitsu Ltd | 論理等価検証装置 |
JP2005316595A (ja) * | 2004-04-27 | 2005-11-10 | Fujitsu Ltd | 回路記述間の等価性検証方法および回路記述間の等価性検証プログラム |
-
2007
- 2007-12-06 JP JP2007315517A patent/JP5379376B2/ja active Active
Also Published As
Publication number | Publication date |
---|---|
JP2008181490A (ja) | 2008-08-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8359561B2 (en) | Equivalence verification between transaction level models and RTL at the example to processors | |
Kern et al. | Formal verification in hardware design: a survey | |
US7533294B2 (en) | Functional coverage driven test generation for validation of pipelined processors | |
Herdt et al. | Enhanced Virtual Prototyping | |
US11734480B2 (en) | Performance modeling and analysis of microprocessors using dependency graphs | |
Brady et al. | ATLAS: automatic term-level abstraction of RTL designs | |
Sawada | Formal verification of an advanced pipelined machine | |
Kühne et al. | Automated formal verification of processors based on architectural models | |
Sawada et al. | Verification of FM9801: An out-of-order microprocessor model with speculative execution, exceptions, and program-modifying capability | |
Tahar et al. | A practical methodology for the formal verification of RISC processors | |
Brylow et al. | Deadline analysis of interrupt-driven software | |
Wunderlich et al. | In-system FPGA prototyping of an Itanium microarchitecture | |
JP5379376B2 (ja) | プロセッサの例におけるトランザクションレベルモデルとrtlとの間の等価性検証 | |
EP1933245A1 (en) | Equivalence verification between transaction level models and RTL examples of processors | |
Hosabettu et al. | Formal verification of a complex pipelined processor | |
Hunt et al. | Verifying the FM9801 microarchitecture | |
Hosabettu et al. | A proof of correctness of a processor implementing Tomasulo’s algorithm without a reorder buffer | |
EP2088521B1 (en) | Method for verifying | |
Tverdyshev | A verified platform for a gate-level electronic control unit | |
Pierre | Auxiliary Variables in Temporal Specifications: Semantic and Practical Analysis for System-Level Requirements | |
Loitz et al. | Complete verification of weakly programmable ips against their operational isa model | |
Hillebrand et al. | Formal verification of gate-level computer systems | |
Villarraga | Formal Verification of Firmware-Based System-on-Chip Modules | |
Meier et al. | MIPS-to-Verilog, Hardware Compilation for the eMIPS Processor | |
Li et al. | Proving the correctness of the interlock mechanism in processor design |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20101122 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20120207 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20120507 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20120510 |
|
A524 | Written submission of copy of amendment under article 19 pct |
Free format text: JAPANESE INTERMEDIATE CODE: A524 Effective date: 20120803 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20121204 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20130404 |
|
A911 | Transfer to examiner for re-examination before appeal (zenchi) |
Free format text: JAPANESE INTERMEDIATE CODE: A911 Effective date: 20130605 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20130806 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20130809 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20130903 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20130927 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 5379376 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
S531 | Written request for registration of change of domicile |
Free format text: JAPANESE INTERMEDIATE CODE: R313531 |
|
S533 | Written request for registration of change of name |
Free format text: JAPANESE INTERMEDIATE CODE: R313533 |
|
R350 | Written notification of registration of transfer |
Free format text: JAPANESE INTERMEDIATE CODE: R350 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
S531 | Written request for registration of change of domicile |
Free format text: JAPANESE INTERMEDIATE CODE: R313531 |
|
S533 | Written request for registration of change of name |
Free format text: JAPANESE INTERMEDIATE CODE: R313533 |
|
R350 | Written notification of registration of transfer |
Free format text: JAPANESE INTERMEDIATE CODE: R350 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |