-
Notifications
You must be signed in to change notification settings - Fork 102
jp arch microarch
Ryota Shioya edited this page Dec 21, 2019
·
1 revision
下記を参照してください.
以下のようにしてゼロレジスタは実装されています.
- ゼロレジスタへ書き込む命令は,レジスタ書き込みフラグを落とす
- Decoder.svのopInfo.writeRegへの書き込みの際にゼロレジスタかどうかを判定
- レジスタファイルはリセット回路による初期化で, すべてにゼロが書き込まれるようにする
- RegisterFile.sv内で記述
- RMTは初期化によって, 物理レジスタの0番エントリにゼロレジスタが割り当てられ, 解放されることがない
- ゼロレジスタの読み込みは実際に物理レジスタから行われるが, 上の条件により常に0が読みだされる
-
関連するユニット
- Privileged/CSR_Unit.sv
- Privileged/CSR_UnitIF.sv
- Pipeline/MemoryBackEnd/MemoryTagAccessStage.sv
- 例外判定を行っている
-
csrUnitIF.triggerInterrupt
- 割り込み: タイマーなどの,命令の実行とは独立に外部要因によってよりトリガされる
-
csrUnitIF.triggerExcpt
- 例外: 命令の実行に伴ってトリガされる
- 例外はさらに,fault と trap に別れる
- fault: アドレス違反等
- trap: システムコール呼び出し等
- csrUnitIF.excptCause のコードによって上記を判別する
- EXEC_STATE_TRAP_ECALL ならトラップ,
- EXEC_STATE_FAULT_LOAD_MISALIGNED ならフォールトなど
- @Pipeline/MemoryBackEnd/MemoryTagAccessStage.sv でアドレスチェックが行われ,ExecState にフォールトが登録される
// 実行が正しく終了してる場合,フォールト判定を行う if (nextStage[i].execState == EXEC_STATE_SUCCESS) begin if (isLoad[i]) begin if (pipeReg[i].memMapType == MMT_ILLEGAL) nextStage[i].execState = EXEC_STATE_FAULT_LOAD_VIOLATION; else if (IsMisalignedAddress(pipeReg[i].addrOut, iqData[i].memOpInfo.memAccessMode.size)) nextStage[i].execState = EXEC_STATE_FAULT_LOAD_MISALIGNED; end else if (isStore[i]) begin if (pipeReg[i].memMapType == MMT_ILLEGAL) nextStage[i].execState = EXEC_STATE_FAULT_STORE_VIOLATION; else if (IsMisalignedAddress(pipeReg[i].addrOut, iqData[i].memOpInfo.memAccessMode.size)) nextStage[i].execState = EXEC_STATE_FAULT_STORE_MISALIGNED; end end
- ライトバックステージで ActiveList に execState が書き込まれる
- フォールトを起こした命令が ActiveList の先頭に来るまで待つ
- フォールトは実行時リカバリの対象とはならないようにしている
- コミットステージでフォールトを起こした命令を検出
- RecoveryManager にリカバリ要求をだす
- リカバリの一種として,フォールトを起こした命令が自分ごと取り消される
- RecoveryManager から CSR_Unit に対してフォールトのトリガを要求
- CSR_Unit が発生したフォールトの種類などに応じて csr や PC を書き換える
@ CSR_Unit.sv csrNext.mepc = port.excptCauseAddr; // 例外の発生元 PC を書き込む csrNext.mtval = port.excptCauseDataAddr;// ECALL/EBREAK の場合は PC? csrNext.mcause.isInterrupt = FALSE; csrNext.mcause.code.trapCode = ToTrapCodeFromExecState(port.excptCause);