-
-
Notifications
You must be signed in to change notification settings - Fork 12
4 Commit state
Ruige Lee edited this page May 14, 2022
·
1 revision
for ( i <- 0 until cm_chn ) yield {
when( (~io.rod(i).valid) ) {
commit_state(i) := 0.U //IDLE
}
.otherwise {
when(
// (io.rod(i).bits.is_branch & bctq(i).bits.isMisPredict & cmm_state(i).is_wb) |
// (io.rod(i).bits.is_jalr & jctq(i).bits.isMisPredict & cmm_state(i).is_wb) |
cmm_state(i).is_xRet | cmm_state(i).is_trap | cmm_state(i).is_fence_i | cmm_state(i).is_sfence_vma
) {
commit_state(i) := 1.U //abort
for ( j <- 0 until i ) yield { when( ~commit_state_is_comfirm(j) ) {commit_state(i) := 0.U}} //override to idle }
abort_chn := i.U
} .elsewhen( ((io.rod(i).bits.is_branch & bctq(i).bits.isMisPredict) | (io.rod(i).bits.is_jalr & jctq(i).bits.isMisPredict)) & cmm_state(i).is_wb & ~cmm_state(i).is_step) { //1st-step will cause an interrupt
commit_state(i) := 2.U //mis-predict
for ( j <- 0 until i ) yield { when( ~commit_state_is_comfirm(j) ) {commit_state(i) := 0.U} } //override to idle }
} .elsewhen( cmm_state(i).is_wb & ~cmm_state(i).is_step ) { //when writeback and no-step, 1st-step will cause an interrupt
when( (io.rod(i).bits.is_csr & ~csrExe(i).valid) || (io.rod(i).bits.is_fcsr & ~fcsrExe(i).valid) ) {
commit_state(i) := 0.U
} .otherwise {
commit_state(i) := 3.U //confirm
}
for ( j <- 0 until i ) yield { when( ~commit_state_is_comfirm(j) ) {commit_state(i) := 0.U} } //override to idle }
} .otherwise {
commit_state(i) := 0.U //idle
}
}
}