Fix IOMSHR state machine bug
Sending the finish too early causes the CPU response to get dropped. attn @zhemao
This commit is contained in:
		| @@ -170,9 +170,15 @@ class IOMSHR(id: Int)(implicit p: Parameters) extends L1HellaCacheModule()(p) { | ||||
|   val grant_word = Reg(UInt(width = wordBits)) | ||||
|   val fq = Module(new FinishQueue(1)) | ||||
|  | ||||
|   val s_idle :: s_acquire :: s_grant :: s_resp :: s_finish :: Nil = Enum(Bits(), 5) | ||||
|   val state = Reg(init = s_idle) | ||||
|   io.req.ready := (state === s_idle) | ||||
|  | ||||
|   fq.io.enq.valid := io.grant.valid && io.grant.bits.requiresAck() | ||||
|   fq.io.enq.bits := io.grant.bits.makeFinish() | ||||
|   io.finish <> fq.io.deq | ||||
|   io.finish.valid := fq.io.deq.valid && (state === s_finish) | ||||
|   io.finish.bits := fq.io.deq.bits | ||||
|   fq.io.deq.ready := io.finish.ready && (state === s_finish) | ||||
|  | ||||
|   val storegen = new StoreGen(req.typ, req.addr, req.data, wordBytes) | ||||
|   val loadgen = new LoadGen(req.typ, req.addr, grant_word, req_cmd_sc, wordBytes) | ||||
| @@ -181,11 +187,6 @@ class IOMSHR(id: Int)(implicit p: Parameters) extends L1HellaCacheModule()(p) { | ||||
|   val beat_mask = (storegen.mask << Cat(beat_offset, UInt(0, wordOffBits))) | ||||
|   val beat_data = Fill(beatWords, storegen.data) | ||||
|  | ||||
|   val s_idle :: s_acquire :: s_grant :: s_resp :: s_finish :: Nil = Enum(Bits(), 5) | ||||
|   val state = Reg(init = s_idle) | ||||
|  | ||||
|   io.req.ready := (state === s_idle) | ||||
|  | ||||
|   val addr_block = req.addr(paddrBits - 1, blockOffBits) | ||||
|   val addr_beat  = req.addr(blockOffBits - 1, beatOffBits) | ||||
|   val addr_byte  = req.addr(beatOffBits - 1, 0) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user