1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
package vexriscv
import java.util
import spinal.core._
import spinal.lib._
import scala.beans.BeanProperty
trait JumpService{
def createJumpInterface(stage : Stage, priority : Int = 0) : Flow[UInt] //High priority win
}
trait IBusFetcher{
def haltIt() : Unit
def incoming() : Bool
def pcValid(stage : Stage) : Bool
def getInjectionPort() : Stream[Bits]
def withRvc() : Boolean
def forceNoDecode() : Unit
}
trait DecoderService{
def add(key : MaskedLiteral,values : Seq[(Stageable[_ <: BaseType],Any)])
def add(encoding :Seq[(MaskedLiteral,Seq[(Stageable[_ <: BaseType],Any)])])
def addDefault(key : Stageable[_ <: BaseType], value : Any)
def forceIllegal() : Unit
}
case class ExceptionCause(codeWidth : Int) extends Bundle{
val code = UInt(codeWidth bits)
val badAddr = UInt(32 bits)
def resizeCode(width : Int): ExceptionCause ={
val ret = ExceptionCause(width)
ret.badAddr := badAddr
ret.code := code.resized
ret
}
}
trait ExceptionService{
def newExceptionPort(stage : Stage, priority : Int = 0, codeWidth : Int = 4) : Flow[ExceptionCause]
def isExceptionPending(stage : Stage) : Bool
}
trait PrivilegeService{
def isUser() : Bool
def isSupervisor() : Bool
def isMachine() : Bool
def forceMachine() : Unit
}
case class PrivilegeServiceDefault() extends PrivilegeService{
override def isUser(): Bool = False
override def isSupervisor(): Bool = False
override def isMachine(): Bool = True
override def forceMachine(): Unit = {}
}
trait InterruptionInhibitor{
def inhibateInterrupts() : Unit
}
trait ExceptionInhibitor{
def inhibateException() : Unit
def inhibateEbreakException() : Unit
}
trait RegFileService{
def readStage() : Stage
}
case class MemoryTranslatorCmd() extends Bundle{
val isValid = Bool
val isStuck = Bool
val virtualAddress = UInt(32 bits)
val bypassTranslation = Bool
}
case class MemoryTranslatorRsp(p : MemoryTranslatorBusParameter) extends Bundle{
val physicalAddress = UInt(32 bits)
val isIoAccess = Bool
val isPaging = Bool
val allowRead, allowWrite, allowExecute = Bool
val exception = Bool
val refilling = Bool
val bypassTranslation = Bool
val ways = Vec(MemoryTranslatorRspWay(), p.wayCount)
}
case class MemoryTranslatorRspWay() extends Bundle{
val sel = Bool()
val physical = UInt(32 bits)
}
case class MemoryTranslatorBusParameter(wayCount : Int = 0, latency : Int = 0)
case class MemoryTranslatorBus(p : MemoryTranslatorBusParameter) extends Bundle with IMasterSlave{
val cmd = Vec(MemoryTranslatorCmd(), p.latency + 1)
val rsp = MemoryTranslatorRsp(p)
val end = Bool
val busy = Bool
override def asMaster() : Unit = {
out(cmd, end)
in(rsp, busy)
}
}
trait MemoryTranslator{
def newTranslationPort(priority : Int, args : Any) : MemoryTranslatorBus
}
trait ReportService{
def add(that : (String,Object)) : Unit
}
class BusReport{
@BeanProperty var kind = ""
@BeanProperty var flushInstructions = new util.LinkedList[Int]()
@BeanProperty var info : Object = null
}
class CacheReport {
@BeanProperty var size = 0
@BeanProperty var bytePerLine = 0
}
class DebugReport {
@BeanProperty var hardwareBreakpointCount = 0
}
|