Skip to content

Commit

Permalink
update writeback
Browse files Browse the repository at this point in the history
  • Loading branch information
Mengyang He committed Mar 31, 2024
1 parent 158995e commit 432ba1d
Show file tree
Hide file tree
Showing 17 changed files with 264 additions and 380 deletions.
48 changes: 20 additions & 28 deletions mem/cache/writeback/bankstage.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,37 +121,37 @@ func (e bankPipelineElem) TaskID() string {
return e.trans.req().Meta().ID + "_write_back_bank_pipeline"
}

func (s *bankStage) Tick(now sim.VTimeInSec) (madeProgress bool) {
func (s *bankStage) Tick() (madeProgress bool) {
for i := 0; i < s.cache.numReqPerCycle; i++ {
madeProgress = s.finalizeTrans(now) || madeProgress
madeProgress = s.finalizeTrans() || madeProgress
}

madeProgress = s.pipeline.Tick(now) || madeProgress
madeProgress = s.pipeline.Tick() || madeProgress

for i := 0; i < s.cache.numReqPerCycle; i++ {
madeProgress = s.pullFromBuf(now) || madeProgress
madeProgress = s.pullFromBuf() || madeProgress
}

return madeProgress
}

func (s *bankStage) Reset(now sim.VTimeInSec) {
func (s *bankStage) Reset() {
s.cache.dirToBankBuffers[s.bankID].Clear()
s.pipeline.Clear()
s.postPipelineBuf.Clear()
s.inflightTransCount = 0
// s.currentTrans = nil
}

func (s *bankStage) pullFromBuf(now sim.VTimeInSec) bool {
func (s *bankStage) pullFromBuf() bool {
if !s.pipeline.CanAccept() {
return false
}

inBuf := s.cache.writeBufferToBankBuffers[s.bankID]
trans := inBuf.Pop()
if trans != nil {
s.pipeline.Accept(now, bankPipelineElem{trans: trans.(*transaction)})
s.pipeline.Accept(bankPipelineElem{trans: trans.(*transaction)})
s.inflightTransCount++
return true
}
Expand All @@ -176,7 +176,7 @@ func (s *bankStage) pullFromBuf(now sim.VTimeInSec) bool {
return true
}

s.pipeline.Accept(now, bankPipelineElem{trans: trans.(*transaction)})
s.pipeline.Accept(bankPipelineElem{trans: trans.(*transaction)})
s.inflightTransCount++

switch t.action {
Expand All @@ -190,21 +190,21 @@ func (s *bankStage) pullFromBuf(now sim.VTimeInSec) bool {
return false
}

func (s *bankStage) finalizeTrans(now sim.VTimeInSec) bool {
func (s *bankStage) finalizeTrans() bool {
for i := 0; i < s.postPipelineBuf.Size(); i++ {
trans := s.postPipelineBuf.Get(i).(bankPipelineElem).trans

done := false

switch trans.action {
case bankReadHit:
done = s.finalizeReadHit(now, trans)
done = s.finalizeReadHit(trans)
case bankWriteHit:
done = s.finalizeWriteHit(now, trans)
done = s.finalizeWriteHit(trans)
case bankWriteFetched:
done = s.finalizeBankWriteFetched(now, trans)
done = s.finalizeBankWriteFetched(trans)
case bankEvictAndFetch, bankEvictAndWrite, bankEvict:
done = s.finalizeBankEviction(now, trans)
done = s.finalizeBankEviction(trans)
default:
panic("bank action not supported")
}
Expand All @@ -219,10 +219,7 @@ func (s *bankStage) finalizeTrans(now sim.VTimeInSec) bool {
return false
}

func (s *bankStage) finalizeReadHit(
now sim.VTimeInSec,
trans *transaction,
) bool {
func (s *bankStage) finalizeReadHit(trans *transaction) bool {
if !s.cache.topSender.CanSend(1) {
return false
}
Expand All @@ -238,13 +235,12 @@ func (s *bankStage) finalizeReadHit(
panic(err)
}

s.removeTransaction(now, trans)
s.removeTransaction(trans)
s.inflightTransCount--
s.downwardInflightTransCount--
block.ReadCount--

dataReady := mem.DataReadyRspBuilder{}.
WithSendTime(now).
WithSrc(s.cache.topPort).
WithDst(read.Src).
WithRspTo(read.ID).
Expand All @@ -265,10 +261,7 @@ func (s *bankStage) finalizeReadHit(
return true
}

func (s *bankStage) finalizeWriteHit(
now sim.VTimeInSec,
trans *transaction,
) bool {
func (s *bankStage) finalizeWriteHit(trans *transaction) bool {
if !s.cache.topSender.CanSend(1) {
return false
}
Expand All @@ -285,12 +278,11 @@ func (s *bankStage) finalizeWriteHit(
block.IsDirty = true
block.DirtyMask = dirtyMask

s.removeTransaction(now, trans)
s.removeTransaction(trans)
s.inflightTransCount--
s.downwardInflightTransCount--

done := mem.WriteDoneRspBuilder{}.
WithSendTime(now).
WithSrc(s.cache.topPort).
WithDst(write.Src).
WithRspTo(write.ID).
Expand Down Expand Up @@ -343,7 +335,6 @@ func (s *bankStage) writeData(
}

func (s *bankStage) finalizeBankWriteFetched(
now sim.VTimeInSec,
trans *transaction,
) bool {
if !s.cache.mshrStageBuffer.CanPush() {
Expand Down Expand Up @@ -377,7 +368,7 @@ func (s *bankStage) finalizeBankWriteFetched(
return true
}

func (s *bankStage) removeTransaction(now sim.VTimeInSec, trans *transaction) {
func (s *bankStage) removeTransaction(trans *transaction) {
for i, t := range s.cache.inFlightTransactions {
if trans == t {
// fmt.Printf("%.10f, %s, trans %s removed in bank stage.\n",
Expand All @@ -389,14 +380,15 @@ func (s *bankStage) removeTransaction(now sim.VTimeInSec, trans *transaction) {
}
}

now := s.cache.Engine.CurrentTime()

fmt.Printf("%.10f, %s, Transaction %s not found\n",
now, s.cache.Name(), trans.id)

panic("transaction not found")
}

func (s *bankStage) finalizeBankEviction(
now sim.VTimeInSec,
trans *transaction,
) bool {
if !s.cache.writeBufferBuffer.CanPush() {
Expand Down
54 changes: 26 additions & 28 deletions mem/cache/writeback/bankstage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,61 +65,61 @@ var _ = Describe("Bank Stage", func() {

Context("No transaction running", func() {
It("should do nothing if pipeline is full", func() {
pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
pipeline.EXPECT().CanAccept().Return(false)

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeFalse())
})

It("should do nothing if there is no transaction", func() {
pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
pipeline.EXPECT().CanAccept().Return(true)
writeBufferInBuf.EXPECT().Pop().Return(nil)
writeBufferBuffer.EXPECT().CanPush().Return(true)
dirInBuf.EXPECT().Pop().Return(nil)

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeFalse())
})

It("should extract transactions from write buffer first", func() {
trans := &transaction{}

pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
writeBufferInBuf.EXPECT().Pop().Return(trans)
pipeline.EXPECT().CanAccept().Return(true)
pipeline.EXPECT().Accept(sim.VTimeInSec(10), gomock.Any())
ret := bs.Tick(10)
pipeline.EXPECT().Accept(gomock.Any())
ret := bs.Tick()

Expect(ret).To(BeTrue())
Expect(bs.inflightTransCount).To(Equal(1))
})

It("should stall if write buffer buffer is full", func() {
pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
pipeline.EXPECT().CanAccept().Return(true)
writeBufferInBuf.EXPECT().Pop().Return(nil)
writeBufferBuffer.EXPECT().CanPush().Return(false)

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeFalse())
})

It("should extract transactions from directory", func() {
trans := &transaction{}

pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
pipeline.EXPECT().CanAccept().Return(true)
pipeline.EXPECT().Accept(sim.VTimeInSec(10), gomock.Any())
pipeline.EXPECT().Accept(gomock.Any())
writeBufferInBuf.EXPECT().Pop().Return(nil)
writeBufferBuffer.EXPECT().CanPush().Return(true)
dirInBuf.EXPECT().Pop().Return(trans)

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeTrue())
Expect(bs.inflightTransCount).To(Equal(1))
Expand All @@ -130,13 +130,13 @@ var _ = Describe("Bank Stage", func() {
action: writeBufferFetch,
}

pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
pipeline.EXPECT().CanAccept().Return(true)
writeBufferInBuf.EXPECT().Pop().Return(nil)
writeBufferBuffer.EXPECT().CanPush().Return(true)
writeBufferBuffer.EXPECT().Push(trans)
dirInBuf.EXPECT().Pop().Return(trans)
ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeTrue())
})
Expand All @@ -152,7 +152,6 @@ var _ = Describe("Bank Stage", func() {
BeforeEach(func() {
storage.Write(0x40, []byte{1, 2, 3, 4, 5, 6, 7, 8})
read = mem.ReadReqBuilder{}.
WithSendTime(6).
WithAddress(0x104).
WithByteSize(4).
Build()
Expand All @@ -169,15 +168,15 @@ var _ = Describe("Bank Stage", func() {
cacheModule.inFlightTransactions = append(
cacheModule.inFlightTransactions, trans)

pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
pipeline.EXPECT().CanAccept().Return(false)
bs.inflightTransCount = 1
})

It("should stall if send buffer is full", func() {
topSender.EXPECT().CanSend(1).Return(false)

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeFalse())
Expect(bs.inflightTransCount).To(Equal(1))
Expand All @@ -192,7 +191,7 @@ var _ = Describe("Bank Stage", func() {
Expect(dr.Data).To(Equal([]byte{5, 6, 7, 8}))
})

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeTrue())
Expect(block.ReadCount).To(Equal(0))
Expand All @@ -212,7 +211,6 @@ var _ = Describe("Bank Stage", func() {

BeforeEach(func() {
write = mem.WriteReqBuilder{}.
WithSendTime(6).
WithAddress(0x104).
WithData([]byte{5, 6, 7, 8}).
Build()
Expand All @@ -229,15 +227,15 @@ var _ = Describe("Bank Stage", func() {
cacheModule.inFlightTransactions = append(
cacheModule.inFlightTransactions, trans)
postPipelineBuf.Push(bankPipelineElem{trans: trans})
pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
pipeline.EXPECT().CanAccept().Return(false)
bs.inflightTransCount = 1
})

It("should stall if send buffer is full", func() {
topSender.EXPECT().CanSend(1).Return(false)

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeFalse())
Expect(bs.inflightTransCount).To(Equal(1))
Expand All @@ -251,7 +249,7 @@ var _ = Describe("Bank Stage", func() {
Expect(done.RespondTo).To(Equal(write.ID))
})

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeTrue())
data, _ := storage.Read(0x44, 4)
Expand Down Expand Up @@ -307,15 +305,15 @@ var _ = Describe("Bank Stage", func() {
}
postPipelineBuf.Push(bankPipelineElem{trans: trans})

pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
pipeline.EXPECT().CanAccept().Return(false)
bs.inflightTransCount = 1
})

It("should stall if the mshr stage buffer is full", func() {
mshrStageBuffer.EXPECT().CanPush().Return(false)

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeFalse())
Expect(bs.inflightTransCount).To(Equal(1))
Expand All @@ -326,7 +324,7 @@ var _ = Describe("Bank Stage", func() {
mshrStageBuffer.EXPECT().CanPush().Return(true)
mshrStageBuffer.EXPECT().Push(mshrEntry)

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeTrue())
writtenData, _ := storage.Read(0x40, 64)
Expand Down Expand Up @@ -364,15 +362,15 @@ var _ = Describe("Bank Stage", func() {
action: bankEvictAndFetch,
}
postPipelineBuf.Push(bankPipelineElem{trans: trans})
pipeline.EXPECT().Tick(sim.VTimeInSec(10))
pipeline.EXPECT().Tick()
pipeline.EXPECT().CanAccept().Return(false)
bs.inflightTransCount = 1
})

It("should stall if the bottom sender is busy", func() {
writeBufferBuffer.EXPECT().CanPush().Return(false)

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeFalse())
Expect(bs.inflightTransCount).To(Equal(1))
Expand All @@ -398,7 +396,7 @@ var _ = Describe("Bank Stage", func() {
Expect(eviction.evictingData).To(Equal(data))
})

ret := bs.Tick(10)
ret := bs.Tick()

Expect(ret).To(BeTrue())
Expect(bs.inflightTransCount).To(Equal(0))
Expand Down
Loading

0 comments on commit 432ba1d

Please sign in to comment.