抽象- In-OrderスカラーRISCアーキテクチャは、20年にわたってFPGAソフトプロセッサ設計の支配的 ry ? ry 順序外スーパスカラ ry 。 従来のアウトオブオーダスーパスカラ実装は、競合領域または絶対性能を示さなかった。 本稿では、EDGE(Explicit Data Graph Execution)命令セットアーキテクチャを利用して、高速かつエリア効率の優れた順序外のスーパースカラソフトプロセッサを構築 ry 。 EDGEマイクロアーキテクチャ、特にそのデータフロー命令スケジューラを慎重にマッピングすることにより、アウトオブオーダFPGA ry 実証します。 2つのスケジューラ設計の選択肢が比較されます。 索引用語 - 明示的データグラフ実行(EDGE); ハイブリッドフォンノイマンデータフロー; FPGAソフトプロセッサ 0106>>1052018/08/12(日) 19:02:06.08ID:ltAhnLdz?2BP(0) 1. 前書き
設計の生産性は、リコンフィギュラブル ry の課題 ry ? ワークロードをゲートに移植し、 ry 。 ワークロードをゲートに移し、10^2〜10^4秒のビットストリーム再設計の設計反復に耐えるのは高価です。 ソフトプロセッサアレイオーバーレイは、これらのコストを軽減 ry ? 高価な初期ポートは、ソフトプロセッサーを対象 ry 。 コストがかかる最初の移植は、ソフトプロセッサを対象とした単純なクロスコンパイルとなります。ほとんどのデザインターンは、迅速な再コンパイルです。 ? ry 、または相互接続 として公開されているカスタムハードウェア ry 。 アプリケーションのボトルネックは、新しい命令、機能ユニット、自律アクセラレータ、メモリ、または相互接続の公開済機能を持つカスタムハードウェアにオフロードできます。 ? 異種のFPGA ry 相補的な有用性 ry 。 ヘテロジニアス FPGA とハードARMコアの出現は、ソフトコアの相補的有用性を低下させません。 FPGAの容量が倍増 ry ソフトプロセッサも倍増します。 ? いくつかのハード・プロセッサーが一致しないスループット ry 。 中規模のFPGAは現在、何百ものソフトプロセッサとそのメモリ相互接続ネットワー ry 。そのような超並列プロセッサとアクセラレータアレイ(MPPAA)は、サイクルごとに数百のメモリアクセスとブランチ -- 一部のハードプロセッサを越えるスループッ ? ry 20年後にはほとんど変わりません。 汎用ソフトプロセッサーのマイクロアーキテクチャーは20年間余り変わっていません。 ? ry インラインパイプライン型スカラーRISC ry 。 Philip Freidinの16ビットRISC4005(1991)は、j32、xr16、NIOS、MicroBlaze [1] -- [4]のように、インオーダパイプライン型スカラ RISC であり、最新バージョンと同様です。 何年もの間、ソフトプロセッサは命令レベルの並列性を高めるためにキャッシュ、分岐予測器、 ry 、基本的なスカラーRISCマイクロアーキテクチャが依然として支配的です。 ? ry と1つのライト/サイクルLUT RAM ry 。 これは、この単純なマイクロアーキテクチャと、 ry FPGAプリミティブ要素、特にLUTとライトパーサイクル LUT RAM との間の良好な適合を反映しています。 残念なことに、このようなアーキテクチャでキャッシュミス ry 、実行は停止 ry 。 0107>>1062018/08/12(日) 19:05:50.98ID:ltAhnLdz?2BP(0) ? ry ソフトプロセッサの代わりにVLIW [5]、[6]またはベクトル[7]、[8]コア。 より高い命令レベル並列(ILP)マイクロアーキテクチャをターゲットとする設計研究は、典型的には、アウトオブオーダー(OoO)[9] -- [11]ソフトプロセッサコアの代替としてのVLIW [5]、[6]またはベクトル[7]、[8] アーキテクチャを挙げれます。 スーパースカラOoOマイクロアーキテクチャの問題は、レジスタの名前を変更し、命令をデータフロー順にスケジューリングし、誤特定した後にクリーンアップし、正確な例外のために結果を順序通りにリタイアさせるために必要な機械の複雑さです。 ? これは、 ry 多数ポートCAM、 ry 、これらのすべてがFPGAで面積が集中する。 これにより、深い多ポートレジスタファイル、データフロー命令スケジューリングウェイクアップのための多ポートCAM、および多くのワイドバスマルチプレクサおよびバイパスネットワークなどの高価な回路を必要とし、これらのすべてがFPGAの面積消費を加速する。 ? ry 、マルチリード、マルチライトRAMは、レプリケーション、 ry 。 例えば、マルチリード、マルチライトRAMは、転送形態の混在、マルチサイクル動作、クロックダブリング、バンクインターリーブ、ライブバリューテーブル、その他の高価な技術を必要とします。 ? 現在の作業は、 この度の取組は、複雑さとオーバーヘッドのほとんどを伴わずに、高いILP OoOスーパースカラソフトプロセッサを構築 ry 、面積とエネルギー効率の高い高ILP実行 ry 明示的データグラフ実行(EDGE)[12]、[13]命令セットアーキテクチャを実装 ry
1
? ry 、順不同のプロセッサーをインライン・スカラーRISCより ry 。 EDGEアーキテクチャーとそのコンパイラーは、レジスタの名前変更、CAM、複雑さを払拭し、アウトオブオーダプロセッサーをインオーダスカラ RISC よりも数百LUTだけ有効にします。 ? ry が、今日のFPGA上で一般的なインオーダRISCとどのように似ているかを解説します。 本稿では、 ry EDGEマイクロアーキテクチャと、今日のFPGA上で一般的なインオーダRISCとの共通性を解説します。 重要な課題と論文の主な貢献点は、FPGAに小型で高速なデータフロー命令スケジューラを構築する方法です。 最小面積のEDGEソフトプロセッサを開発する途中で、2つの代替FPGA実装を開発して対比 ry 。 0108yamaguti2018/08/12(日) 19:10:26.37ID:ltAhnLdz?2BP(0) http://rio2016.2ch.net/test/read.cgi/future/1489922543/184-2160109>>1072018/08/12(日) 19:11:09.35ID:ltAhnLdz?2BP(0) II. EDGE の概要
? オペラのバッファ オペランドバッファ 32 x 32 LUT-RAMS 0115>>1142018/08/12(日) 19:19:00.60ID:ltAhnLdz?2BP(0) EX EX パイプラインの REGS
EX TS
OPS0 32x32
×
LS ロード/ストア キュー
データキャッシュデータ nK x 32 ブロック RAM
LS PIPELINE REGS
×2
REGISTER FILE 32 x 32 LUT-RAM
? ry 2つのデコード、シングル発行の ry 。 図3: 2 デコード、シングルイシューのEDGEマイクロアーキテクチャ。 0116>>1152018/08/12(日) 19:20:48.94ID:ltAhnLdz?2BP(0) A. マイクロアーキテクチャ 図3は、コンパクトEDGEプ ry 例 ry >>114-115>>114>>115 ? ry 、およびメモリ/データキャッシュアクセスを含む命令およびデータキャッシュおよび5段階パイプライン(従来のインオーダスカラーRISC) LS)。 これは、命令フェッチ(IF)、デコード(DC)、オペランドフェッチ、実行(EX)、およびメモリ/データキャッシュアクセス ( LS ) を含む I/D キャッシュおよび5段階パイプラインを持つほぼ従来型のインオーダスカラ RISC です。 ? ry 読み出されます。 インオーダ・プロセッサとは異なり、命令オペランドはレジスタ・ファイルではなくオペランド・バッファから読出され、 ? ry データフローの 又データフローの順序で次に実行する命令は、IS(発行)パイプラインステージによって決定されます。 これは、データフロー命令スケジューラと、デコードされた命令バッファと、オペランドバッファとを含む命令ウィンドウを使用する。 ? 単純な ry プログラム命令 ry 。 その際に単純なロードストアキューを使用してプログラムされた順の通りのメモリ命令群を発行します。 フロントエンド(IF、DC)はバックエンド(IS、EX、LS)から切り離 ry 。クロックごとに2つの命令をフェッチし、命令ウィンドウにデコードします。 命令ウィンドウのデータフロースケジューラは、各デコードされた命令の入力すなわち ? その述語とオペランド。 その述語とオペランドのレディステートを保持します。 ? 準備完了状態になると、 ry 。 すべての入力(ある場合)がレディ状態になると、命令は起動し、発行準備が整います。 最も低い番号のレディ命令IIDが各サイクルで選択され、そのデコードされた命令および入力オペランドが読 ry 。データマルチプレクサとファンクションユニット制御信号のほかに、この命令は最大2つのレディイベントをエンコードします。 ? ry および/またはイベント ry 準備状態を更新する。 スケジューラは、これらの and/or イベントを他のソース(T0およびT1に多重化)から受け取り、ウィンドウ内の他の命令のレディ状態をアップデートする。 このようにして、データフローの実行が開始され、ブロックのレディ0入力命令、次にこれらがターゲットとする命令など ry 。 0117>>1162018/08/12(日) 19:21:49.32ID:ltAhnLdz?2BP(0) B. EDGEデータフロー命令のスケジューリング要件 ? ry、コアのリンチピンです。 命令ウィンドウとスケジューラは、コアの鎹です。 それらの領域、クロック周期、能力、および制限によって、EDGEコアの実現性能と ry が大きく左右されます。
2
命令スケジューラは、多様な機能と要件を備えています。 ? ry 同時です。 それは非常に同時並行的です。 ? ry 、デコーダは、命令をデコードし、デコードされた ry 。 各サイクルにおいて、デコーダは、デコードされたレディ状態及びデコードされた命令をウィンドウに書き込む。 ? ry バックエンドは準備完了イベント ry 。 各サイクルで、スケジューラは発行する次の命令を選択し、それに応答してバックエンドはレディイベント -- 特定の命令の入力スロット(述語、オペランド#0、オペランド#1)をターゲットとするターゲットレディイベント、またはブロードキャストIDで待機しているすべての命令をターゲットとしたブロードキャストレディイベントのいずれかを送信します。 これらは命令毎のアクティブレディ状態ビットをセットし、デコード済みレディ状態と共に命令が発行可能であることを知らせる。 ? ry を受け付け、発行されたレディ命令の再発行を禁止する必要があることに注意してください。 スケジューラは、まだデコードされていないターゲット命令のイベントを受付けるので、発行されたレディ命令の再発行を禁止 ry ? ry 、または述語の真または偽である可能性 ry 。 EDGE命令は、述語ではないか、又は true か false という述語である可能性があります。 ? ry 、別の命令の述語結果によって ry 。 述語化された命令は、別の命令の述語評価結果によってターゲットにされ、その結果が述語条件と一致するまで、準備ができません。 ? ry 発行しません。 述語が一致しない場合、命令は決して発行されません。 0118>>1172018/08/12(日) 19:24:42.29ID:ltAhnLdz?2BP(0) 新しいブロックへの分岐では、すべての命令ウインドウレディ状態がフラッシュクリアされる(ブロックリセット)。 しかし、ブロックがそれ自身に分岐すると(ブロックリフレッシュ)、アクティブレディ状態のみがクリアされ、 デコードされたレディ状態は保存されるので、 ry 再フェ ry 必要はない。 ry 節約するための鍵です。 ソフトウェアクリティカルパスの一部は、依存する命令の1つのチェーン ( 例 ? ry 、連続するバックツーバック命令ウェイクアップのためにパイプラインバブルを追加しないことが重要です。 A → B → C と順にターゲット ) で構成されており、データフロースケジューラは、連続するバックツーバック命令の起動の為のパイプラインバブルを追加しない点は重要です。 ? ry レディ・イグジット・ターゲット・レディ・パイプラインの再発行は、クロック・サイクルに深刻 ry したがって、ISステージのレディ・イシュー・ターゲット・レディ・パイプラインの再発行は、クロック周波数に深刻な影響を与えないと仮定すると、1サイクル ry ADDのような命令は、1サイクルの待ち時間を有する。 ? ry 、スケジューラはターゲットステージの命令をISステージでウェイクさせることができます。 EXステージの結果転送では、命令が完了する前であっても、スケジューラはISステージでターゲットがターゲットする命令を起動させることができます。 他の命令の結果は、ALUの比較を待つか、複数のサイクルを取るか、または未知の待ち時間 ry ? これらは後で目標を起こすまで待たなければなりません。 これらの場合はターゲットを後で起動する様にウェイトせねばなりません。 0119>>1182018/08/12(日) 19:27:23.26ID:ltAhnLdz?2BP(0) ? ry 、予想されるEDGE実装のスペクトルにわたってスケーラブルでなければなりません。各サイクルは、 ry 、1サイクルあたり1〜2の命令を発行します。 最後に、スケジューラ設計は、予想されるEDGEのスペクトル実装にわたってスケーラブル -- 各サイクルは、少なくとも1〜4のデコードされた命令と2〜4つのターゲットレディイベントを受入れ、1サイクルあたり1〜2の命令を発行します -- でなければなりません。 2つの代替的なデータフロー命令スケジューラ設計を考える: ? ry 、各命令のレディステータスが各サイクルで再評価されます。 FPGAのDフリップフロップ(FF)で命令のレディ状態が明示的に表現されているブルートフォース並列スケジューラでは、各命令のレディステータスが各サイクルで再評価されます。 ? よりコンパクトなインクリメンタルスケジューラで、 ry 。 そしてよりコンパクトなインクリメンタルスケジューラでは、LUT RAMにレディ状態を保持し、1サイクルあたり2〜4ターゲット命令のみのレディステータスを更新します。 0120yamaguti2018/08/12(日) 19:28:42.23ID:ltAhnLdz?2BP(0) http://rio2016.2ch.net/test/read.cgi/future/1489922543/184-2160121>>1192018/08/12(日) 19:29:15.90ID:ltAhnLdz?2BP(0) C. 並列命令スケジューラ
BID T1 T0 ENs
31 ... 3 DBID DRT DRF DR0 DR1
NEXT RDYS RDY RT RF R0 R1 INH
2 1 0
DEC.RDYS リセット RESETv リフレッシュ
32→(5,1) ? 優先エンコーダ 優先度エンコーダ
IID,V
図4: エントリ#2をより詳細に示す、並列データフロースケジューラのブロック図。 0122>>1212018/08/12(日) 19:30:35.06ID:ltAhnLdz?2BP(0) 図4は、図3の命令ウィンドウのための並列命令スケジューラを示す。 >>121 ? アクティブ準備完了状態は、ターゲット準備完了イベントT0、T1および ry )によって設定され、 ry 。 アクティブレディステートは、ターゲットレディイベントT0、T1及びブロードキャストID BID(存在する場合)によってセットされ、さまざまな入力タイプによって修飾されてENをイネーブルにすることに注意してください。 ? ry 、1命令準備回路のインスタンス ry 。 32エントリウィンドウの場合、1命令分の回路のインスタンスが32個あります。 どのサイクルにおいても、32個のRDY信号のうちの1つ以上がアサートされてもよい。 ? ry 、これを発行する次の命令の5ビットIIDに縮小する。 32ビット優先度エンコーダは、これを次の発行される命令の5ビットIIDに縮小する。 各エントリに対して、復号されたレディ状態の6ビットがあり、 ? すなわち、それらは命令デコーダによって初期化される。 それらは、例えば次の様に命令デコーダによって初期化される :
? ry 符号化し、恐らくブロードキャストチャネルを介して述語および/またはいくつかのオペランドを待つか、 ry 。 これらのビットはともに、命令がデコードされたかどうかを符号化し、述語および/またはいくつかのオペランドを恐らくブロードキャストチャネルを介して待つか、またはすぐに発行する準備ができているかどうかをエンコードする。 これらのビットは、ブロック・リセット時にのみクリアされます。 0123>>1232018/08/12(日) 19:32:45.64ID:ltAhnLdz?2BP(0) ? アクティブ・レディ状態の ry : アクティブレディステータスの6ビットもあります:
リスト1:並列スケジューラー `` next readys ''ロジック 0129>>1282018/08/12(日) 19:46:50.84ID:ltAhnLdz?2BP(0) リスト1は、N-entry並列スケジューラー用の `` next readys ''を生成するVerilogです。 >>128 4つのレディ・イベント入力タイプ(述部真、偽、オペランド#0、オペランド#1)がありますが、 ? ry 、真/オペランド#1ターゲットから偽/オペランド#0ターゲットを区別するのに単一のターゲットインデックスビットで十分である。 述部ターゲットイベントがオペランドターゲットイベントと同じサイクルで発生しないことを保証することによって、真/オペランド#1ターゲットと偽/オペランド#0ターゲットを区別する為のターゲットインデックスビットは一つで済む。 ? N = 32エントリの命令ウィンドウの場合、T0とT1は6ビット{入力#1:0}である(すなわち、特定の{RT / RF / R0 / R1} . ? IID:5}。 (特定の{RT / RF / R0 / R1} EN がイネーブル化する事によってデコーディングが促進される ) すなわち、 N = 32エントリの命令ウィンドウの場合、T0とT1は6ビット{入力#1: IID:5}である。 ? ry (ターゲット0の入力0等)は、ブロードキャスト選択デコーダB ry 。 ターゲットデコーダT00、T01、T10、T11(ターゲット0の入力0 、等)は、放送選択デコーダBと同様に、それぞれ6-LUTである。 ? ry 、現在アクティブでデコードされたレディステートでターゲットデコーダ出力を一緒にフォールドします。 次のアクティブレディ状態ロジックは、現在アクティブかデコードされたレディステートでターゲットデコーダ出力を一緒に畳みます。 これにはさらに7つのLUT(INH_NXTでは2つ)が必要で、合計32 * 12 = 384のLUTが必要です。 これは、32エントリスケジューラを偶数および奇数命令の2つの16エントリバンクに分割 ry 改善 ry ? ある銀行内では、4ビットの銀行IIDで十分である。 1 つのバンクに付き、4ビットのバンク IID で十分である。 ? ry 、T5、T10、T11は2つの5,5-LUT、 ry 。 次に、T0、T1は5ビットに狭くなるので、T00、T01、T10、T11は2つの5,5-LUT、INH_NXTは1つの6-LUT、または2 * 16 *(3 + 6)= 288のLUTに収まります。
4 0130>>1292018/08/12(日) 19:49:12.10ID:ltAhnLdz?2BP(0) ? ry :LUTまたはキャリーロジックまたはツリー、キャリーロジックゼロスキャン、および ry ワンショット変換を含む、多くの32ビットエンコーダデザインが評価されました。 優先順位エンコーダ:LUTまたはキャリーロジックの OR ツリー、キャリーロジックのゼロスキャン、およびF7MAP / F8MAPマルチプレクサを使用したワンホット変換を含む、多くの32ビットエンコーダデザインが評価検討されました。 ? ry 、2つのLUT遅延で完了する。 現在の設計では、バンク当たり2つの16→4エンコーダを使用し、2つの LUT の遅延で完了する。 ワン・イシュー・プロセッサでは、後続の2:1マルチプレクサがこれらのエンコーダ出力の1つを選択します。 特に、各16ビットエンコーダ入力I [15:0]はI [15]、I [14:10]、I [9:5]、I [4:0]にチャンクされる。 ? 各5ビットグループは32x4 LUT ROMにインデックスを付け、そのグループのエンコーダ出力を事前計算します。 各5ビットグループはそのグループのエンコーダ出力を事前計算してある 32x4 LUT ROM をインデックスします。 ? 3つの5ビットゼロコンパレータ出力とともに、 ry 。 5ビットゼロコンパレータ出力 3 つは共に、3つのグループがすべてゼロのときに 'b1111'を出力するカスタム4ビット3:1セレクタに供給されます。 ? ry RPM(Relativeally配置されたマクロ) ry 。 技術マッピングとフロアプランニング: このデザインではRPM(関連配置マクロ)手法を使用してエリアと相互接続の遅延を改善し、モジュール構成と大規模な複製で簡単なルーティングとタイミングクロージャのための繰り返し可能なレイアウトを実現します。 構造RTLはモジュールをインスタンス化し、それらをスケジューラにタイルします。 6入力モジュール上のXST注釈(* LUT MAP = "yes" *)は、そのロジックを1つのLUTにロックします。(* RLOC = "XxYy" *)は、FPGAプリミティブをクラスタにパックし、相互に相対的にクラスタを配置します。 0131yamaguti2018/08/12(日) 19:51:29.03ID:ltAhnLdz?2BP(0) http://rio2016.2ch.net/test/read.cgi/future/1489922543/184-2160132>>1302018/08/12(日) 19:51:58.10ID:ltAhnLdz?2BP(0) 図5: 並列スケジューラのFPGA実装
? ry 、およびデコードされた命令バッファ ry 。 図5は、スケジューラ、プライオリティエンコーダ、およびデコード済命令用バッファを含む図4のザイリンクス7シリーズの実装であり、クリティカルパスが白 ry FPGAスライスの2つの水平な行はそれぞれ、命令ウィンドウの4つのエントリに対応します。 左から右へ:
? 右側には、複数の32x6ビットトゥルーデュアルポートLUT RAMに実装された、合成された優先エンコーダとマルチプレクサ(青)とデコードされた命令バッファ(白) ry 。 右側には、合成された優先度エンコーダとマルチプレクサ(青)と、複数の 32 x 6 ビットトゥルーデュアルポート LUT RAM に実装されたデコード命令用バッファ(白 ry ? ry デコード済命令LUT RAM、 ry 。 パフォーマンス:Kintex-7 -1スピードグレードでは、クリティカルパスにRDYクロックトゥーアウト、プライオリティエンコーダ、マルチプレクサ、デコードされた命令LUT RAM、次のreadysロジック、RDYセットアップを含む5.0 nsが必要です。 相互接続遅延はクリティカルパスの85%です。残念ながら、RDYからRDYまでのすべてのパスは、比較的大きな直径のネットリストを通過 ry ? ry バックツーバック問題(連続サイクルで) ry 。 スケジューラクリティカルパス(命令バッファLUT RAMの出力ポート)の途中でパイプラインレジスタを追加することにより、サイクルタイムを2.9nsに短縮することができますが、 これは、単一の従属命令チェーンのバックツーバックイシュー(連続サイクルで)を達成することはできません。 0133>>1312018/08/12(日) 19:52:35.34ID:ltAhnLdz?2BP(0) ? ry 準備完了状態 E. 増分データフロースケジューラレディー状態 並列スケジューラは簡単ですが、32x12bのレディステート(LUT RAMの数少ないLUT)を維持するために何百ものLUTとFFを消費し、命令ウィンドウのサイズが2倍になるとこの領域も2倍になります。 ? また、発行された各命令が多くても2つの他の準備完了状態に影響を与えても(ブロードキャストにもかかわらず)、各命令の次のreadys LUTの各サイクルはすべての命令の準備を再計算します。 又、発行された各命令が大抵 2 つの他のレディー状態に影響を与えても(ブロードキャストにもかかわらず)、LUT での各レディーは次の各サイクルで全ての命令のレディーステートを再計算させます。 ? ? ry 、キュー内のレディ命令のフロンティアを維持し、 ry 。 対照的に、インクリメンタルスケジューラは、LUT RAMでデコードされたアクティブレディ状態を保持し、キュー内のレディ命令のフロンティアを整備し、1サイクルあたりわずか2〜4ターゲット命令のレディステータスを評価します。
ARDYSS WA ← EVT_IID RA ← EVT_IID I ← READYLOGIC ARDYS_NXT O → READYLOGIC DRDYS
DVS ← RESET O → READYLOGIC DV WA ← DRDYSS WA RA ← DRDYSS RA
AVS ← RESETvREFRESH WA ← ARDYSS WA RA ← ARDYSS RA O → READYLOGIC AV
READY LOGIC READY → DV ← DVS O DRDYS ← DRDYSS O AV ← AVS O ARDYS → ARDYSS O ARDYS_NXT → ARDYSS I EVT_RDYS ← EVT_RDYS 0136>>1352018/08/12(日) 19:57:14.42ID:ltAhnLdz?2BP(0) ? ry :準備状態、検証、および準備論理。 (a)設計:レディー状態、検証、およびレディーロジック。
? ry ・バンクの競合が存在する可能性があります。 EDGEコンパイラは、命令の両方のターゲットがディスジョイント・バンクにあることを保証するわけではないため、スケジューラ・バンクの競合が発生する可能性 ry 。 ADD命令は、命令10のオペランドと命令12のオペランドを対象 ry ? ry できないため、1つのイベントが処理され、もう1つのイベントが後のサイクルでキューに入れられます。 同じサイクルで2つの偶数バンク・ターゲットのアクティブ・レディ状態を更新することはできないため、 1 つのイベントが処理された後のサイクルで、もう 1 つのイベントがキュー ry 0139>>1382018/08/12(日) 20:01:53.31ID:ltAhnLdz?2BP(0) F. インクリメンタルなデータフロースケジューラの設計、運用、実装 スケジューラのコア(図7)は次のように構成されています。