Skip to content

Commit caa9d8a

Browse files
authored
Merge pull request #3652 from chipsalliance/rvv_isastrs
Allow non-V implementations of vector units, with Zve/Zvl extensions
2 parents 79626c0 + dd26375 commit caa9d8a

File tree

5 files changed

+25
-6
lines changed

5 files changed

+25
-6
lines changed

Diff for: src/main/scala/rocket/CSR.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ class CSRFile(
636636
(if (usingAtomics) "A" else "") +
637637
(if (fLen >= 32) "F" else "") +
638638
(if (fLen >= 64) "D" else "") +
639-
(if (usingVector) "V" else "") +
639+
(if (coreParams.hasV) "V" else "") +
640640
(if (usingCompressed) "C" else "")
641641
val isaString = (if (coreParams.useRVE) "E" else "I") +
642642
isaMaskString +

Diff for: src/main/scala/rocket/RocketCore.scala

+2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ case class RocketCoreParams(
6666
override val useVector = vector.isDefined
6767
override val vectorUseDCache = vector.map(_.useDCache).getOrElse(false)
6868
override def vLen = vector.map(_.vLen).getOrElse(0)
69+
override def eLen = vector.map(_.eLen).getOrElse(0)
70+
override def vfLen = vector.map(_.vfLen).getOrElse(0)
6971
override def vMemDataBits = vector.map(_.vMemDataBits).getOrElse(0)
7072
override val customIsaExt = Option.when(haveCease)("xrocket") // CEASE instruction
7173
override def minFLen: Int = fpu.map(_.minFLen).getOrElse(32)

Diff for: src/main/scala/rocket/VectorUnit.scala

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import freechips.rocketchip.tilelink._
1010
case class RocketCoreVectorParams(
1111
build: Parameters => RocketVectorUnit,
1212
vLen: Int,
13+
eLen: Int,
14+
vfLen: Int,
1315
vMemDataBits: Int,
1416
decoder: Parameters => RocketVectorDecoder,
1517
useDCache: Boolean,

Diff for: src/main/scala/tile/BaseTile.scala

+12-1
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,17 @@ trait HasNonDiplomaticTileParameters {
104104
val f = if (tileParams.core.fpu.nonEmpty) "f" else ""
105105
val d = if (tileParams.core.fpu.nonEmpty && tileParams.core.fpu.get.fLen > 32) "d" else ""
106106
val c = if (tileParams.core.useCompressed) "c" else ""
107-
val v = if (tileParams.core.useVector) "v" else ""
107+
val v = if (tileParams.core.useVector && tileParams.core.vLen >= 128 && tileParams.core.eLen == 64 && tileParams.core.vfLen == 64) "v" else ""
108108
val h = if (usingHypervisor) "h" else ""
109+
val zvl = Option.when(tileParams.core.useVector) { Seq(s"zvl${tileParams.core.vLen}b") }
110+
val zve = Option.when(tileParams.core.useVector) {
111+
val c = tileParams.core.vfLen match {
112+
case 64 => "d"
113+
case 32 => "f"
114+
case 0 => "x"
115+
}
116+
Seq(s"zve${tileParams.core.eLen}$c")
117+
}
109118
val multiLetterExt = (
110119
// rdcycle[h], rdinstret[h] is implemented
111120
// rdtime[h] is not implemented, and could be provided by software emulation
@@ -114,6 +123,8 @@ trait HasNonDiplomaticTileParameters {
114123
Option.when(tileParams.core.useConditionalZero)(Seq("zicond")) ++
115124
Some(Seq("zicsr", "zifencei", "zihpm")) ++
116125
Option.when(tileParams.core.fpu.nonEmpty && tileParams.core.fpu.get.fLen >= 16 && tileParams.core.fpu.get.minFLen <= 16)(Seq("zfh")) ++
126+
zvl ++
127+
zve ++
117128
tileParams.core.customIsaExt.map(Seq(_))
118129
).flatten
119130
val multiLetterString = multiLetterExt.mkString("_")

Diff for: src/main/scala/tile/Core.scala

+8-4
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,11 @@ trait CoreParams {
6363
def dcacheReqTagBits: Int = 6
6464

6565
def minFLen: Int = 32
66+
6667
def vLen: Int = 0
67-
def sLen: Int = 0
68-
def eLen(xLen: Int, fLen: Int): Int = xLen max fLen
68+
def eLen: Int = 0
69+
def vfLen: Int = 0
70+
def hasV: Boolean = vLen >= 128 && eLen >= 64 && vfLen >= 64
6971
def vMemDataBits: Int = 0
7072
}
7173

@@ -106,14 +108,16 @@ trait HasCoreParameters extends HasTileParameters {
106108
val traceHasWdata = coreParams.traceHasWdata
107109

108110
def vLen = coreParams.vLen
109-
def sLen = coreParams.sLen
110-
def eLen = coreParams.eLen(xLen, fLen)
111+
def eLen = coreParams.eLen
112+
def vfLen = coreParams.vfLen
111113
def vMemDataBits = if (usingVector) coreParams.vMemDataBits else 0
112114
def maxVLMax = vLen
113115

114116
if (usingVector) {
115117
require(isPow2(vLen), s"vLen ($vLen) must be a power of 2")
116118
require(eLen >= 32 && vLen % eLen == 0, s"eLen must divide vLen ($vLen) and be no less than 32")
119+
require(eLen == 32 || eLen == 64)
120+
require(vfLen <= eLen)
117121
}
118122

119123
lazy val hartIdLen: Int = p(MaxHartIdBits)

0 commit comments

Comments
 (0)