Skip to content

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
      }
    }    
  }

Clone this wiki locally