diff --git a/mem/vm/tlb-local/builder.go b/mem/vm/tlb-local/builder.go deleted file mode 100644 index d59c39b6..00000000 --- a/mem/vm/tlb-local/builder.go +++ /dev/null @@ -1,128 +0,0 @@ -package tlb - -import "github.com/sarchlab/akita/v3/sim" - -// A Builder can build TLBs -type Builder struct { - engine sim.Engine - freq sim.Freq - numReqPerCycle int - numSets int - numWays int - pageSize uint64 - lowModule sim.Port - numMSHREntry int - deviceID uint64 - onlyStoreLocalPageAddress bool -} - -// MakeBuilder returns a Builder -func MakeBuilder() Builder { - return Builder{ - freq: 1 * sim.GHz, - numReqPerCycle: 4, - numSets: 1, - numWays: 32, - pageSize: 4096, - numMSHREntry: 4, - onlyStoreLocalPageAddress: false, - } -} - -// WithEngine sets the engine that the TLBs to use -func (b Builder) WithEngine(engine sim.Engine) Builder { - b.engine = engine - return b -} - -// WithFreq sets the freq the TLBs use -func (b Builder) WithFreq(freq sim.Freq) Builder { - b.freq = freq - return b -} - -// WithNumSets sets the number of sets in a TLB. Use 1 for fully associated -// TLBs. -func (b Builder) WithNumSets(n int) Builder { - b.numSets = n - return b -} - -// WithNumWays sets the number of ways in a TLB. Set this field to the number -// of TLB entries for all the functions. -func (b Builder) WithNumWays(n int) Builder { - b.numWays = n - return b -} - -// WithPageSize sets the page size that the TLB works with. -func (b Builder) WithPageSize(n uint64) Builder { - b.pageSize = n - return b -} - -// WithNumReqPerCycle sets the number of requests per cycle can be processed by -// a TLB -func (b Builder) WithNumReqPerCycle(n int) Builder { - b.numReqPerCycle = n - return b -} - -// WithLowModule sets the port that can provide the address translation in case -// of tlb miss. -func (b Builder) WithLowModule(lowModule sim.Port) Builder { - b.lowModule = lowModule - return b -} - -// WithNumMSHREntry sets the number of mshr entry -func (b Builder) WithNumMSHREntry(num int) Builder { - b.numMSHREntry = num - return b -} - -func (b Builder) WithDeviceID(deviceID uint64) Builder { - b.deviceID = deviceID - return b -} - -func (b Builder) WithOnlyStoreLocalPageAddress(flag bool) Builder { - b.onlyStoreLocalPageAddress = flag - return b -} - -// Build creates a new TLB -func (b Builder) Build(name string) *TLB { - tlb := &TLB{} - tlb.TickingComponent = - sim.NewTickingComponent(name, b.engine, b.freq, tlb) - - tlb.numSets = b.numSets - tlb.numWays = b.numWays - tlb.numReqPerCycle = b.numReqPerCycle - tlb.pageSize = b.pageSize - tlb.LowModule = b.lowModule - tlb.mshr = newMSHR(b.numMSHREntry) - tlb.deviceID = b.deviceID - tlb.onlyStoreLocalPageAddress = b.onlyStoreLocalPageAddress - - b.createPorts(name, tlb) - - tlb.reset() - - return tlb -} - -func (b Builder) createPorts(name string, tlb *TLB) { - tlb.topPort = sim.NewLimitNumMsgPort(tlb, b.numReqPerCycle, - name+".TopPort") - tlb.AddPort("Top", tlb.topPort) - - tlb.bottomPort = sim.NewLimitNumMsgPort(tlb, b.numReqPerCycle, - name+".BottomPort") - tlb.AddPort("Bottom", tlb.bottomPort) - - tlb.controlPort = sim.NewLimitNumMsgPort(tlb, 1, - name+".ControlPort") - tlb.AddPort("Control", tlb.controlPort) -} diff --git a/mem/vm/tlb-local/doc.go b/mem/vm/tlb-local/doc.go deleted file mode 100644 index 43b8110b..00000000 --- a/mem/vm/tlb-local/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package tlb provides a TLB component implementation. -package tlb diff --git a/mem/vm/tlb-local/internal/set.go b/mem/vm/tlb-local/internal/set.go deleted file mode 100644 index 95a06a9f..00000000 --- a/mem/vm/tlb-local/internal/set.go +++ /dev/null @@ -1,116 +0,0 @@ -// Package internal provides the definition required for defining TLB. -package internal - -import ( - "fmt" - "sort" - - "github.com/sarchlab/akita/v3/mem/vm" -) - -// A Set holds a certain number of pages. -type Set interface { - Lookup(pid vm.PID, vAddr uint64) (wayID int, page vm.Page, found bool) - Update(wayID int, page vm.Page) - Evict() (wayID int, ok bool) - Visit(wayID int) -} - -// NewSet creates a new TLB set. -func NewSet(numWays int) Set { - s := &setImpl{} - s.blocks = make([]*block, numWays) - s.visitList = make([]*block, 0, numWays) - s.vAddrWayIDMap = make(map[string]int) - for i := range s.blocks { - b := &block{} - s.blocks[i] = b - b.wayID = i - s.Visit(i) - } - return s -} - -type block struct { - page vm.Page - wayID int - lastVisit uint64 -} - -func (b *block) Less(anotherBlock *block) bool { - return b.lastVisit < anotherBlock.lastVisit -} - -type setImpl struct { - blocks []*block - vAddrWayIDMap map[string]int - visitList []*block - visitCount uint64 -} - -func (s *setImpl) keyString(pid vm.PID, vAddr uint64) string { - return fmt.Sprintf("%d%016x", pid, vAddr) -} - -func (s *setImpl) Lookup(pid vm.PID, vAddr uint64) ( - wayID int, - page vm.Page, - found bool, -) { - key := s.keyString(pid, vAddr) - wayID, ok := s.vAddrWayIDMap[key] - if !ok { - return 0, vm.Page{}, false - } - - block := s.blocks[wayID] - - return block.wayID, block.page, true -} - -func (s *setImpl) Update(wayID int, page vm.Page) { - block := s.blocks[wayID] - key := s.keyString(block.page.PID, block.page.VAddr) - delete(s.vAddrWayIDMap, key) - - block.page = page - key = s.keyString(page.PID, page.VAddr) - s.vAddrWayIDMap[key] = wayID -} - -func (s *setImpl) Evict() (wayID int, ok bool) { - if s.hasNothingToEvict() { - return 0, false - } - - // wayID = s.visitTree.DeleteMin().(*block).wayID - leastVisited := s.visitList[0] - wayID = leastVisited.wayID - s.visitList = s.visitList[1:] - return wayID, true -} - -func (s *setImpl) Visit(wayID int) { - block := s.blocks[wayID] - - for i, b := range s.visitList { - if b.wayID == wayID { - s.visitList = append(s.visitList[:i], s.visitList[i+1:]...) - } - } - - s.visitCount++ - block.lastVisit = s.visitCount - - index := sort.Search(len(s.visitList), func(i int) bool { - return s.visitList[i].lastVisit > block.lastVisit - }) - - s.visitList = append(s.visitList, nil) - copy(s.visitList[index+1:], s.visitList[index:]) - s.visitList[index] = block -} - -func (s *setImpl) hasNothingToEvict() bool { - return len(s.visitList) == 0 -} diff --git a/mem/vm/tlb-local/mock_internal_test.go b/mem/vm/tlb-local/mock_internal_test.go deleted file mode 100644 index 44d1e930..00000000 --- a/mem/vm/tlb-local/mock_internal_test.go +++ /dev/null @@ -1,89 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/sarchlab/akita/v3/mem/vm/tlb/internal (interfaces: Set) - -package tlb - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - vm "github.com/sarchlab/akita/v3/mem/vm" -) - -// MockSet is a mock of Set interface. -type MockSet struct { - ctrl *gomock.Controller - recorder *MockSetMockRecorder -} - -// MockSetMockRecorder is the mock recorder for MockSet. -type MockSetMockRecorder struct { - mock *MockSet -} - -// NewMockSet creates a new mock instance. -func NewMockSet(ctrl *gomock.Controller) *MockSet { - mock := &MockSet{ctrl: ctrl} - mock.recorder = &MockSetMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockSet) EXPECT() *MockSetMockRecorder { - return m.recorder -} - -// Evict mocks base method. -func (m *MockSet) Evict() (int, bool) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Evict") - ret0, _ := ret[0].(int) - ret1, _ := ret[1].(bool) - return ret0, ret1 -} - -// Evict indicates an expected call of Evict. -func (mr *MockSetMockRecorder) Evict() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Evict", reflect.TypeOf((*MockSet)(nil).Evict)) -} - -// Lookup mocks base method. -func (m *MockSet) Lookup(arg0 vm.PID, arg1 uint64) (int, vm.Page, bool) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Lookup", arg0, arg1) - ret0, _ := ret[0].(int) - ret1, _ := ret[1].(vm.Page) - ret2, _ := ret[2].(bool) - return ret0, ret1, ret2 -} - -// Lookup indicates an expected call of Lookup. -func (mr *MockSetMockRecorder) Lookup(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Lookup", reflect.TypeOf((*MockSet)(nil).Lookup), arg0, arg1) -} - -// Update mocks base method. -func (m *MockSet) Update(arg0 int, arg1 vm.Page) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Update", arg0, arg1) -} - -// Update indicates an expected call of Update. -func (mr *MockSetMockRecorder) Update(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockSet)(nil).Update), arg0, arg1) -} - -// Visit mocks base method. -func (m *MockSet) Visit(arg0 int) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Visit", arg0) -} - -// Visit indicates an expected call of Visit. -func (mr *MockSetMockRecorder) Visit(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Visit", reflect.TypeOf((*MockSet)(nil).Visit), arg0) -} diff --git a/mem/vm/tlb-local/mock_mem_test.go b/mem/vm/tlb-local/mock_mem_test.go deleted file mode 100644 index 41a4c0d1..00000000 --- a/mem/vm/tlb-local/mock_mem_test.go +++ /dev/null @@ -1,48 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/sarchlab/akita/v3/mem/mem (interfaces: LowModuleFinder) - -package tlb - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - sim "github.com/sarchlab/akita/v3/sim" -) - -// MockLowModuleFinder is a mock of LowModuleFinder interface. -type MockLowModuleFinder struct { - ctrl *gomock.Controller - recorder *MockLowModuleFinderMockRecorder -} - -// MockLowModuleFinderMockRecorder is the mock recorder for MockLowModuleFinder. -type MockLowModuleFinderMockRecorder struct { - mock *MockLowModuleFinder -} - -// NewMockLowModuleFinder creates a new mock instance. -func NewMockLowModuleFinder(ctrl *gomock.Controller) *MockLowModuleFinder { - mock := &MockLowModuleFinder{ctrl: ctrl} - mock.recorder = &MockLowModuleFinderMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockLowModuleFinder) EXPECT() *MockLowModuleFinderMockRecorder { - return m.recorder -} - -// Find mocks base method. -func (m *MockLowModuleFinder) Find(arg0 uint64) sim.Port { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Find", arg0) - ret0, _ := ret[0].(sim.Port) - return ret0 -} - -// Find indicates an expected call of Find. -func (mr *MockLowModuleFinderMockRecorder) Find(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockLowModuleFinder)(nil).Find), arg0) -} diff --git a/mem/vm/tlb-local/mock_sim_test.go b/mem/vm/tlb-local/mock_sim_test.go deleted file mode 100644 index 7ad782a3..00000000 --- a/mem/vm/tlb-local/mock_sim_test.go +++ /dev/null @@ -1,422 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/sarchlab/akita/v3/sim (interfaces: Port,Engine,BufferedSender) - -package tlb - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - sim "github.com/sarchlab/akita/v3/sim" -) - -// MockPort is a mock of Port interface. -type MockPort struct { - ctrl *gomock.Controller - recorder *MockPortMockRecorder -} - -// MockPortMockRecorder is the mock recorder for MockPort. -type MockPortMockRecorder struct { - mock *MockPort -} - -// NewMockPort creates a new mock instance. -func NewMockPort(ctrl *gomock.Controller) *MockPort { - mock := &MockPort{ctrl: ctrl} - mock.recorder = &MockPortMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockPort) EXPECT() *MockPortMockRecorder { - return m.recorder -} - -// AcceptHook mocks base method. -func (m *MockPort) AcceptHook(arg0 sim.Hook) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AcceptHook", arg0) -} - -// AcceptHook indicates an expected call of AcceptHook. -func (mr *MockPortMockRecorder) AcceptHook(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AcceptHook", reflect.TypeOf((*MockPort)(nil).AcceptHook), arg0) -} - -// CanSend mocks base method. -func (m *MockPort) CanSend() bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CanSend") - ret0, _ := ret[0].(bool) - return ret0 -} - -// CanSend indicates an expected call of CanSend. -func (mr *MockPortMockRecorder) CanSend() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanSend", reflect.TypeOf((*MockPort)(nil).CanSend)) -} - -// Component mocks base method. -func (m *MockPort) Component() sim.Component { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Component") - ret0, _ := ret[0].(sim.Component) - return ret0 -} - -// Component indicates an expected call of Component. -func (mr *MockPortMockRecorder) Component() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Component", reflect.TypeOf((*MockPort)(nil).Component)) -} - -// Hooks mocks base method. -func (m *MockPort) Hooks() []sim.Hook { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Hooks") - ret0, _ := ret[0].([]sim.Hook) - return ret0 -} - -// Hooks indicates an expected call of Hooks. -func (mr *MockPortMockRecorder) Hooks() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Hooks", reflect.TypeOf((*MockPort)(nil).Hooks)) -} - -// Name mocks base method. -func (m *MockPort) Name() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Name") - ret0, _ := ret[0].(string) - return ret0 -} - -// Name indicates an expected call of Name. -func (mr *MockPortMockRecorder) Name() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockPort)(nil).Name)) -} - -// NotifyAvailable mocks base method. -func (m *MockPort) NotifyAvailable(arg0 sim.VTimeInSec) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "NotifyAvailable", arg0) -} - -// NotifyAvailable indicates an expected call of NotifyAvailable. -func (mr *MockPortMockRecorder) NotifyAvailable(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NotifyAvailable", reflect.TypeOf((*MockPort)(nil).NotifyAvailable), arg0) -} - -// NumHooks mocks base method. -func (m *MockPort) NumHooks() int { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NumHooks") - ret0, _ := ret[0].(int) - return ret0 -} - -// NumHooks indicates an expected call of NumHooks. -func (mr *MockPortMockRecorder) NumHooks() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumHooks", reflect.TypeOf((*MockPort)(nil).NumHooks)) -} - -// Peek mocks base method. -func (m *MockPort) Peek() sim.Msg { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Peek") - ret0, _ := ret[0].(sim.Msg) - return ret0 -} - -// Peek indicates an expected call of Peek. -func (mr *MockPortMockRecorder) Peek() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Peek", reflect.TypeOf((*MockPort)(nil).Peek)) -} - -// Recv mocks base method. -func (m *MockPort) Recv(arg0 sim.Msg) *sim.SendError { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Recv", arg0) - ret0, _ := ret[0].(*sim.SendError) - return ret0 -} - -// Recv indicates an expected call of Recv. -func (mr *MockPortMockRecorder) Recv(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockPort)(nil).Recv), arg0) -} - -// Retrieve mocks base method. -func (m *MockPort) Retrieve(arg0 sim.VTimeInSec) sim.Msg { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Retrieve", arg0) - ret0, _ := ret[0].(sim.Msg) - return ret0 -} - -// Retrieve indicates an expected call of Retrieve. -func (mr *MockPortMockRecorder) Retrieve(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Retrieve", reflect.TypeOf((*MockPort)(nil).Retrieve), arg0) -} - -// Send mocks base method. -func (m *MockPort) Send(arg0 sim.Msg) *sim.SendError { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Send", arg0) - ret0, _ := ret[0].(*sim.SendError) - return ret0 -} - -// Send indicates an expected call of Send. -func (mr *MockPortMockRecorder) Send(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockPort)(nil).Send), arg0) -} - -// SetConnection mocks base method. -func (m *MockPort) SetConnection(arg0 sim.Connection) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "SetConnection", arg0) -} - -// SetConnection indicates an expected call of SetConnection. -func (mr *MockPortMockRecorder) SetConnection(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConnection", reflect.TypeOf((*MockPort)(nil).SetConnection), arg0) -} - -// MockEngine is a mock of Engine interface. -type MockEngine struct { - ctrl *gomock.Controller - recorder *MockEngineMockRecorder -} - -// MockEngineMockRecorder is the mock recorder for MockEngine. -type MockEngineMockRecorder struct { - mock *MockEngine -} - -// NewMockEngine creates a new mock instance. -func NewMockEngine(ctrl *gomock.Controller) *MockEngine { - mock := &MockEngine{ctrl: ctrl} - mock.recorder = &MockEngineMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockEngine) EXPECT() *MockEngineMockRecorder { - return m.recorder -} - -// AcceptHook mocks base method. -func (m *MockEngine) AcceptHook(arg0 sim.Hook) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AcceptHook", arg0) -} - -// AcceptHook indicates an expected call of AcceptHook. -func (mr *MockEngineMockRecorder) AcceptHook(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AcceptHook", reflect.TypeOf((*MockEngine)(nil).AcceptHook), arg0) -} - -// Continue mocks base method. -func (m *MockEngine) Continue() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Continue") -} - -// Continue indicates an expected call of Continue. -func (mr *MockEngineMockRecorder) Continue() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Continue", reflect.TypeOf((*MockEngine)(nil).Continue)) -} - -// CurrentTime mocks base method. -func (m *MockEngine) CurrentTime() sim.VTimeInSec { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CurrentTime") - ret0, _ := ret[0].(sim.VTimeInSec) - return ret0 -} - -// CurrentTime indicates an expected call of CurrentTime. -func (mr *MockEngineMockRecorder) CurrentTime() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CurrentTime", reflect.TypeOf((*MockEngine)(nil).CurrentTime)) -} - -// Finished mocks base method. -func (m *MockEngine) Finished() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Finished") -} - -// Finished indicates an expected call of Finished. -func (mr *MockEngineMockRecorder) Finished() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finished", reflect.TypeOf((*MockEngine)(nil).Finished)) -} - -// Hooks mocks base method. -func (m *MockEngine) Hooks() []sim.Hook { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Hooks") - ret0, _ := ret[0].([]sim.Hook) - return ret0 -} - -// Hooks indicates an expected call of Hooks. -func (mr *MockEngineMockRecorder) Hooks() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Hooks", reflect.TypeOf((*MockEngine)(nil).Hooks)) -} - -// NumHooks mocks base method. -func (m *MockEngine) NumHooks() int { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NumHooks") - ret0, _ := ret[0].(int) - return ret0 -} - -// NumHooks indicates an expected call of NumHooks. -func (mr *MockEngineMockRecorder) NumHooks() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumHooks", reflect.TypeOf((*MockEngine)(nil).NumHooks)) -} - -// Pause mocks base method. -func (m *MockEngine) Pause() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Pause") -} - -// Pause indicates an expected call of Pause. -func (mr *MockEngineMockRecorder) Pause() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Pause", reflect.TypeOf((*MockEngine)(nil).Pause)) -} - -// RegisterSimulationEndHandler mocks base method. -func (m *MockEngine) RegisterSimulationEndHandler(arg0 sim.SimulationEndHandler) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RegisterSimulationEndHandler", arg0) -} - -// RegisterSimulationEndHandler indicates an expected call of RegisterSimulationEndHandler. -func (mr *MockEngineMockRecorder) RegisterSimulationEndHandler(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterSimulationEndHandler", reflect.TypeOf((*MockEngine)(nil).RegisterSimulationEndHandler), arg0) -} - -// Run mocks base method. -func (m *MockEngine) Run() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Run") - ret0, _ := ret[0].(error) - return ret0 -} - -// Run indicates an expected call of Run. -func (mr *MockEngineMockRecorder) Run() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockEngine)(nil).Run)) -} - -// Schedule mocks base method. -func (m *MockEngine) Schedule(arg0 sim.Event) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Schedule", arg0) -} - -// Schedule indicates an expected call of Schedule. -func (mr *MockEngineMockRecorder) Schedule(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Schedule", reflect.TypeOf((*MockEngine)(nil).Schedule), arg0) -} - -// MockBufferedSender is a mock of BufferedSender interface. -type MockBufferedSender struct { - ctrl *gomock.Controller - recorder *MockBufferedSenderMockRecorder -} - -// MockBufferedSenderMockRecorder is the mock recorder for MockBufferedSender. -type MockBufferedSenderMockRecorder struct { - mock *MockBufferedSender -} - -// NewMockBufferedSender creates a new mock instance. -func NewMockBufferedSender(ctrl *gomock.Controller) *MockBufferedSender { - mock := &MockBufferedSender{ctrl: ctrl} - mock.recorder = &MockBufferedSenderMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockBufferedSender) EXPECT() *MockBufferedSenderMockRecorder { - return m.recorder -} - -// CanSend mocks base method. -func (m *MockBufferedSender) CanSend(arg0 int) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CanSend", arg0) - ret0, _ := ret[0].(bool) - return ret0 -} - -// CanSend indicates an expected call of CanSend. -func (mr *MockBufferedSenderMockRecorder) CanSend(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanSend", reflect.TypeOf((*MockBufferedSender)(nil).CanSend), arg0) -} - -// Clear mocks base method. -func (m *MockBufferedSender) Clear() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Clear") -} - -// Clear indicates an expected call of Clear. -func (mr *MockBufferedSenderMockRecorder) Clear() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clear", reflect.TypeOf((*MockBufferedSender)(nil).Clear)) -} - -// Send mocks base method. -func (m *MockBufferedSender) Send(arg0 sim.Msg) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Send", arg0) -} - -// Send indicates an expected call of Send. -func (mr *MockBufferedSenderMockRecorder) Send(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockBufferedSender)(nil).Send), arg0) -} - -// Tick mocks base method. -func (m *MockBufferedSender) Tick(arg0 sim.VTimeInSec) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Tick", arg0) - ret0, _ := ret[0].(bool) - return ret0 -} - -// Tick indicates an expected call of Tick. -func (mr *MockBufferedSenderMockRecorder) Tick(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Tick", reflect.TypeOf((*MockBufferedSender)(nil).Tick), arg0) -} diff --git a/mem/vm/tlb-local/tlb.go b/mem/vm/tlb-local/tlb.go deleted file mode 100644 index c6d009f2..00000000 --- a/mem/vm/tlb-local/tlb.go +++ /dev/null @@ -1,369 +0,0 @@ -package tlb - -import ( - "log" - "reflect" - - "github.com/sarchlab/akita/v3/mem/vm" - "github.com/sarchlab/akita/v3/mem/vm/tlb/internal" - "github.com/sarchlab/akita/v3/sim" - "github.com/sarchlab/akita/v3/tracing" -) - -// A TLB is a cache that maintains some page information. -type TLB struct { - *sim.TickingComponent - - topPort sim.Port - bottomPort sim.Port - controlPort sim.Port - - LowModule sim.Port - - numSets int - numWays int - pageSize uint64 - numReqPerCycle int - - Sets []internal.Set - - mshr mshr - respondingMSHREntry *mshrEntry - - isPaused bool - - deviceID uint64 -} - -// Reset sets all the entries int he TLB to be invalid -func (tlb *TLB) reset() { - tlb.Sets = make([]internal.Set, tlb.numSets) - for i := 0; i < tlb.numSets; i++ { - set := internal.NewSet(tlb.numWays) - tlb.Sets[i] = set - } -} - -// Tick defines how TLB update states at each cycle -func (tlb *TLB) Tick(now sim.VTimeInSec) bool { - madeProgress := false - - madeProgress = tlb.performCtrlReq(now) || madeProgress - - if !tlb.isPaused { - for i := 0; i < tlb.numReqPerCycle; i++ { - madeProgress = tlb.respondMSHREntry(now) || madeProgress - } - - for i := 0; i < tlb.numReqPerCycle; i++ { - madeProgress = tlb.lookup(now) || madeProgress - } - - for i := 0; i < tlb.numReqPerCycle; i++ { - madeProgress = tlb.parseBottom(now) || madeProgress - } - } - - return madeProgress -} - -func (tlb *TLB) respondMSHREntry(now sim.VTimeInSec) bool { - if tlb.respondingMSHREntry == nil { - return false - } - - mshrEntry := tlb.respondingMSHREntry - page := mshrEntry.page - req := mshrEntry.Requests[0] - - rspToTop := vm.TranslationRspBuilder{}. - WithSendTime(now). - WithSrc(tlb.topPort). - WithDst(req.Src). - WithRspTo(req.ID). - WithPage(page). - WithTaskID(req.TaskID). - Build() - err := tlb.topPort.Send(rspToTop) - if err != nil { - return false - } - - // fmt.Printf("%0.9f,%s,MSHRRspToTop,%s\n", - // float64(now), tlb.topPort.Name(), rspToTop.TaskID) - - mshrEntry.Requests = mshrEntry.Requests[1:] - if len(mshrEntry.Requests) == 0 { - tlb.respondingMSHREntry = nil - } - - tracing.TraceReqComplete(req, tlb) - return true -} - -func (tlb *TLB) lookup(now sim.VTimeInSec) bool { - msg := tlb.topPort.Peek() - if msg == nil { - return false - } - - req := msg.(*vm.TranslationReq) - - // fmt.Printf("%0.9f,%s,FetchReqFromTop,%s\n", - // float64(now), tlb.topPort.Name(), req.TaskID) - - mshrEntry := tlb.mshr.Query(req.PID, req.VAddr) - if mshrEntry != nil { - return tlb.processTLBMSHRHit(now, mshrEntry, req) - } - - if tlb.deviceID != req.DeviceID { - fetched := tlb.fetchBottom(now, req) - if fetched { - tlb.topPort.Retrieve(now) - tracing.TraceReqReceive(req, tlb) - tracing.AddTaskStep(tracing.MsgIDAtReceiver(req, tlb), tlb, "miss") - tracing.TraceReqComplete(req, tlb) - } - return fetched - } - - setID := tlb.vAddrToSetID(req.VAddr) - set := tlb.Sets[setID] - wayID, page, found := set.Lookup(req.PID, req.VAddr) - if found && page.Valid { - return tlb.handleTranslationHit(now, req, setID, wayID, page) - } - - return tlb.handleTranslationMiss(now, req) -} - -func (tlb *TLB) handleTranslationHit( - now sim.VTimeInSec, - req *vm.TranslationReq, - setID, wayID int, - page vm.Page, -) bool { - ok := tlb.sendRspToTop(now, req, page) - if !ok { - return false - } - - tlb.visit(setID, wayID) - tlb.topPort.Retrieve(now) - - tracing.TraceReqReceive(req, tlb) - tracing.AddTaskStep(tracing.MsgIDAtReceiver(req, tlb), tlb, "hit") - tracing.TraceReqComplete(req, tlb) - - return true -} - -func (tlb *TLB) handleTranslationMiss( - now sim.VTimeInSec, - req *vm.TranslationReq, -) bool { - if tlb.mshr.IsFull() { - return false - } - - fetched := tlb.fetchBottom(now, req) - if fetched { - tlb.topPort.Retrieve(now) - tracing.TraceReqReceive(req, tlb) - tracing.AddTaskStep(tracing.MsgIDAtReceiver(req, tlb), tlb, "miss") - return true - } - - return false -} - -func (tlb *TLB) vAddrToSetID(vAddr uint64) (setID int) { - return int(vAddr / tlb.pageSize % uint64(tlb.numSets)) -} - -func (tlb *TLB) sendRspToTop( - now sim.VTimeInSec, - req *vm.TranslationReq, - page vm.Page, -) bool { - rsp := vm.TranslationRspBuilder{}. - WithSendTime(now). - WithSrc(tlb.topPort). - WithDst(req.Src). - WithRspTo(req.ID). - WithPage(page). - Build() - - err := tlb.topPort.Send(rsp) - if err != nil { - return false - } - - // fmt.Printf("%0.9f,%s,RspToTop,%s\n", - // float64(now), tlb.topPort.Name(), rsp.TaskID) - - return true -} - -func (tlb *TLB) processTLBMSHRHit( - now sim.VTimeInSec, - mshrEntry *mshrEntry, - req *vm.TranslationReq, -) bool { - mshrEntry.Requests = append(mshrEntry.Requests, req) - - tlb.topPort.Retrieve(now) - tracing.TraceReqReceive(req, tlb) - tracing.AddTaskStep(tracing.MsgIDAtReceiver(req, tlb), tlb, "mshr-hit") - - return true -} - -func (tlb *TLB) fetchBottom(now sim.VTimeInSec, req *vm.TranslationReq) bool { - fetchBottom := vm.TranslationReqBuilder{}. - WithSendTime(now). - WithSrc(tlb.bottomPort). - WithDst(tlb.LowModule). - WithPID(req.PID). - WithVAddr(req.VAddr). - WithDeviceID(req.DeviceID). - WithTaskID(req.TaskID). - Build() - err := tlb.bottomPort.Send(fetchBottom) - if err != nil { - return false - } - - // fmt.Printf("%0.9f,%s,SendReq,%s\n", - // float64(now), tlb.bottomPort.Name(), fetchBottom.TaskID) - - mshrEntry := tlb.mshr.Add(req.PID, req.VAddr) - mshrEntry.Requests = append(mshrEntry.Requests, req) - mshrEntry.reqToBottom = fetchBottom - - tracing.TraceReqInitiate(fetchBottom, tlb, - tracing.MsgIDAtReceiver(req, tlb)) - - return true -} - -func (tlb *TLB) parseBottom(now sim.VTimeInSec) bool { - if tlb.respondingMSHREntry != nil { - return false - } - - item := tlb.bottomPort.Peek() - if item == nil { - return false - } - - rsp := item.(*vm.TranslationRsp) - page := rsp.Page - - mshrEntryPresent := tlb.mshr.IsEntryPresent(rsp.Page.PID, rsp.Page.VAddr) - if !mshrEntryPresent { - tlb.bottomPort.Retrieve(now) - return true - } - - // Local address case - if page.DeviceID == tlb.deviceID { - setID := tlb.vAddrToSetID(page.VAddr) - set := tlb.Sets[setID] - wayID, ok := tlb.Sets[setID].Evict() - if !ok { - panic("failed to evict") - } - set.Update(wayID, page) - set.Visit(wayID) - } - mshrEntry := tlb.mshr.GetEntry(rsp.Page.PID, rsp.Page.VAddr) - tlb.respondingMSHREntry = mshrEntry - mshrEntry.page = page - - tlb.mshr.Remove(rsp.Page.PID, rsp.Page.VAddr) - tlb.bottomPort.Retrieve(now) - tracing.TraceReqFinalize(mshrEntry.reqToBottom, tlb) - - return true -} - -func (tlb *TLB) performCtrlReq(now sim.VTimeInSec) bool { - item := tlb.controlPort.Peek() - if item == nil { - return false - } - - item = tlb.controlPort.Retrieve(now) - - switch req := item.(type) { - case *FlushReq: - return tlb.handleTLBFlush(now, req) - case *RestartReq: - return tlb.handleTLBRestart(now, req) - default: - log.Panicf("cannot process request %s", reflect.TypeOf(req)) - } - - return true -} - -func (tlb *TLB) visit(setID, wayID int) { - set := tlb.Sets[setID] - set.Visit(wayID) -} - -func (tlb *TLB) handleTLBFlush(now sim.VTimeInSec, req *FlushReq) bool { - rsp := FlushRspBuilder{}. - WithSrc(tlb.controlPort). - WithDst(req.Src). - WithSendTime(now). - Build() - - err := tlb.controlPort.Send(rsp) - if err != nil { - return false - } - - for _, vAddr := range req.VAddr { - setID := tlb.vAddrToSetID(vAddr) - set := tlb.Sets[setID] - wayID, page, found := set.Lookup(req.PID, vAddr) - if !found { - continue - } - - page.Valid = false - set.Update(wayID, page) - } - - tlb.mshr.Reset() - tlb.isPaused = true - return true -} - -func (tlb *TLB) handleTLBRestart(now sim.VTimeInSec, req *RestartReq) bool { - rsp := RestartRspBuilder{}. - WithSendTime(now). - WithSrc(tlb.controlPort). - WithDst(req.Src). - Build() - - err := tlb.controlPort.Send(rsp) - if err != nil { - return false - } - - tlb.isPaused = false - - for tlb.topPort.Retrieve(now) != nil { - tlb.topPort.Retrieve(now) - } - - for tlb.bottomPort.Retrieve(now) != nil { - tlb.bottomPort.Retrieve(now) - } - - return true -} diff --git a/mem/vm/tlb-local/tlb_suite_test.go b/mem/vm/tlb-local/tlb_suite_test.go deleted file mode 100644 index 381354bf..00000000 --- a/mem/vm/tlb-local/tlb_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package tlb - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -//go:generate mockgen -destination "mock_sim_test.go" -package $GOPACKAGE -write_package_comment=false github.com/sarchlab/akita/v3/sim Port,Engine,BufferedSender -//go:generate mockgen -destination "mock_mem_test.go" -package $GOPACKAGE -write_package_comment=false github.com/sarchlab/akita/v3/mem/mem LowModuleFinder -//go:generate mockgen -destination "mock_internal_test.go" -package $GOPACKAGE -write_package_comment=false github.com/sarchlab/akita/v3/mem/vm/tlb/internal Set -func TestTlb(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Tlb Suite") -} diff --git a/mem/vm/tlb-local/tlb_test.go b/mem/vm/tlb-local/tlb_test.go deleted file mode 100644 index 0d27c3e7..00000000 --- a/mem/vm/tlb-local/tlb_test.go +++ /dev/null @@ -1,480 +0,0 @@ -package tlb - -import ( - "github.com/golang/mock/gomock" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - "github.com/sarchlab/akita/v3/mem/vm" - "github.com/sarchlab/akita/v3/mem/vm/tlb/internal" - "github.com/sarchlab/akita/v3/sim" -) - -var _ = Describe("TLB", func() { - - var ( - mockCtrl *gomock.Controller - engine *MockEngine - tlb *TLB - set *MockSet - topPort *MockPort - bottomPort *MockPort - controlPort *MockPort - ) - - BeforeEach(func() { - mockCtrl = gomock.NewController(GinkgoT()) - engine = NewMockEngine(mockCtrl) - set = NewMockSet(mockCtrl) - topPort = NewMockPort(mockCtrl) - bottomPort = NewMockPort(mockCtrl) - controlPort = NewMockPort(mockCtrl) - - tlb = MakeBuilder().WithEngine(engine).Build("TLB") - tlb.topPort = topPort - tlb.bottomPort = bottomPort - tlb.controlPort = controlPort - tlb.Sets = []internal.Set{set} - }) - - AfterEach(func() { - mockCtrl.Finish() - }) - - It("should do nothing if there is no req in TopPort", func() { - topPort.EXPECT().Peek().Return(nil) - - madeProgress := tlb.lookup(10) - - Expect(madeProgress).To(BeFalse()) - }) - - Context("hit", func() { - var ( - wayID int - page vm.Page - req *vm.TranslationReq - ) - - BeforeEach(func() { - wayID = 1 - page = vm.Page{ - PID: 1, - VAddr: 0x100, - PAddr: 0x200, - Valid: true, - } - set.EXPECT().Lookup(vm.PID(1), uint64(0x100)). - Return(wayID, page, true) - - req = vm.TranslationReqBuilder{}. - WithSendTime(5). - WithPID(1). - WithVAddr(uint64(0x100)). - WithDeviceID(1). - Build() - }) - - It("should respond to top", func() { - topPort.EXPECT().Peek().Return(req) - topPort.EXPECT().Retrieve(gomock.Any()) - topPort.EXPECT().Send(gomock.Any()) - - set.EXPECT().Visit(wayID) - - madeProgress := tlb.lookup(10) - - Expect(madeProgress).To(BeTrue()) - }) - - It("should stall if cannot send to top", func() { - topPort.EXPECT().Peek().Return(req) - topPort.EXPECT().Send(gomock.Any()). - Return(&sim.SendError{}) - - madeProgress := tlb.lookup(10) - - Expect(madeProgress).To(BeFalse()) - }) - }) - - Context("miss", func() { - var ( - wayID int - page vm.Page - req *vm.TranslationReq - ) - - BeforeEach(func() { - wayID = 1 - page = vm.Page{ - PID: 1, - VAddr: 0x100, - PAddr: 0x200, - Valid: false, - } - set.EXPECT(). - Lookup(vm.PID(1), uint64(0x100)). - Return(wayID, page, true). - AnyTimes() - - req = vm.TranslationReqBuilder{}. - WithSendTime(5). - WithPID(1). - WithVAddr(0x100). - WithDeviceID(1). - Build() - }) - - It("should fetch from bottom and add entry to MSHR", func() { - topPort.EXPECT().Peek().Return(req) - topPort.EXPECT().Retrieve(gomock.Any()) - bottomPort.EXPECT().Send(gomock.Any()). - Do(func(req *vm.TranslationReq) { - Expect(req.VAddr).To(Equal(uint64(0x100))) - Expect(req.PID).To(Equal(vm.PID(1))) - Expect(req.DeviceID).To(Equal(uint64(1))) - }). - Return(nil) - - madeProgress := tlb.lookup(10) - - Expect(madeProgress).To(BeTrue()) - Expect(tlb.mshr.IsEntryPresent(vm.PID(1), uint64(0x100))).To(Equal(true)) - }) - - It("should find the entry in MSHR and not request from bottom", func() { - tlb.mshr.Add(1, 0x100) - topPort.EXPECT().Peek().Return(req) - topPort.EXPECT().Retrieve(gomock.Any()) - - madeProgress := tlb.lookup(10) - Expect(tlb.mshr.IsEntryPresent(vm.PID(1), uint64(0x100))). - To(Equal(true)) - Expect(madeProgress).To(BeTrue()) - }) - - It("should stall if bottom is busy", func() { - topPort.EXPECT().Peek().Return(req) - bottomPort.EXPECT().Send(gomock.Any()). - Return(&sim.SendError{}) - - madeProgress := tlb.lookup(10) - - Expect(madeProgress).To(BeFalse()) - }) - }) - - Context("parse bottom", func() { - var ( - wayID int - req *vm.TranslationReq - fetchBottom *vm.TranslationReq - page vm.Page - rsp *vm.TranslationRsp - ) - - BeforeEach(func() { - wayID = 1 - req = vm.TranslationReqBuilder{}. - WithSendTime(5). - WithPID(1). - WithVAddr(0x100). - WithDeviceID(1). - Build() - fetchBottom = vm.TranslationReqBuilder{}. - WithSendTime(5). - WithPID(1). - WithVAddr(0x100). - WithDeviceID(1). - Build() - page = vm.Page{ - PID: 1, - VAddr: 0x100, - PAddr: 0x200, - Valid: true, - } - rsp = vm.TranslationRspBuilder{}. - WithSendTime(5). - WithRspTo(fetchBottom.ID). - WithPage(page). - Build() - }) - - It("should do nothing if no return", func() { - bottomPort.EXPECT().Peek().Return(nil) - - madeProgress := tlb.parseBottom(10) - - Expect(madeProgress).To(BeFalse()) - }) - - It("should stall if the TLB is responding to an MSHR entry", func() { - mshrEntry := tlb.mshr.Add(1, 0x100) - mshrEntry.Requests = append(mshrEntry.Requests, req) - tlb.respondingMSHREntry = mshrEntry - - madeProgress := tlb.parseBottom(10) - - Expect(madeProgress).To(BeFalse()) - }) - - It("should parse respond from bottom", func() { - bottomPort.EXPECT().Peek().Return(rsp) - bottomPort.EXPECT().Retrieve(gomock.Any()) - mshrEntry := tlb.mshr.Add(1, 0x100) - mshrEntry.Requests = append(mshrEntry.Requests, req) - mshrEntry.reqToBottom = &vm.TranslationReq{} - - set.EXPECT().Evict().Return(wayID, true) - set.EXPECT().Update(wayID, page) - set.EXPECT().Visit(wayID) - - // topPort.EXPECT().Send(gomock.Any()). - // Do(func(rsp *vm.TranslationRsp) { - // Expect(rsp.Page).To(Equal(page)) - // Expect(rsp.RespondTo).To(Equal(req.ID)) - // }) - - madeProgress := tlb.parseBottom(10) - - Expect(madeProgress).To(BeTrue()) - Expect(tlb.respondingMSHREntry).NotTo(BeNil()) - Expect(tlb.mshr.IsEntryPresent(vm.PID(1), uint64(0x100))). - To(Equal(false)) - }) - - It("should respond", func() { - mshrEntry := tlb.mshr.Add(1, 0x100) - mshrEntry.Requests = append(mshrEntry.Requests, req) - tlb.respondingMSHREntry = mshrEntry - - topPort.EXPECT().Send(gomock.Any()).Return(nil) - - madeProgress := tlb.respondMSHREntry(10) - - Expect(madeProgress).To(BeTrue()) - Expect(mshrEntry.Requests).To(HaveLen(0)) - Expect(tlb.respondingMSHREntry).To(BeNil()) - }) - }) - - Context("flush related handling", func() { - var ( - // flushReq *TLBFlushReq - // restartReq *TLBRestartReq - ) - - BeforeEach(func() { - - // restartReq = TLBRestartReqBuilder{}. - // WithSrc(nil). - // WithDst(nil). - // WithSendTime(10). - // Build() - }) - - It("should do nothing if no req", func() { - controlPort.EXPECT().Peek().Return(nil) - madeProgress := tlb.performCtrlReq(10) - Expect(madeProgress).To(BeFalse()) - }) - - It("should handle flush request", func() { - flushReq := FlushReqBuilder{}. - WithSrc(nil). - WithDst(nil). - WithSendTime(10). - WithVAddrs([]uint64{0x1000}). - WithPID(1). - Build() - page := vm.Page{ - PID: 1, - VAddr: 0x1000, - Valid: true, - } - wayID := 1 - - set.EXPECT().Lookup(vm.PID(1), uint64(0x1000)). - Return(wayID, page, true) - set.EXPECT().Update(wayID, vm.Page{ - PID: 1, - VAddr: 0x1000, - Valid: false, - }) - controlPort.EXPECT().Peek().Return(flushReq) - controlPort.EXPECT().Retrieve(sim.VTimeInSec(10)).Return(flushReq) - controlPort.EXPECT().Send(gomock.Any()) - - madeProgress := tlb.performCtrlReq(10) - - Expect(madeProgress).To(BeTrue()) - Expect(tlb.isPaused).To(BeTrue()) - }) - - It("should handle restart request", func() { - restartReq := RestartReqBuilder{}. - WithSrc(nil). - WithDst(nil). - WithSendTime(10). - Build() - controlPort.EXPECT().Peek(). - Return(restartReq) - controlPort.EXPECT().Retrieve(sim.VTimeInSec(10)). - Return(restartReq) - controlPort.EXPECT().Send(gomock.Any()) - topPort.EXPECT().Retrieve(gomock.Any()).Return(nil) - bottomPort.EXPECT().Retrieve(gomock.Any()).Return(nil) - - madeProgress := tlb.performCtrlReq(10) - - Expect(madeProgress).To(BeTrue()) - Expect(tlb.isPaused).To(BeFalse()) - }) - }) -}) - -var _ = Describe("TLB Integration", func() { - var ( - mockCtrl *gomock.Controller - engine sim.Engine - tlb *TLB - lowModule *MockPort - agent *MockPort - connection sim.Connection - page vm.Page - ) - - BeforeEach(func() { - mockCtrl = gomock.NewController(GinkgoT()) - engine = sim.NewSerialEngine() - lowModule = NewMockPort(mockCtrl) - agent = NewMockPort(mockCtrl) - connection = sim.NewDirectConnection("Conn", engine, 1*sim.GHz) - tlb = MakeBuilder().WithEngine(engine).Build("TLB") - tlb.LowModule = lowModule - - agent.EXPECT().SetConnection(connection) - lowModule.EXPECT().SetConnection(connection) - connection.PlugIn(agent, 10) - connection.PlugIn(lowModule, 10) - connection.PlugIn(tlb.topPort, 10) - connection.PlugIn(tlb.bottomPort, 10) - connection.PlugIn(tlb.controlPort, 10) - - page = vm.Page{ - PID: 1, - VAddr: 0x1000, - PAddr: 0x2000, - Valid: true, - } - lowModule.EXPECT().Recv(gomock.Any()). - Do(func(req *vm.TranslationReq) { - rsp := vm.TranslationRspBuilder{}. - WithSendTime(req.RecvTime + 1). - WithSrc(lowModule). - WithDst(req.Src). - WithPage(page). - WithRspTo(req.ID). - Build() - connection.Send(rsp) - }). - AnyTimes() - }) - - AfterEach(func() { - mockCtrl.Finish() - }) - - It("should do tlb miss", func() { - req := vm.TranslationReqBuilder{}. - WithSendTime(10). - WithSrc(agent). - WithDst(tlb.topPort). - WithPID(1). - WithVAddr(0x1000). - WithDeviceID(1). - Build() - req.RecvTime = 10 - tlb.topPort.Recv(req) - - agent.EXPECT().Recv(gomock.Any()). - Do(func(rsp *vm.TranslationRsp) { - Expect(rsp.Page).To(Equal(page)) - }) - - engine.Run() - }) - - It("should have faster hit than miss", func() { - time1 := sim.VTimeInSec(10) - req := vm.TranslationReqBuilder{}. - WithSendTime(time1). - WithSrc(agent). - WithDst(tlb.topPort). - WithPID(1). - WithVAddr(0x1000). - WithDeviceID(1). - Build() - req.RecvTime = time1 - tlb.topPort.Recv(req) - - agent.EXPECT().Recv(gomock.Any()). - Do(func(rsp *vm.TranslationRsp) { - Expect(rsp.Page).To(Equal(page)) - }) - - engine.Run() - - time2 := engine.CurrentTime() - - req.RecvTime = time2 - tlb.topPort.Recv(req) - - agent.EXPECT().Recv(gomock.Any()). - Do(func(rsp *vm.TranslationRsp) { - Expect(rsp.Page).To(Equal(page)) - }) - - engine.Run() - - time3 := engine.CurrentTime() - - Expect(time3 - time2).To(BeNumerically("<", time2-time1)) - }) - - /*It("should have miss after shootdown ", func() { - time1 := sim.VTimeInSec(10) - req := vm.NewTranslationReq(time1, agent, tlb.TopPort, 1, 0x1000, 1) - req.SetRecvTime(time1) - tlb.TopPort.Recv(*req) - agent.EXPECT().Recv(gomock.Any()). - Do(func(rsp vm.TranslationReadyRsp) { - Expect(rsp.Page).To(Equal(&page)) - }) - engine.Run() - - time2 := engine.CurrentTime() - shootdownReq := vm.NewPTEInvalidationReq( - time2, agent, tlb.ControlPort, 1, []uint64{0x1000}) - shootdownReq.SetRecvTime(time2) - tlb.ControlPort.Recv(*shootdownReq) - agent.EXPECT().Recv(gomock.Any()). - Do(func(rsp vm.InvalidationCompleteRsp) { - Expect(rsp.RespondTo).To(Equal(shootdownReq.ID)) - }) - engine.Run() - - time3 := engine.CurrentTime() - req.SetRecvTime(time3) - tlb.TopPort.Recv(*req) - agent.EXPECT().Recv(gomock.Any()). - Do(func(rsp vm.TranslationReadyRsp) { - Expect(rsp.Page).To(Equal(&page)) - }) - engine.Run() - time4 := engine.CurrentTime() - - Expect(time4 - time3).To(BeNumerically("~", time2-time1)) - })*/ - -}) diff --git a/mem/vm/tlb-local/tlbmshr.go b/mem/vm/tlb-local/tlbmshr.go deleted file mode 100644 index ec265bb3..00000000 --- a/mem/vm/tlb-local/tlbmshr.go +++ /dev/null @@ -1,112 +0,0 @@ -package tlb - -import ( - "log" - - "github.com/sarchlab/akita/v3/mem/vm" -) - -type mshrEntry struct { - pid vm.PID - vAddr uint64 - Requests []*vm.TranslationReq - reqToBottom *vm.TranslationReq - page vm.Page -} - -// newMSHREntry returns a new MSHR entry object -func newMSHREntry() *mshrEntry { - e := new(mshrEntry) - return e -} - -// mshr is an interface that controls MSHR entries -type mshr interface { - Query(pid vm.PID, addr uint64) *mshrEntry - Add(pid vm.PID, addr uint64) *mshrEntry - Remove(pid vm.PID, addr uint64) *mshrEntry - AllEntries() []*mshrEntry - IsFull() bool - Reset() - GetEntry(pid vm.PID, vAddr uint64) *mshrEntry - IsEntryPresent(pid vm.PID, vAddr uint64) bool -} - -type mshrImpl struct { - capacity int - entries []*mshrEntry -} - -// newMSHR returns a new mshr object -func newMSHR(capacity int) mshr { - m := new(mshrImpl) - m.capacity = capacity - return m -} - -func (m *mshrImpl) Add(pid vm.PID, vAddr uint64) *mshrEntry { - for _, e := range m.entries { - if e.pid == pid && e.vAddr == vAddr { - panic("entry already in mshr") - } - } - - if len(m.entries) >= m.capacity { - log.Panic("MSHR is full") - } - - entry := newMSHREntry() - entry.pid = pid - entry.vAddr = vAddr - m.entries = append(m.entries, entry) - return entry -} - -func (m *mshrImpl) Query(pid vm.PID, vAddr uint64) *mshrEntry { - for _, e := range m.entries { - if e.pid == pid && e.vAddr == vAddr { - return e - } - } - return nil -} - -func (m *mshrImpl) Remove(pid vm.PID, vAddr uint64) *mshrEntry { - for i, e := range m.entries { - if e.pid == pid && e.vAddr == vAddr { - m.entries = append(m.entries[:i], m.entries[i+1:]...) - return e - } - } - panic("trying to remove an non-exist entry") -} - -func (m *mshrImpl) AllEntries() []*mshrEntry { - return m.entries -} - -func (m *mshrImpl) IsFull() bool { - return len(m.entries) >= m.capacity -} - -func (m *mshrImpl) Reset() { - m.entries = nil -} - -func (m *mshrImpl) GetEntry(pid vm.PID, vAddr uint64) *mshrEntry { - for _, e := range m.entries { - if e.pid == pid && e.vAddr == vAddr { - return e - } - } - return nil -} - -func (m *mshrImpl) IsEntryPresent(pid vm.PID, vAddr uint64) bool { - for _, e := range m.entries { - if e.pid == pid && e.vAddr == vAddr { - return true - } - } - return false -} diff --git a/mem/vm/tlb-local/tlbprotocol.go b/mem/vm/tlb-local/tlbprotocol.go deleted file mode 100644 index 6b458a2b..00000000 --- a/mem/vm/tlb-local/tlbprotocol.go +++ /dev/null @@ -1,211 +0,0 @@ -package tlb - -import ( - "github.com/sarchlab/akita/v3/mem/vm" - "github.com/sarchlab/akita/v3/sim" -) - -// A FlushReq asks the TLB to invalidate certain entries. It will also not block all incoming and outgoing ports -type FlushReq struct { - sim.MsgMeta - VAddr []uint64 - PID vm.PID -} - -// Meta returns the meta data associated with the message. -func (r *FlushReq) Meta() *sim.MsgMeta { - return &r.MsgMeta -} - -// FlushReqBuilder can build AT flush requests -type FlushReqBuilder struct { - sendTime sim.VTimeInSec - src, dst sim.Port - vAddrs []uint64 - pid vm.PID -} - -// WithSendTime sets the send time of the request to build.:w -func (b FlushReqBuilder) WithSendTime( - t sim.VTimeInSec, -) FlushReqBuilder { - b.sendTime = t - return b -} - -// WithSrc sets the source of the request to build. -func (b FlushReqBuilder) WithSrc(src sim.Port) FlushReqBuilder { - b.src = src - return b -} - -// WithDst sets the destination of the request to build. -func (b FlushReqBuilder) WithDst(dst sim.Port) FlushReqBuilder { - b.dst = dst - return b -} - -// WithVAddrs sets the Vaddr of the pages to be flushed -func (b FlushReqBuilder) WithVAddrs(vAddrs []uint64) FlushReqBuilder { - b.vAddrs = vAddrs - return b -} - -// WithPID sets the pid whose entries are to be flushed -func (b FlushReqBuilder) WithPID(pid vm.PID) FlushReqBuilder { - b.pid = pid - return b -} - -// Build creates a new TLBFlushReq -func (b FlushReqBuilder) Build() *FlushReq { - r := &FlushReq{} - r.ID = sim.GetIDGenerator().Generate() - r.Src = b.src - r.Dst = b.dst - r.SendTime = b.sendTime - r.VAddr = b.vAddrs - r.PID = b.pid - return r -} - -// A FlushRsp is a response from AT indicating flush is complete -type FlushRsp struct { - sim.MsgMeta -} - -// Meta returns the meta data associated with the message. -func (r *FlushRsp) Meta() *sim.MsgMeta { - return &r.MsgMeta -} - -// FlushRspBuilder can build AT flush rsp -type FlushRspBuilder struct { - sendTime sim.VTimeInSec - src, dst sim.Port -} - -// WithSendTime sets the send time of the request to build.:w -func (b FlushRspBuilder) WithSendTime( - t sim.VTimeInSec, -) FlushRspBuilder { - b.sendTime = t - return b -} - -// WithSrc sets the source of the request to build. -func (b FlushRspBuilder) WithSrc(src sim.Port) FlushRspBuilder { - b.src = src - return b -} - -// WithDst sets the destination of the request to build. -func (b FlushRspBuilder) WithDst(dst sim.Port) FlushRspBuilder { - b.dst = dst - return b -} - -// Build creates a new TLBFlushRsps. -func (b FlushRspBuilder) Build() *FlushRsp { - r := &FlushRsp{} - r.ID = sim.GetIDGenerator().Generate() - r.Src = b.src - r.Dst = b.dst - r.SendTime = b.sendTime - - return r -} - -// A RestartReq is a request to TLB to start accepting requests and resume operations -type RestartReq struct { - sim.MsgMeta -} - -// Meta returns the meta data associated with the message. -func (r *RestartReq) Meta() *sim.MsgMeta { - return &r.MsgMeta -} - -// RestartReqBuilder can build TLB restart requests. -type RestartReqBuilder struct { - sendTime sim.VTimeInSec - src, dst sim.Port -} - -// WithSendTime sets the send time of the request to build. -func (b RestartReqBuilder) WithSendTime( - t sim.VTimeInSec, -) RestartReqBuilder { - b.sendTime = t - return b -} - -// WithSrc sets the source of the request to build. -func (b RestartReqBuilder) WithSrc(src sim.Port) RestartReqBuilder { - b.src = src - return b -} - -// WithDst sets the destination of the request to build. -func (b RestartReqBuilder) WithDst(dst sim.Port) RestartReqBuilder { - b.dst = dst - return b -} - -// Build creates a new TLBRestartReq. -func (b RestartReqBuilder) Build() *RestartReq { - r := &RestartReq{} - r.ID = sim.GetIDGenerator().Generate() - r.Src = b.src - r.Dst = b.dst - r.SendTime = b.sendTime - - return r -} - -// A RestartRsp is a response from AT indicating it has resumed working -type RestartRsp struct { - sim.MsgMeta -} - -// Meta returns the meta data associated with the message. -func (r *RestartRsp) Meta() *sim.MsgMeta { - return &r.MsgMeta -} - -// RestartRspBuilder can build AT flush rsp -type RestartRspBuilder struct { - sendTime sim.VTimeInSec - src, dst sim.Port -} - -// WithSendTime sets the send time of the request to build.:w -func (b RestartRspBuilder) WithSendTime( - t sim.VTimeInSec, -) RestartRspBuilder { - b.sendTime = t - return b -} - -// WithSrc sets the source of the request to build. -func (b RestartRspBuilder) WithSrc(src sim.Port) RestartRspBuilder { - b.src = src - return b -} - -// WithDst sets the destination of the request to build. -func (b RestartRspBuilder) WithDst(dst sim.Port) RestartRspBuilder { - b.dst = dst - return b -} - -// Build creates a new TLBRestartRsp -func (b RestartRspBuilder) Build() *RestartRsp { - r := &RestartRsp{} - r.ID = sim.GetIDGenerator().Generate() - r.Src = b.src - r.Dst = b.dst - r.SendTime = b.sendTime - - return r -}