Skip to content
Snippets Groups Projects
Commit 6a626754 authored by Yifan Sun's avatar Yifan Sun
Browse files

Directory write to bottom

Former-commit-id: dbdf1482
Former-commit-id: e5d17617
Former-commit-id: 4d0f9c36
parent 6fda475a
Branches
Tags
No related merge requests found
......@@ -138,19 +138,44 @@ func (d *directory) processWrite(
mshrEntry := d.mshr.Query(cacheLineID)
if mshrEntry != nil {
ok := d.writeBottom(now, trans)
if ok {
return d.processMSHRHit(trans, mshrEntry)
}
return false
}
block := d.dir.Lookup(cacheLineID)
if block != nil && block.IsValid {
return d.processWriteHit(trans, block)
return d.processWriteHit(now, trans, block)
}
block = d.dir.FindVictim(cacheLineID)
return d.processWriteHit(trans, block)
return d.processWriteHit(now, trans, block)
}
func (d *directory) writeBottom(now akita.VTimeInSec, trans *transaction) bool {
write := trans.write
addr := write.Address
writeToBottom := mem.NewWriteReq(
now,
d.bottomPort,
d.lowModuleFinder.Find(addr),
addr,
)
writeToBottom.Data = write.Data
writeToBottom.PID = write.PID
err := d.bottomPort.Send(writeToBottom)
if err != nil {
return false
}
return true
}
func (d *directory) processWriteHit(
now akita.VTimeInSec,
trans *transaction,
block *cache.Block,
) bool {
......@@ -165,8 +190,20 @@ func (d *directory) processWriteHit(
return false
}
block.IsLocked = true
ok := d.writeBottom(now, trans)
if !ok {
return false
}
write := trans.write
addr := write.Address
blockSize := uint64(1 << d.log2BlockSize)
cacheLineID := addr / blockSize * blockSize
block.IsLocked = true
block.Tag = cacheLineID
if len(write.Data) == 1<<d.log2BlockSize {
block.IsValid = true
}
d.dir.Visit(block)
trans.bankAction = bankActionWrite
......
......@@ -234,6 +234,7 @@ var _ = Describe("Directory", func() {
BeforeEach(func() {
write = mem.NewWriteReq(10, nil, nil, 0x104)
write.Data = []byte{1, 2, 3, 4}
write.PID = 1
trans = &transaction{
write: write,
}
......@@ -244,6 +245,13 @@ var _ = Describe("Directory", func() {
inBuf.EXPECT().Peek().Return(trans)
inBuf.EXPECT().Pop()
mshr.EXPECT().Query(uint64(0x100)).Return(mshrEntry)
lowModuleFinder.EXPECT().Find(uint64(0x104))
bottomPort.EXPECT().Send(gomock.Any()).
Do(func(write *mem.WriteReq) {
Expect(write.Address).To(Equal(uint64(0x104)))
Expect(write.Data).To(Equal([]byte{1, 2, 3, 4}))
Expect(write.PID).To(Equal(ca.PID(1)))
})
madeProgress := d.Tick(10)
......@@ -262,6 +270,7 @@ var _ = Describe("Directory", func() {
BeforeEach(func() {
write = mem.NewWriteReq(10, nil, nil, 0x104)
write.Data = []byte{1, 2, 3, 4}
write.PID = 1
trans = &transaction{
write: write,
}
......@@ -274,12 +283,19 @@ var _ = Describe("Directory", func() {
mshr.EXPECT().Query(uint64(0x100)).Return(nil)
dir.EXPECT().Lookup(uint64(0x100)).Return(block)
dir.EXPECT().Visit(block)
lowModuleFinder.EXPECT().Find(uint64(0x104))
bankBuf.EXPECT().CanPush().Return(true)
bankBuf.EXPECT().Push(gomock.Any()).
Do(func(trans *transaction) {
Expect(trans.bankAction).To(Equal(bankActionWrite))
Expect(trans.block).To(BeIdenticalTo(block))
})
bottomPort.EXPECT().Send(gomock.Any()).
Do(func(write *mem.WriteReq) {
Expect(write.Address).To(Equal(uint64(0x104)))
Expect(write.Data).To(Equal([]byte{1, 2, 3, 4}))
Expect(write.PID).To(Equal(ca.PID(1)))
})
madeProgress := d.Tick(10)
......@@ -288,6 +304,11 @@ var _ = Describe("Directory", func() {
})
It("should send to bank in case of write miss", func() {
block.Tag = 0x200
block.IsValid = false
write.Address = 0x100
write.Data = make([]byte, 64)
inBuf.EXPECT().Peek().Return(trans)
inBuf.EXPECT().Pop()
mshr.EXPECT().Query(uint64(0x100)).Return(nil)
......@@ -300,11 +321,20 @@ var _ = Describe("Directory", func() {
Expect(trans.bankAction).To(Equal(bankActionWrite))
Expect(trans.block).To(BeIdenticalTo(block))
})
lowModuleFinder.EXPECT().Find(uint64(0x100))
bottomPort.EXPECT().Send(gomock.Any()).
Do(func(write *mem.WriteReq) {
Expect(write.Address).To(Equal(uint64(0x100)))
Expect(write.Data).To(HaveLen(64))
Expect(write.PID).To(Equal(ca.PID(1)))
})
madeProgress := d.Tick(10)
Expect(madeProgress).To(BeTrue())
Expect(block.IsLocked).To(BeTrue())
Expect(block.Tag).To(Equal(uint64(0x100)))
Expect(block.IsValid).To(BeTrue())
})
It("should stall is the block is locked", func() {
......@@ -341,6 +371,19 @@ var _ = Describe("Directory", func() {
Expect(madeProgress).To(BeFalse())
})
It("should stall is send to bottom failed", func() {
inBuf.EXPECT().Peek().Return(trans)
mshr.EXPECT().Query(uint64(0x100)).Return(nil)
dir.EXPECT().Lookup(uint64(0x100)).Return(block)
bankBuf.EXPECT().CanPush().Return(true)
lowModuleFinder.EXPECT().Find(uint64(0x104))
bottomPort.EXPECT().Send(gomock.Any()).Return(&akita.SendError{})
madeProgress := d.Tick(10)
Expect(madeProgress).To(BeFalse())
})
})
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment