コンピュータアーキテクチャ実験1

コンピュータアーキテクチャ実験1

1. 実験目的

RISC-V 命令実行のデータ フローと制御信号を理解し、命令パイプラインの動作プロセスに精通します。

2. 実験プロセス

1.RISC-V関連命令

実験シミュレータでは RISC-V 命令セットを使用していますが、その後の解析を容易にするために、まず実験で使用する RISC-V 命令を学習してください。

基本的な RISC-V は 32 ビットの固定長命令を使用します。ただし、標準の RISC-V エンコード モードは可変長命令をサポートし、16 ビット命令を使用できます。これらの命令は標準圧縮命令と呼ばれ、C と呼ばれます。これらの命令は多くの場合、静的および動的コード サイズを削減できる一般的な操作です。以下の「C.inst」形式の命令はすべてこのタイプの命令に属します。

実験のアセンブリコードには主に以下の種類の命令が含まれます。

  • コントロール転送命令:cj、c.jr、bge
  • 算術および論理演算命令: c.slli、c.addi
  • 整数生成命令: c.li
  • メモリアクセス命令:lw、sw

制御命令の転送

cj命令は無条件ジャンプ命令です。PC相対ジャンプを使用します。オフセットにPCを加算してジャンプ先アドレスを形成します。Jal命令と同等です。ジャンプ後、PC+4の値が書き込まれます。 cj の場合、rd=x0 と x0 を書き込むことはできません。これは、この命令がジャンプを完了するだけであることに相当します。c.jr命令は、Jalr命令と同等の無条件制御ジャンプを実行してrs1の値を取り出し、最下位ビットを0にジャンプアドレスとして設定し、PC+4の値をrdレジスタに書き込みます。ジャンプ後ですが、rd は x0 です。bge命令はrs1レジスタとrs2レジスタの値を符号付き数値として比較し、rs1がrs2以上の場合にターゲットアドレスにジャンプします。

ここに画像の説明を挿入します

CJ命令

ここに画像の説明を挿入します

c.jr命令

ここに画像の説明を挿入します

bgeコマンド

算術および論理演算命令

c.slli 命令は、rd の値に対して論理左シフト演算を実行し、その結果を rd に書き込みます。命令の shamt フィールドはシフト数です。c.Addi、add、その他の命令はすべて加算命令であり、オペランドのみが異なります。

ここに画像の説明を挿入します

c.slli

整数生成命令

c.li 命令は、符号拡張された 6 ビット即値をレジスタ rd に書き込み、rd!=x0 の場合にのみ有効です。

ここに画像の説明を挿入します

メモリアクセス命令

lw命令は、rs1+offsetをアドレスとした値をメモリから読み出し、rdレジスタに格納します。sw 命令は rs2 の値をメモリに書き込みます。アドレスは rs1+offset です。

ここに画像の説明を挿入します

2. アセンブリコードの解析

実験で与えられたコードを解析してアセンブリコードに変換すると、2 つのループのアセンブリ命令部分を見つけることができます。

最初のループの部分は次のとおりです。

1014c:        fe042623        sw x0 -20 x8		#x8-20 : i 
10150:        a005            c.j 32			#-> 10170
10152:        fec42783        lw x15 -20 x8
10156:        078a            c.slli x15 2		#x15 = 4i
10158:        ff040713        addi x14 x8 -16	
1015c:        97ba            c.add x15 x14		
1015e:        fec42703        lw x14 -20 x8		
10162:        e6e7a623        sw x14 -404 x15	#A[i] = i
#i++
10166:        fec42783        lw x15 -20 x8
1016a:        0785            c.addi x15 1
1016c:        fef42623        sw x15 -20 x8
#if(i<100)
10170:        fec42703        lw x14 -20 x8		
10174:        06300793        addi x15 x0 99
10178:        fce7dde3        bge x15 x14 -38	#i<99 -> 10152

2 番目のループの部分は次のとおりです。

1017c:        4785            c.li x15 1		
1017e:        fef42623        sw x15 -20 x8		#x8-20: i
10182:        a80d            c.j 50			#-> 101B4
10184:        fec42783        lw x15 -20 x8
10188:        17fd            c.addi x15 -1
1018a:        078a            c.slli x15 2
1018c:        ff040713        addi x14 x8 -16
10190:        97ba            c.add x15 x14
10192:        e6c7a783        lw x15 -404 x15	#x15: A[i-1]
10196:        3e878713        addi x14 x15 1000
1019a:        fec42783        lw x15 -20 x8
1019e:        078a            c.slli x15 2
101a0:        ff040693        addi x13 x8 -16
101a4:        97b6            c.add x15 x13
101a6:        e6e7a623        sw x14 -404 x15	#A[i] = A[i-1]+1000
#i++
101aa:        fec42783        lw x15 -20 x8
101ae:        0785            c.addi x15 1
101b0:        fef42623        sw x15 -20 x8
#if(i<100)
101b4:        fec42703        lw x14 -20 x8
101b8:        06300793        addi x15 x0 99
101bc:        fce7d4e3        bge x15 x14 -56	#i<99 -> 10184

3.RISC-V回路解析

RISC-Vの回路設計図は以下の通りです。

ここに画像の説明を挿入します

アドレスフェーズ

回路は、アドレス指定ステージから始めて段階ごとに解析されます。バリューフェーズの NPC ジェネレーターは次の命令のアドレスを生成します。アドレスは Jal ジャンプのアドレス計算、Jalr ジャンプのアドレス計算、分岐のアドレス計算から得られ、次の命令は選択信号によって選択されます。コントロールユニットと分岐セレクターのアドレス。NPC によって生成された PC 値をアドレスとして使用して、値が命令メモリからフェッチされ、デコード ステージに渡されます。NPC の PCF は分岐予測に接続されており、BGE などの条件分岐では予測を選択すると実行ステージでの条件判定を待つ必要がなく、ID ステージで直接ジャンプアドレスを計算し、 NPCに手紙を書きます。

ここに画像の説明を挿入します

デコード段階

デコード段階で完了する作業は制御信号の生成とオペランドの読み出しであり、主な作業単位はレジスタ群と即値演算単位です。レジスタ群の RegWriteW、WD3、A3 はライトバックステージの信号であり、デコードステージからライトバックステージに渡されます。即値演算ユニットは即値の展開を完了して実行ステージに渡し、そこで直接 Jal ジャンプターゲットアドレスの計算を完了して NPC ジェネレーターに渡すことができます。ユニットはこの段階で制御を発行できます。信号 JalD、ジャンプが行われます。

ここに画像の説明を挿入します

ここに画像の説明を挿入します

実行フェーズ

実行フェーズでは、オペランドの選択と ALU 演算の完了、分岐の選択、Jalr 命令のターゲット アドレスの計算という 3 つのタスクが完了します。オペランドのソースには、ID ステージで読み取られたレジスタ値、EX ステージおよび MEM ステージでのデータフォワード結果、および即値が含まれます。すべての制御信号は、デコード段階で制御ユニットによって生成され、実行段階でさまざまなコンポーネントに渡されます。

分岐セレクターは、分岐タイプ (値フェーズから取得される場合もあれば、実行およびメモリ アクセス フェーズから取得される場合もあります) に従って 2 つのレジスタの値を比較し、分岐ジャンプを実行するかどうかを選択し、 NPCジェネレータへの分岐信号 分岐選択中のためこの段階で分岐先アドレスもNPCジェネレータに渡される EXが出力するBrNPCであり、値は即値デコード段階で取得されます。最初に動的予測を選択せず​​、再度分岐計算結果を選択すると予測は外れ、EXステージでNPCジャンプ先アドレスが書き込まれます。

ここに画像の説明を挿入します

Alu 演算は、データ転送ステージおよびデコード ステージで読み取られたレジスタ値からオペランドを選択します。制御信号 Forward は、Harzard ユニットによって発行されます。現在書き込まれているデスティネーション レジスタ (前/前の命令) がソース レジスタと同じである場合、現在の操作、メモリ アクセスの結果を選択し、フェーズを書き戻します。AluSrc 信号はオペランドをレジスタ/PC/イミディエイト データとして選択し、AluContrl は計算タイプを指定します。Jalr 命令の場合は、rs1 の値の最下位ビットを 0 に設定し、AluOut 経由で NPC ジェネレーターに渡してジャンプします。

ここに画像の説明を挿入します

アクセスフェーズ

メモリ アクセス フェーズの主な作業は、メモリの読み書きと、実行フェーズの結果の転送の完了です。ライトイネーブル信号はデコードステージから渡されます。

ここに画像の説明を挿入します

算術命令の場合、実行フェーズの結果は直接ライトバックフェーズに渡され、rd レジスタに書き込まれます。jal や jr などの命令の場合、PC+4 が rd レジスタに書き込まれます。コントロール ユニットは、デコード時の LoadNpc 制御信号のどちらかを選択します。

ここに画像の説明を挿入します

ライトバックフェーズ

ライトバックステージでは、メモリアクセス結果とALU演算/PC+4結果のどちらかを選択してレジスタグループに送信します。MemToRegはコントロールユニットによって生成され、ライトバックステージに渡される選択信号です。 。

ここに画像の説明を挿入します

コントロールユニット

制御ユニットは次のとおりです。

ここに画像の説明を挿入します

これらの信号の一部の機能は次のとおりです。

  • RegWriteD: レジスタグループのライトイネーブル信号

  • MemToRegD: レジスタ グループに書き込まれるデータがメモリからのものかどうか

  • LoadNpcD: PC+4を計算してrdレジスタに格納するかどうか

  • RegReadD: レジスタを読み取ってハーバードユニットに渡すかどうか

  • BranchTypeD: ブランチの種類を示します。

  • AluSrc1D、AluSrc2D: ALU オペランドのソース選択信号 Alusrc1D のオプションのソースにはレジスタ値と PC 値が含まれ、Alusrc2D のオプションのソースにはレジスタ値と即値データが含まれます。

  • AluContrID: ALU固有の演算選択信号

  • ImmType: イミディエートデータのタイプ(長さ)

4. 命令の実行処理

a.add x15、x14、x15 の実行プロセス
この命令は次の場所にあります。

10188:        17fd            c.addi x15 -1
1018a:        078a            c.slli x15 2
1018c:        ff040713        addi x14 x8 -16
10190:        97ba            c.add x15 x14

命令フェッチステージでは、PC 値は 10190 で、このアドレスの命令が読み取られ、命令は ID ステージに転送されます。主要な制御信号:

  • JalrE、JalE、BrE: 最初の数命令には分岐やジャンプがないため、すべて非イネーブル状態になります。

デコード段階では、A1 の値は 0xE (x14 レジスタを表す)、A2 の値は 0xF (x15 レジスタを表す) です。この2つのレジスタの値をレジスタ群から読み出してEXステージに渡し、同時にadd命令に対応した制御信号もEXステージに渡します。このとき、レジスタ群の書き込み制御信号は前の命令の書き込み信号であり、add命令の場合、この段階では重要な制御信号は存在しない。

実行フェーズでは、RegOut1EとRegOut2Eからレジスタの値がセレクタに入り、オペランドx14は前の命令の結果なので、前の命令のメモリアクセスフェーズで押し出された値が選択され、オペランドx15がその結果となります[ステージ プッシュの結果を書き戻す] を選択します。AluContrlD は、2 つのオペランドを加算する加算演算を選択します。主要な制御信号:

  • Forward1E: メモリアクセスステージで前方にプッシュされた値をレジスタ読み出し値として選択します
  • ForWard2E: ライトバックステージでプッシュされた値をレジスタ読み取り値として選択します
  • AluSrc1E、AluSrc2E: どちらもレジスタの値を選択します
  • AluContrlD: ADDOP 信号、ALU は加算演算を実行します

メモリ アクセス ステージでは、メモリにアクセスする必要がないため、MemWriteM 信号は無効な状態になります。書き込まれるデータは、PC+4 の値ではなく、ALU 演算の結果です。主な信号は次のとおりです。

  • LoadNPCM: 無効。ライトバック ステージに渡す ALU 演算結果を選択します。

ライトバック フェーズでは、MemToRegW は有効ではありません。セレクターは ALU 演算の結果を選択し、レジスタ グループの WD3 インターフェイスに出力します。レジスタ グループの A3 は書き込みレジスタのアドレス (0xF) です。 RegWriteW 信号も受け継がれてレジスタ群に接続され、ライトイネーブルの場合は add 命令の加算結果を x15 レジスタに書き込みます。主なシグナル:

  • RegWriteW: 有効状態
  • MemToRegW: 無効状態、ALU 演算結果を選択

プロセス全体のデータ パスは次のとおりです。

ここに画像の説明を挿入します

b.bge x15、x14、-56命令実行処理

この指示と前の 2 つの指示は次のとおりです。

101b4:        fec42703        lw x14 -20 x8
101b8:        06300793        addi x15 x0 99
101bc:        fce7d4e3        bge x15 x14 -56

インデックス取得段階の主な信号は次のとおりです。

  • JalrE、JalE、BrE: 最初の数命令には分岐やジャンプがないため、すべて非イネーブル状態になります。

デコード段階では、A1 の値は 0xF (x15 レジスタを表す)、A2 の値は 0xE (x14 レジスタを表す) です。この2つのレジスタの値をレジスタセットから読み出し、その値をEXステージに渡し、EXステージに渡すPC-56の値を計算し、分岐先アドレスとしてNPCにも渡します。このとき、PCF はジャンプするかどうかを予測します。ジャンプすると NPC が書き込まれます。

実行フェーズでは、x14 と x15 の値が最初の 2 つの命令によって更新されるため、メモリ アクセスおよびライトバック フェーズでの値が選択され、オペランド選択レジスタの値と分岐セレクタが比較します。 2 つの値を使用してジャンプが必要かどうかを判断します。主なシグナルは次のとおりです。

  • Forward1E: メモリアクセスステージで前方にプッシュされた値をレジスタ読み出し値として選択します
  • ForWard2E: ライトバックステージでプッシュされた値をレジスタ読み取り値として選択します
  • AluSrc1E、AluSrc2E: どちらもレジスタの値を選択します
  • BrType、BrE: bge タイプ分岐、2 つのオペランドの値を比較し、op1>=op2 の場合、BrE が有効であれば、ジャンプする必要があり、それ以外の場合はジャンプしません。

ジャンプが予測され、分岐条件が満たされてジャンプが発生した場合、パイプラインはフラッシュされ (ハーベスト コンポーネントがフラッシュ信号を生成します)、命令フェッチ結果がジャンプ ターゲットとなり、bge 命令の次の命令は無効になります。 。ジャンプが予測され、分岐条件が満たされない場合、予測は間違っており、次のサイクルで命令を再度フェッチする必要があります。予測がジャンプせず、条件が満たされない場合は、通常の命令を続行します。予測がジャンプしないが条件が満たされた場合、予測は間違っており、EX ステージの NPC にジャンプ先を書き込む必要があります。以下は予想がジャンプしないが予想が外れ、EXステージにNPCが書かれていると仮定します。

メモリ アクセス ステージでは、メモリにアクセスする必要はありません。MemWriteM 信号は非イネーブル状態です。この命令はレジスタに書き込みません。主な信号は次のとおりです。

  • LoadNPCM: 書き込みがないため、データを選択しても影響はありません。デフォルトでは無効とみなされます。ALU 結果は
    ライトバック ステージ中に渡されます。データを書き込む必要はありません。RegWriteW は有効ではありません。主なシグナル:

  • RegWriteW: 非有効状態、書き込みなし

  • MemToRegW: 効果なし

プロセス全体のデータ パスは次のとおりです (ジャンプは予測されませんが、予測は間違っています。ジャンプ アドレスは EX ステージに書き込まれます)。

ここに画像の説明を挿入します

c.lw x15、-20 x8 実行プロセス

この指示と前の 2 つの指示は次のとおりです。

101a4:        97b6            c.add x15 x13
101a6:        e6e7a623        sw x14 -404 x15	#A[i] = A[i-1]+1000
101aa:        fec42783        lw x15 -20 x8

インデックス取得段階の主な信号は次のとおりです。

  • JalrE、JalE、BrE: 最初の数命令には分岐やジャンプがないため、すべて非イネーブル状態になります。

デコードステージでは、A1 の値は x8 レジスタを表す 0x8 であり、このレジスタの値がレジスタ グループから読み取られ、その値が EX ステージに渡されます。もう 1 つのオペランドは即値であり、重要な制御信号を持たない即値ユニットを介して EX ステージに渡されます。

実行フェーズでは、オペランド 1 でレジスタから読み出した x8 の値を選択し、オペランド 2 で即値の値を選択し、演算タイプは加算で、結果はメモリ アクセス フェーズに渡されます。主なシグナル:

  • Forward1E: レジスタから読み取った値を選択します
  • ForWard2E: 影響なし
  • AluSrc1E、AluSrc2E: OP1 はレジスタ値を選択し、OP2 は即値を選択します
  • AluContrl: ADDOP信号、加算演算

メモリ アクセス ステージでは、ALU 演算の結果をアドレスとして使用してメモリから値を読み取り、それをライトバック ステージに渡します。主なシグナル:

  • LoadNPCM: 影響なし、メモリからデータを読み取ります
  • MemWriteM: 無効、データの読み取り

ライトバックフェーズでは、メモリアクセス結果がレジスタグループに転送され、レジスタx15に書き込まれます。主なシグナル:

  • RegWriteW: ステータスを有効にし、レジ​​スタに書き込みます
  • MemToRegW: 有効状態、メモリアクセス結果を選択

プロセス全体のデータ パスは次のとおりです。

ここに画像の説明を挿入します

d.sw x15 -20 x8命令実行処理

この指示と前の 2 つの指示は次のとおりです。

101aa:        fec42783        lw x15 -20 x8
101ae:        0785            c.addi x15 1
101b0:        fef42623        sw x15 -20 x8

インデックス取得段階の主な信号は次のとおりです。

  • JalrE、JalE、BrE: 最初の数命令には分岐やジャンプがないため、すべて非イネーブル状態になります。

デコード段階では、A1 の値は 0x8、x8 レジスタを読み取り、A2 の値は 0XF、x15 レジスタの値を読み取り、他のオペランドは即値です。読み取りと転送のプロセスは次と同じです。 lw命令。重要な制御信号はありません。

実行フェーズではストレージアドレスを計算する必要がありますが、最初の 2 つの命令は x8 に書き込んでいないため、x8 の値とデコードフェーズで読み取られた即値が演算のオペランドとして選択されます。主なシグナルは次のとおりです。

  • Forward1E: レジスタから読み取った値を選択します
  • ForWard2E: 影響なし
  • AluSrc1E、AluSrc2E: OP1 はレジスタ値を選択し、OP2 は即値を選択します
  • AluContrl: ADDOP信号、加算演算

メモリアクセスステージではメモリに書き込む必要があり、書き込まれる値は前の命令によって書き戻されたデータであり、アドレスはALU計算の結果です。主なシグナル:

  • LoadNPCM: 影響なし
  • MemWriteM: 書き込み可能、​​データ書き込み

ライトバックフェーズではレジスタへの書き込みは必要ありません。主なシグナル:

  • RegWriteW: 非有効状態。レジスタに書き込む必要はありません。

そのデータパスは次のとおりです。

ここに画像の説明を挿入します

青色はライトバック ステージの前の命令の結果であり、書き込みデータとして StoreDataM に渡されます。StoreDataM のデータ ソースは元の回路図には示されていません。実行時のオペランド選択と同じである必要があります。レジスタから読み取った値、または前の命令の計算結果を選択できます。

4.BranchE信号の役割

BranchE 信号の機能は、分岐条件が正しいかどうかを判断することです。分岐命令の場合、実行フェーズ中に rs1 と rs2 の値を比較する必要があり、この 2 つの値は分岐タイプに応じて比較され、ジャンプが必要かどうかが判断されます。信号は有効な状態になり、NPC ジェネレーターは転送のターゲット アドレスであるジャンプを書き込む必要があります。動的分岐予測の場合、この値は ID ステージに書き込まれている可能性があります。EX ステージは予測が正しいことのみを検証します。失敗した場合は、命令を再度フェッチしてパイプラインをフラッシュする必要があります。

予測が当たってジャンプが発生した場合、ジャンプ命令以降の命令は無効となるため、パイプラインをフラッシュして次の命令の実行をキャンセルする必要があるため、BrE信号はハザードユニットにも渡されます。ジャンプが必要な場合、ジャンプ信号を受信します。ジャンプ信号のハザード ユニットはフラッシュ信号をパイプライン中間レジスタに送信し、パイプラインをフラッシュし、実行中の命令をキャンセルし、ジャンプ ターゲット アドレスで命令を再読み込みして実行を継続します。

予測が選択され、予測が正しい

CLK1 CLK2 CLK3 CLK4 CLK5 CLK6 CLK7
パイプライン i1 IF(NPC=NPC+4) ID(分岐予測、分岐アドレス計算) EX(分岐条件計算) メム WB
パイプライン i2 IF (予測結果に基づいてNPCを更新=NPC+4/分岐対象) ID 流す 流す 流す
パイプライン i3 IF(NPC=PC+4) ID(分岐先) メム WB

予測はチェックされておらず、予測は正しいです

CLK1 CLK2 CLK3 CLK4 CLK5 CLK6 CLK7
パイプライン i1 IF(NPC=NPC+4) ID(分岐予測、分岐アドレス計算) EX(分岐条件計算) メム WB
パイプライン i2 IF (予測結果に基づいてNPCを更新=NPC+4/分岐対象) ID メム WB
パイプライン i3 IF(NPC=NPC+4) ID(最後のNPC) メム WB

5. NPCジェネレーターのジャンプ先選択

NPC ジェネレーターには 4 つのオプションのドロップ ターゲットがあります。

  • PC+4: デフォルトで次の命令を実行します
  • BrT: 分岐ジャンプアドレス
  • JalrT: 無条件ジャンプ アドレス。ターゲット アドレスはレジスタの値で、最下位ビットを 0 に設定し、実行フェーズ中に計算されます。
  • JalT: 無条件ジャンプ アドレス。ターゲット アドレスはデコード段階で計算されます。これは PC+Imm です。

対応するイネーブル信号と分岐予測信号は 3 つあり、分岐およびジャンプイネーブル信号または予測ジャンプ信号がある限り、PC+4 は下位アドレスとして使用されません。分岐計算の結果検証とJalrのターゲットアドレスは実行ステージまで得られない Jal命令のターゲットアドレスはデコードステージで計算され、制御信号もデコードステージのNPCジェネレーターに渡されますこのとき、実行フェーズの他の 2 つの命令のうち 1 つもジャンプすることが決定されている可能性があります。実行フェーズの命令が先に実行されるため、実行フェーズのジャンプ先アドレスに従ってジャンプする必要があります。 、有効信号がある場合、 BrT と JalrT の選択が JalT の選択より優先されます。

命令
BrT もし ID EX: BrE true
ジャル もし ID:JalE true

ここで BrT は予測が選択されなかった場合、または予測が外れた場合であり、最後にジャンプが決定した場合であり、予測ジャンプが正しければ ID は矛盾なくジャンプします。

6. ハザード単元 (追加の思考問題)

競合の処理

パイプラインには 3 種類の競合があります。

  • 構造的競合: リソースの競合によって引き起こされる
  • データ競合: 同じデータ オブジェクトの読み取りと書き込みを行う隣接する命令によって引き起こされる競合
  • コントロールの競合: NPC を変更する分岐およびジャンプ命令によって引き起こされる競合

個別の命令メモリとデータ メモリを使用し、クロック サイクルの前半と後半でレジスタの読み取りと書き込みを行うと、構造的な競合が回避されますが、構造的な競合が依然として存在する可能性があります。命令キャッシュミスが発生すると次の命令はバリューフェーズに移行できず、データキャッシュミスが発生すると次の命令はメモリアクセスフェーズに移行できないため、HarzardユニットがDCacheMissまたはICacheMissを受信した場合、パイプラインを一時停止する必要があります。複数のサイクルにわたって一時停止する必要があります。

データの競合には、RAW、WAR、WAW の 3 つのタイプがあります。WAW および WAR は、順次実行されるスカラー プロセッサには表示されません。RAW の読み取り後書き込みの競合に焦点を当てます。リードアフターライト競合は、次の状況のように、現在の命令のソース オペランドが前の命令の結果である場合に発生します。

c.slli x15 2
addi x14 x8 -16
c.add x15 x14

x15 と x14 の更新された値はまだ書き込まれておらず、追加命令は実行フェーズ中にこれら 2 つの値をすでに使用しています。この競合は、データのプッシュフォワードによって解決されます。ハザードユニットは、RegWrite 信号と RegRead 信号が同時に有効になり、転送元レジスタと書き込み先レジスタが同じであることを受信すると、forward 信号によるデータ転送結果を選択します。

ここに画像の説明を挿入します

次のような、フォワード プッシュでは処理できない RAW 競合もあります。

lw x15 -20 x8
addi x14 x15 -16

lw 命令は、メモリ アクセス ステージの後に x15 の新しい値を読み取りますが、この時点では、add 命令はすでに実行ステージにあるため、この値が必要です。このとき、パイプラインは一時停止することしかできません。Harzard ユニットは、MemToRegE が有効であり、rs レジスタと rd レジスタが同じレジスタであることを受信すると、競合を検出してストール信号を送信して、実行フェーズとそれ以前のすべてのフェーズを一時停止し、メモリ アクセスとライトバック フェーズは続行します。 . の場合、一時停止する必要があるのは 1 サイクルだけであり、ライトバック結果を実行サイクルにプッシュバックすることができ、パイプラインは動作を継続できます。

制御競合は分岐命令とジャンプ命令によって引き起こされます。BrE、JalE、および JalrE のいずれかが有効な場合、Harzard ユニットは分岐ジャンプを検出し、フラッシュ信号を送信し、実行フェーズの前にその部分をフラッシュし、同時にメモリ フェーズにアクセスします。ステージは引き続き動作し、前の指示を完了します。

予測ミス

予測ミス機構が使用されている場合は、次の命令が正常に実行されます。ジャンプが必要な場合、最後の 2 つの命令は無効になり、NPC に書き込まれます。IF、ID、および EX については、フラッシュ信号が true になり、パイプラインがフラッシュされます。 。パイプラインを一時停止する必要はありません。次のサイクルでは、アドレスが取得され、新しい命令が実行されます。

命令
BrT もし ID EX: BrE true -> フラッシュ
ジャル もし ID:JalE true
追加 もし
BrTnext もし ID 元…

おすすめ

転載: blog.csdn.net/Aaron503/article/details/130661248