remove global constants; disentangle hwacha a bit
This commit is contained in:
parent
5a7777fe4d
commit
29bc361d6c
@ -4,16 +4,6 @@ package constants
|
|||||||
import Chisel._
|
import Chisel._
|
||||||
import scala.math._
|
import scala.math._
|
||||||
|
|
||||||
abstract trait TileConfigConstants {
|
|
||||||
def HAVE_RVC: Boolean
|
|
||||||
def HAVE_FPU: Boolean
|
|
||||||
def HAVE_VEC: Boolean
|
|
||||||
val FPU_N = UFix(0, 1)
|
|
||||||
val FPU_Y = if (HAVE_FPU) UFix(1, 1) else FPU_N
|
|
||||||
val VEC_N = UFix(0, 1);
|
|
||||||
val VEC_Y = if (HAVE_VEC) UFix(1, 1) else VEC_N
|
|
||||||
}
|
|
||||||
|
|
||||||
trait ScalarOpConstants {
|
trait ScalarOpConstants {
|
||||||
val BR_X = Bits("b???", 3)
|
val BR_X = Bits("b???", 3)
|
||||||
val BR_EQ = Bits(0, 3)
|
val BR_EQ = Bits(0, 3)
|
||||||
@ -38,18 +28,6 @@ trait ScalarOpConstants {
|
|||||||
val A2_JTYPE = UFix(5, 3);
|
val A2_JTYPE = UFix(5, 3);
|
||||||
val A2_RTYPE = UFix(6, 3);
|
val A2_RTYPE = UFix(6, 3);
|
||||||
|
|
||||||
val MUL_X = Bits("b??", 2)
|
|
||||||
val MUL_LO = UFix(0, 2);
|
|
||||||
val MUL_H = UFix(1, 2);
|
|
||||||
val MUL_HSU = UFix(2, 2);
|
|
||||||
val MUL_HU = UFix(3, 2);
|
|
||||||
|
|
||||||
val DIV_X = Bits("b??", 2)
|
|
||||||
val DIV_D = UFix(0, 2);
|
|
||||||
val DIV_DU = UFix(1, 2);
|
|
||||||
val DIV_R = UFix(2, 2);
|
|
||||||
val DIV_RU = UFix(3, 2);
|
|
||||||
|
|
||||||
val X = Bits("b?", 1)
|
val X = Bits("b?", 1)
|
||||||
val N = Bits(0, 1);
|
val N = Bits(0, 1);
|
||||||
val Y = Bits(1, 1);
|
val Y = Bits(1, 1);
|
||||||
@ -64,6 +42,7 @@ trait ScalarOpConstants {
|
|||||||
val WB_TSC = UFix(4, 3);
|
val WB_TSC = UFix(4, 3);
|
||||||
val WB_IRT = UFix(5, 3);
|
val WB_IRT = UFix(5, 3);
|
||||||
|
|
||||||
|
val SZ_DW = 1
|
||||||
val DW_X = X
|
val DW_X = X
|
||||||
val DW_32 = N
|
val DW_32 = N
|
||||||
val DW_64 = Y
|
val DW_64 = Y
|
||||||
@ -120,7 +99,7 @@ trait InterruptConstants {
|
|||||||
val IRQ_TIMER = 7
|
val IRQ_TIMER = 7
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract trait RocketDcacheConstants extends TileConfigConstants with uncore.constants.CacheConstants with uncore.constants.AddressConstants {
|
abstract trait RocketDcacheConstants extends uncore.constants.CacheConstants with uncore.constants.AddressConstants {
|
||||||
require(OFFSET_BITS == log2Up(uncore.Constants.CACHE_DATA_SIZE_IN_BYTES))
|
require(OFFSET_BITS == log2Up(uncore.Constants.CACHE_DATA_SIZE_IN_BYTES))
|
||||||
require(OFFSET_BITS <= uncore.Constants.X_INIT_WRITE_MASK_BITS)
|
require(OFFSET_BITS <= uncore.Constants.X_INIT_WRITE_MASK_BITS)
|
||||||
require(log2Up(OFFSET_BITS) <= uncore.Constants.X_INIT_SUBWORD_ADDR_BITS)
|
require(log2Up(OFFSET_BITS) <= uncore.Constants.X_INIT_SUBWORD_ADDR_BITS)
|
||||||
|
@ -4,6 +4,7 @@ import Chisel._
|
|||||||
import Node._
|
import Node._
|
||||||
import Constants._
|
import Constants._
|
||||||
import hwacha._
|
import hwacha._
|
||||||
|
import Util._
|
||||||
|
|
||||||
class ioRocket(implicit conf: RocketConfiguration) extends Bundle
|
class ioRocket(implicit conf: RocketConfiguration) extends Bundle
|
||||||
{
|
{
|
||||||
@ -26,7 +27,7 @@ class Core(implicit conf: RocketConfiguration) extends Component
|
|||||||
ctrl.io.imem <> io.imem
|
ctrl.io.imem <> io.imem
|
||||||
dpath.io.imem <> io.imem
|
dpath.io.imem <> io.imem
|
||||||
|
|
||||||
val dmemArb = new HellaCacheArbiter(if (HAVE_VEC) 3 else 2)
|
val dmemArb = new HellaCacheArbiter(2 + conf.vec)
|
||||||
dmemArb.io.mem <> io.dmem
|
dmemArb.io.mem <> io.dmem
|
||||||
val dmem = dmemArb.io.requestor
|
val dmem = dmemArb.io.requestor
|
||||||
dmem(1) <> ctrl.io.dmem
|
dmem(1) <> ctrl.io.dmem
|
||||||
@ -34,14 +35,14 @@ class Core(implicit conf: RocketConfiguration) extends Component
|
|||||||
|
|
||||||
val ptw = collection.mutable.ArrayBuffer(io.imem.ptw, io.dmem.ptw)
|
val ptw = collection.mutable.ArrayBuffer(io.imem.ptw, io.dmem.ptw)
|
||||||
|
|
||||||
val fpu: FPU = if (HAVE_FPU) {
|
val fpu: FPU = if (conf.fpu) {
|
||||||
val fpu = new FPU(4,6)
|
val fpu = new FPU(4,6)
|
||||||
dpath.io.fpu <> fpu.io.dpath
|
dpath.io.fpu <> fpu.io.dpath
|
||||||
ctrl.io.fpu <> fpu.io.ctrl
|
ctrl.io.fpu <> fpu.io.ctrl
|
||||||
fpu
|
fpu
|
||||||
} else null
|
} else null
|
||||||
|
|
||||||
if (HAVE_VEC) {
|
if (conf.vec) {
|
||||||
val vu = new vu()
|
val vu = new vu()
|
||||||
|
|
||||||
val vdtlb = new TLB(8)
|
val vdtlb = new TLB(8)
|
||||||
@ -120,14 +121,14 @@ class Core(implicit conf: RocketConfiguration) extends Component
|
|||||||
vu.io.dmem_resp.bits.tag := dmem(2).resp.bits.tag
|
vu.io.dmem_resp.bits.tag := dmem(2).resp.bits.tag
|
||||||
vu.io.dmem_resp.bits.typ := dmem(2).resp.bits.typ
|
vu.io.dmem_resp.bits.typ := dmem(2).resp.bits.typ
|
||||||
|
|
||||||
// share vector integer multiplier with rocket
|
// DON'T share vector integer multiplier with rocket
|
||||||
dpath.io.vec_imul_req <> vu.io.cp_imul_req
|
vu.io.cp_imul_req.valid := Bool(false)
|
||||||
dpath.io.vec_imul_resp <> vu.io.cp_imul_resp
|
|
||||||
|
|
||||||
// share sfma and dfma pipelines with rocket
|
// share sfma and dfma pipelines with rocket
|
||||||
|
require(conf.fpu)
|
||||||
fpu.io.sfma <> vu.io.cp_sfma
|
fpu.io.sfma <> vu.io.cp_sfma
|
||||||
fpu.io.dfma <> vu.io.cp_dfma
|
fpu.io.dfma <> vu.io.cp_dfma
|
||||||
} else if (fpu != null) {
|
} else if (conf.fpu) {
|
||||||
fpu.io.sfma.valid := Bool(false)
|
fpu.io.sfma.valid := Bool(false)
|
||||||
fpu.io.dfma.valid := Bool(false)
|
fpu.io.dfma.valid := Bool(false)
|
||||||
}
|
}
|
||||||
|
@ -16,12 +16,10 @@ class ioCtrlDpath extends Bundle()
|
|||||||
val ren1 = Bool(OUTPUT);
|
val ren1 = Bool(OUTPUT);
|
||||||
val sel_alu2 = UFix(OUTPUT, 3);
|
val sel_alu2 = UFix(OUTPUT, 3);
|
||||||
val fn_dw = Bool(OUTPUT);
|
val fn_dw = Bool(OUTPUT);
|
||||||
val fn_alu = UFix(OUTPUT, 4);
|
val fn_alu = UFix(OUTPUT, SZ_ALU_FN);
|
||||||
val mul_val = Bool(OUTPUT);
|
val mul_val = Bool(OUTPUT);
|
||||||
val mul_fn = Bits(OUTPUT, 2);
|
|
||||||
val mul_kill = Bool(OUTPUT)
|
val mul_kill = Bool(OUTPUT)
|
||||||
val div_val = Bool(OUTPUT);
|
val div_val = Bool(OUTPUT);
|
||||||
val div_fn = Bits(OUTPUT, 2);
|
|
||||||
val div_kill = Bool(OUTPUT)
|
val div_kill = Bool(OUTPUT)
|
||||||
val sel_wa = Bool(OUTPUT);
|
val sel_wa = Bool(OUTPUT);
|
||||||
val sel_wb = UFix(OUTPUT, 3);
|
val sel_wb = UFix(OUTPUT, 3);
|
||||||
@ -69,13 +67,13 @@ abstract trait DecodeConstants
|
|||||||
val xpr64 = Y;
|
val xpr64 = Y;
|
||||||
|
|
||||||
val decode_default =
|
val decode_default =
|
||||||
// fence.i
|
// fence.i
|
||||||
// jalr | eret
|
// jalr mul_val | eret
|
||||||
// fp_val | renx2 div_val | | syscall
|
// fp_val | renx2 | div_val | | syscall
|
||||||
// | vec_val | | renx1 mem_val mul_val | wen pcr | | | privileged
|
// | vec_val | | renx1 mem_val | | wen pcr | | | privileged
|
||||||
// val | | brtype | | | s_alu2 dw alu | mem_cmd mem_type| mul_fn | | s_wa s_wb | | | | | replay_next
|
// val | | brtype | | | s_alu2 dw alu | mem_cmd mem_type| | | s_wa s_wb | | | | | replay_next
|
||||||
// | | | | | | | | | | | | | | | | | | | | | | | | |
|
// | | | | | | | | | | | | | | | | | | | | | | | |
|
||||||
List(N, X,X,BR_X, X,X,X,A2_X, DW_X, FN_X, N,M_X, MT_X, X,MUL_X, X,X,WA_X, WB_X, PCR_X,N,X,X,X,X)
|
List(N, X,X,BR_X, X,X,X,A2_X, DW_X, FN_X, N,M_X, MT_X, X,X,X,WA_X, WB_X, PCR_X,N,X,X,X,X)
|
||||||
|
|
||||||
val table: Array[(Bits, List[Bits])]
|
val table: Array[(Bits, List[Bits])]
|
||||||
}
|
}
|
||||||
@ -83,239 +81,239 @@ abstract trait DecodeConstants
|
|||||||
object XDecode extends DecodeConstants
|
object XDecode extends DecodeConstants
|
||||||
{
|
{
|
||||||
val table = Array(
|
val table = Array(
|
||||||
// fence.i
|
// fence.i
|
||||||
// jalr | eret
|
// jalr mul_val | eret
|
||||||
// fp_val | renx2 div_val | | syscall
|
// fp_val | renx2 | div_val | | syscall
|
||||||
// | vec_val | | renx1 mem_val mul_val | wen pcr | | | privileged
|
// | vec_val | | renx1 mem_val | | wen pcr | | | privileged
|
||||||
// val | | brtype | | | s_alu2 dw alu | mem_cmd mem_type| mul_fn | | s_wa s_wb | | | | | replay_next
|
// val | | brtype | | | s_alu2 dw alu | mem_cmd mem_type| | | s_wa s_wb | | | | | replay_next
|
||||||
// | | | | | | | | | | | | | | | | | | | | | | | | |
|
// | | | | | | | | | | | | | | | | | | | | | | | |
|
||||||
BNE-> List(Y, N,N,BR_NE, N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
BNE-> List(Y, N,N,BR_NE, N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
BEQ-> List(Y, N,N,BR_EQ, N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
BEQ-> List(Y, N,N,BR_EQ, N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
BLT-> List(Y, N,N,BR_LT, N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
BLT-> List(Y, N,N,BR_LT, N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
BLTU-> List(Y, N,N,BR_LTU,N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
BLTU-> List(Y, N,N,BR_LTU,N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
BGE-> List(Y, N,N,BR_GE, N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
BGE-> List(Y, N,N,BR_GE, N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
BGEU-> List(Y, N,N,BR_GEU,N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
BGEU-> List(Y, N,N,BR_GEU,N,Y,Y,A2_BTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
|
|
||||||
J-> List(Y, N,N,BR_J, N,N,N,A2_JTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
J-> List(Y, N,N,BR_J, N,N,N,A2_JTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
JAL-> List(Y, N,N,BR_J, N,N,N,A2_JTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RA,WB_PC, PCR_N,N,N,N,N,N),
|
JAL-> List(Y, N,N,BR_J, N,N,N,A2_JTYPE,DW_X, FN_ADD, N,M_X, MT_X, N,N,Y,WA_RA,WB_PC, PCR_N,N,N,N,N,N),
|
||||||
JALR_C-> List(Y, N,N,BR_N, Y,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_PC, PCR_N,N,N,N,N,N),
|
JALR_C-> List(Y, N,N,BR_N, Y,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_PC, PCR_N,N,N,N,N,N),
|
||||||
JALR_J-> List(Y, N,N,BR_N, Y,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_PC, PCR_N,N,N,N,N,N),
|
JALR_J-> List(Y, N,N,BR_N, Y,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_PC, PCR_N,N,N,N,N,N),
|
||||||
JALR_R-> List(Y, N,N,BR_N, Y,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_PC, PCR_N,N,N,N,N,N),
|
JALR_R-> List(Y, N,N,BR_N, Y,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_PC, PCR_N,N,N,N,N,N),
|
||||||
RDNPC-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_PC, PCR_N,N,N,N,N,N),
|
RDNPC-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_PC, PCR_N,N,N,N,N,N),
|
||||||
|
|
||||||
LB-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_B, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
LB-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_B, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
LH-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_H, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
LH-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_H, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
LW-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_W, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
LW-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_W, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
LD-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_D, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
LD-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_D, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
LBU-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_BU,N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
LBU-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_BU,N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
LHU-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_HU,N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
LHU-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_HU,N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
LWU-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_WU,N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
LWU-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_WU,N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SB-> List(Y, N,N,BR_N, N,Y,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_B, N,MUL_X, N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
SB-> List(Y, N,N,BR_N, N,Y,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_B, N,N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SH-> List(Y, N,N,BR_N, N,Y,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_H, N,MUL_X, N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
SH-> List(Y, N,N,BR_N, N,Y,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_H, N,N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SW-> List(Y, N,N,BR_N, N,Y,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_W, N,MUL_X, N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
SW-> List(Y, N,N,BR_N, N,Y,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_W, N,N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SD-> List(xpr64,N,N,BR_N, N,Y,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_D, N,MUL_X, N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
SD-> List(xpr64,N,N,BR_N, N,Y,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_D, N,N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
|
|
||||||
AMOADD_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_ADD, MT_W, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOADD_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_ADD, MT_W, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOSWAP_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_SWAP,MT_W, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOSWAP_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_SWAP,MT_W, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOAND_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_AND, MT_W, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOAND_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_AND, MT_W, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOOR_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_OR, MT_W, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOOR_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_OR, MT_W, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOMIN_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MIN, MT_W, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOMIN_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MIN, MT_W, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOMINU_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MINU,MT_W, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOMINU_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MINU,MT_W, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOMAX_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MAX, MT_W, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOMAX_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MAX, MT_W, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOMAXU_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MAXU,MT_W, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOMAXU_W-> List(Y, N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MAXU,MT_W, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOADD_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_ADD, MT_D, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOADD_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_ADD, MT_D, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOSWAP_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_SWAP,MT_D, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOSWAP_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_SWAP,MT_D, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOAND_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_AND, MT_D, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOAND_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_AND, MT_D, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOOR_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_OR, MT_D, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOOR_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_OR, MT_D, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOMIN_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MIN, MT_D, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOMIN_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MIN, MT_D, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOMINU_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MINU,MT_D, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOMINU_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MINU,MT_D, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOMAX_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MAX, MT_D, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOMAX_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MAX, MT_D, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
AMOMAXU_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MAXU,MT_D, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
AMOMAXU_D-> List(xpr64,N,N,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, Y,M_XA_MAXU,MT_D, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
|
|
||||||
LUI-> List(Y, N,N,BR_N, N,N,N,A2_LTYPE,DW_XPR,FN_OP2, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
LUI-> List(Y, N,N,BR_N, N,N,N,A2_LTYPE,DW_XPR,FN_OP2, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
ADDI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
ADDI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SLTI -> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SLT, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SLTI -> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SLT, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SLTIU-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SLTU,N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SLTIU-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SLTU, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
ANDI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_AND, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
ANDI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_AND, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
ORI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_OR, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
ORI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_OR, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
XORI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_XOR, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
XORI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_XOR, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SLLI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SL, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SLLI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SL, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SRLI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SR, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SRLI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SR, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SRAI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SRA, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SRAI-> List(Y, N,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_SRA, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
ADD-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
ADD-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SUB-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SUB, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SUB-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SUB, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SLT-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SLT, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SLT-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SLT, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SLTU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SLTU,N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SLTU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SLTU, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
riscvAND-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_AND, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
riscvAND-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_AND, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
riscvOR-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_OR, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
riscvOR-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_OR, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
riscvXOR-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_XOR, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
riscvXOR-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_XOR, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SLL-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SL, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SLL-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SL, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SRL-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SR, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SRL-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SR, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SRA-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SRA, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SRA-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_SRA, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
|
|
||||||
ADDIW-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_32,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
ADDIW-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_32,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SLLIW-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_32,FN_SL, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SLLIW-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_32,FN_SL, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SRLIW-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_32,FN_SR, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SRLIW-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_32,FN_SR, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SRAIW-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_32,FN_SRA, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SRAIW-> List(xpr64,N,N,BR_N, N,N,Y,A2_ITYPE,DW_32,FN_SRA, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
ADDW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
ADDW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SUBW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_SUB, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SUBW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_SUB, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SLLW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_SL, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SLLW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_SL, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SRLW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_SR, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SRLW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_SR, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
SRAW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_SRA, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
SRAW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32,FN_SRA, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
|
|
||||||
MUL-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_X, N,M_X, MT_X, Y,MUL_LO, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MUL-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_MUL, N,M_X, MT_X, Y,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MULH-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_X, N,M_X, MT_X, Y,MUL_H, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MULH-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_MULH, N,M_X, MT_X, Y,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MULHU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_X, N,M_X, MT_X, Y,MUL_HU, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MULHU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_MULHU, N,M_X, MT_X, Y,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MULHSU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_X, N,M_X, MT_X, Y,MUL_HSU,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MULHSU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_MULHSU,N,M_X, MT_X, Y,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MULW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_X, N,M_X, MT_X, Y,MUL_LO, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MULW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_MUL, N,M_X, MT_X, Y,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
|
|
||||||
DIV-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_X, N,M_X, MT_X, N,DIV_D, Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
DIV-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_DIV, N,M_X, MT_X, N,Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
DIVU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_X, N,M_X, MT_X, N,DIV_DU, Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
DIVU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_DIVU, N,M_X, MT_X, N,Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
REM-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_X, N,M_X, MT_X, N,DIV_R, Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
REM-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_REM, N,M_X, MT_X, N,Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
REMU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_X, N,M_X, MT_X, N,DIV_RU, Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
REMU-> List(Y, N,N,BR_N, N,Y,Y,A2_RTYPE,DW_XPR,FN_REMU, N,M_X, MT_X, N,Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
DIVW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_X, N,M_X, MT_X, N,DIV_D, Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
DIVW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_DIV, N,M_X, MT_X, N,Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
DIVUW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_X, N,M_X, MT_X, N,DIV_DU, Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
DIVUW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_DIVU, N,M_X, MT_X, N,Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
REMW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_X, N,M_X, MT_X, N,DIV_R, Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
REMW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_REM, N,M_X, MT_X, N,Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
REMUW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_X, N,M_X, MT_X, N,DIV_RU, Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
REMUW-> List(xpr64,N,N,BR_N, N,Y,Y,A2_RTYPE,DW_32, FN_REMU, N,M_X, MT_X, N,Y,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
|
|
||||||
SYSCALL-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,Y,N,N),
|
SYSCALL-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,Y,N,N),
|
||||||
SETPCR-> List(Y, N,N,BR_N, N,N,N,A2_ITYPE,DW_XPR,FN_OP2, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_S,N,N,N,Y,Y),
|
SETPCR-> List(Y, N,N,BR_N, N,N,N,A2_ITYPE,DW_XPR,FN_OP2, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_S,N,N,N,Y,Y),
|
||||||
CLEARPCR-> List(Y, N,N,BR_N, N,N,N,A2_ITYPE,DW_XPR,FN_OP2, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_C,N,N,N,Y,Y),
|
CLEARPCR-> List(Y, N,N,BR_N, N,N,N,A2_ITYPE,DW_XPR,FN_OP2, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_C,N,N,N,Y,Y),
|
||||||
ERET-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,Y,N,Y,N),
|
ERET-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,Y,N,Y,N),
|
||||||
FENCE-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, Y,M_FENCE, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
FENCE-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, Y,M_FENCE, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
FENCE_I-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, Y,M_FENCE, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,Y,N,N,N,Y),
|
FENCE_I-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, Y,M_FENCE, MT_X, N,N,N,WA_X, WB_X, PCR_N,Y,N,N,N,Y),
|
||||||
MFPCR-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_F,N,N,N,Y,Y),
|
MFPCR-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_F,N,N,N,Y,Y),
|
||||||
MTPCR-> List(Y, N,N,BR_N, N,Y,N,A2_RTYPE,DW_XPR,FN_OP2, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_T,N,N,N,Y,Y),
|
MTPCR-> List(Y, N,N,BR_N, N,Y,N,A2_RTYPE,DW_XPR,FN_OP2, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_T,N,N,N,Y,Y),
|
||||||
RDTIME-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_XPR,FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_TSC,PCR_N,N,N,N,N,N),
|
RDTIME-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_XPR,FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_TSC,PCR_N,N,N,N,N,N),
|
||||||
RDCYCLE-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_XPR,FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_TSC,PCR_N,N,N,N,N,N),
|
RDCYCLE-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_XPR,FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_TSC,PCR_N,N,N,N,N,N),
|
||||||
RDINSTRET-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_XPR,FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_IRT,PCR_N,N,N,N,N,N))
|
RDINSTRET-> List(Y, N,N,BR_N, N,N,N,A2_X, DW_XPR,FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_IRT,PCR_N,N,N,N,N,N))
|
||||||
}
|
}
|
||||||
|
|
||||||
object FDecode extends DecodeConstants
|
object FDecode extends DecodeConstants
|
||||||
{
|
{
|
||||||
val table = Array(
|
val table = Array(
|
||||||
// fence.i
|
// fence.i
|
||||||
// jalr | eret
|
// jalr mul_val | eret
|
||||||
// fp_val | renx2 div_val | | syscall
|
// fp_val | renx2 | div_val | | syscall
|
||||||
// | vec_val | | renx1 mem_val mul_val | wen pcr | | | privileged
|
// | vec_val | | renx1 mem_val | | wen pcr | | | privileged
|
||||||
// val | | brtype | | | s_alu2 dw alu | mem_cmd mem_type| mul_fn | | s_wa s_wb | | | | | replay_next
|
// val | | brtype | | | s_alu2 dw alu | mem_cmd mem_type| | | s_wa s_wb | | | | | replay_next
|
||||||
// | | | | | | | | | | | | | | | | | | | | | | | | |
|
// | | | | | | | | | | | | | | | | | | | | | | | |
|
||||||
FCVT_S_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_S_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_D_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_D_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FSGNJ_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FSGNJ_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FSGNJ_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FSGNJ_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FSGNJX_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FSGNJX_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FSGNJX_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FSGNJX_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FSGNJN_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FSGNJN_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FSGNJN_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FSGNJN_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMIN_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMIN_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMIN_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMIN_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMAX_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMAX_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMAX_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMAX_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FADD_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FADD_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FADD_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FADD_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FSUB_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FSUB_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FSUB_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FSUB_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMUL_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMUL_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMUL_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMUL_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMADD_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMADD_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMADD_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMADD_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMSUB_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMSUB_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FMSUB_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FMSUB_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FNMADD_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FNMADD_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FNMADD_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FNMADD_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FNMSUB_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FNMSUB_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FNMSUB_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FNMSUB_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MFTX_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MFTX_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MFTX_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MFTX_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_W_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_W_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_W_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_W_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_WU_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_WU_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_WU_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_WU_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_L_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_L_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_L_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_L_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_LU_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_LU_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_LU_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_LU_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FEQ_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FEQ_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FEQ_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FEQ_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FLT_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FLT_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FLT_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FLT_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FLE_S-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FLE_S-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FLE_D-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FLE_D-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MXTF_S-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MXTF_S-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MXTF_D-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MXTF_D-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_S_W-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_S_W-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_D_W-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_D_W-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_S_WU-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_S_WU-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_D_WU-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_D_WU-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_S_L-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_S_L-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_D_L-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_D_L-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_S_LU-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_S_LU-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FCVT_D_LU-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
FCVT_D_LU-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MFFSR-> List(FPU_Y,Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MFFSR-> List(Y, Y,N,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
MTFSR-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
MTFSR-> List(Y, Y,N,BR_N, N,N,Y,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,Y,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FLW-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_W, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
FLW-> List(Y, Y,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_W, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
FLD-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
FLD-> List(Y, Y,N,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, Y,M_XRD, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
FSW-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_W, N,MUL_X, N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
FSW-> List(Y, Y,N,BR_N, N,N,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_W, N,N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
FSD-> List(FPU_Y,Y,N,BR_N, N,N,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_D, N,MUL_X, N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N))
|
FSD-> List(Y, Y,N,BR_N, N,N,Y,A2_BTYPE,DW_XPR,FN_ADD, Y,M_XWR, MT_D, N,N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N))
|
||||||
}
|
}
|
||||||
|
|
||||||
object VDecode extends DecodeConstants
|
object VDecode extends DecodeConstants
|
||||||
{
|
{
|
||||||
val table = Array(
|
val table = Array(
|
||||||
// fence.i
|
// fence.i
|
||||||
// jalr | eret
|
// jalr mul_val | eret
|
||||||
// fp_val | renx2 div_val | | syscall
|
// fp_val | renx2 | div_val | | syscall
|
||||||
// | vec_val | | renx1 mem_val mul_val | wen pcr | | | privileged
|
// | vec_val | | renx1 mem_val | | wen pcr | | | privileged
|
||||||
// val | | brtype | | | s_alu2 dw alu | mem_cmd mem_type| mul_fn | | s_wa s_wb | | | | | replay_next
|
// val | | brtype | | | s_alu2 dw alu | mem_cmd mem_type| | | s_wa s_wb | | | | | replay_next
|
||||||
// | | | | | | | | | | | | | | | | | | | | | | | | |
|
// | | | | | | | | | | | | | | | | | | | | | | | |
|
||||||
VVCFGIVL-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,Y),
|
VVCFGIVL-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,Y),
|
||||||
VVCFG-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,Y),
|
VVCFG-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,Y),
|
||||||
VSETVL-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,Y),
|
VSETVL-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,Y,WA_RD,WB_ALU,PCR_N,N,N,N,N,Y),
|
||||||
VF-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
VF-> List(Y, N,Y,BR_N, N,N,Y,A2_ITYPE,DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_X, WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VMVV-> List(VEC_Y,N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
VMVV-> List(Y, N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
VMSV-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VMSV-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VFMVV-> List(VEC_Y,N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
VFMVV-> List(Y, N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_RD,WB_X, PCR_N,N,N,N,N,N),
|
||||||
FENCE_V_L-> List(VEC_Y,N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
FENCE_V_L-> List(Y, N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
FENCE_V_G-> List(VEC_Y,N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, Y,M_FENCE, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
FENCE_V_G-> List(Y, N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, Y,M_FENCE, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,N,N),
|
||||||
VLD-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLD-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLW-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLW-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLWU-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLWU-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLH-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLH-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLHU-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLHU-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLB-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLB-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLBU-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLBU-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VSD-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VSD-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VSW-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VSW-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VSH-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VSH-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VSB-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VSB-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VFLD-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VFLD-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VFLW-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VFLW-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VFSD-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VFSD-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VFSW-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VFSW-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLSTD-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLSTD-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLSTW-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLSTW-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLSTWU-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLSTWU-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLSTH-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLSTH-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLSTHU-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLSTHU-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLSTB-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLSTB-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VLSTBU-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VLSTBU-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VSSTD-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VSSTD-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VSSTW-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VSSTW-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VSSTH-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VSSTH-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VSSTB-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VSSTB-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VFLSTD-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VFLSTD-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VFLSTW-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VFLSTW-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VFSSTD-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VFSSTD-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
VFSSTW-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
VFSSTW-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_D, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,N,N),
|
||||||
|
|
||||||
VENQCMD-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
VENQCMD-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
||||||
VENQIMM1-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
VENQIMM1-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
||||||
VENQIMM2-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
VENQIMM2-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
||||||
VENQCNT-> List(VEC_Y,N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
VENQCNT-> List(Y, N,Y,BR_N, N,Y,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
||||||
VXCPTEVAC-> List(VEC_Y,N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,MUL_X, N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
VXCPTEVAC-> List(Y, N,Y,BR_N, N,N,Y,A2_ZERO, DW_XPR,FN_ADD, N,M_X, MT_X, N,N,N,WA_RD,WB_ALU,PCR_N,N,N,N,Y,N),
|
||||||
VXCPTKILL-> List(VEC_Y,N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,Y,N),
|
VXCPTKILL-> List(Y, N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,Y,N),
|
||||||
VXCPTHOLD-> List(VEC_Y,N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,MUL_X, N,N,WA_X, WB_X, PCR_N,N,N,N,Y,N))
|
VXCPTHOLD-> List(Y, N,Y,BR_N, N,N,N,A2_X, DW_X, FN_X, N,M_X, MT_X, N,N,N,WA_X, WB_X, PCR_N,N,N,N,Y,N))
|
||||||
}
|
}
|
||||||
|
|
||||||
class Control(implicit conf: RocketConfiguration) extends Component
|
class Control(implicit conf: RocketConfiguration) extends Component
|
||||||
@ -336,13 +334,13 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
|||||||
}
|
}
|
||||||
|
|
||||||
var decode_table = XDecode.table
|
var decode_table = XDecode.table
|
||||||
if (HAVE_FPU) decode_table ++= FDecode.table
|
if (conf.fpu) decode_table ++= FDecode.table
|
||||||
if (HAVE_VEC) decode_table ++= VDecode.table
|
if (conf.vec) decode_table ++= VDecode.table
|
||||||
|
|
||||||
val cs = DecodeLogic(io.dpath.inst, XDecode.decode_default, decode_table)
|
val cs = DecodeLogic(io.dpath.inst, XDecode.decode_default, decode_table)
|
||||||
|
|
||||||
val id_int_val :: id_fp_val :: id_vec_val :: id_br_type :: id_jalr :: id_renx2 :: id_renx1 :: id_sel_alu2 :: id_fn_dw :: id_fn_alu :: cs0 = cs
|
val id_int_val :: id_fp_val :: id_vec_val :: id_br_type :: id_jalr :: id_renx2 :: id_renx1 :: id_sel_alu2 :: id_fn_dw :: id_fn_alu :: cs0 = cs
|
||||||
val id_mem_val :: id_mem_cmd :: id_mem_type :: id_mul_val :: id_mul_fn :: id_div_val :: id_wen :: id_sel_wa :: id_sel_wb :: cs1 = cs0
|
val id_mem_val :: id_mem_cmd :: id_mem_type :: id_mul_val :: id_div_val :: id_wen :: id_sel_wa :: id_sel_wb :: cs1 = cs0
|
||||||
val id_pcr :: id_fence_i :: id_eret :: id_syscall :: id_privileged :: id_replay_next :: Nil = cs1
|
val id_pcr :: id_fence_i :: id_eret :: id_syscall :: id_privileged :: id_replay_next :: Nil = cs1
|
||||||
|
|
||||||
val id_raddr3 = io.dpath.inst(16,12);
|
val id_raddr3 = io.dpath.inst(16,12);
|
||||||
@ -369,7 +367,6 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
|||||||
val ex_reg_load_use = Reg(resetVal = Bool(false))
|
val ex_reg_load_use = Reg(resetVal = Bool(false))
|
||||||
val ex_reg_pcr = Reg(resetVal = PCR_N)
|
val ex_reg_pcr = Reg(resetVal = PCR_N)
|
||||||
val ex_reg_br_type = Reg(resetVal = BR_N)
|
val ex_reg_br_type = Reg(resetVal = BR_N)
|
||||||
val ex_reg_mul_fn = Reg(){Bits()}
|
|
||||||
val ex_reg_mem_cmd = Reg(){Bits()}
|
val ex_reg_mem_cmd = Reg(){Bits()}
|
||||||
val ex_reg_mem_type = Reg(){Bits()}
|
val ex_reg_mem_type = Reg(){Bits()}
|
||||||
val ex_reg_cause = Reg(){UFix()}
|
val ex_reg_cause = Reg(){UFix()}
|
||||||
@ -418,10 +415,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
|||||||
(io.dpath.irq_timer, IRQ_TIMER))
|
(io.dpath.irq_timer, IRQ_TIMER))
|
||||||
var id_interrupts = id_maskable_interrupts.map(i => (io.dpath.status(SR_IM+i._2) && i._1, UFix(CAUSE_INTERRUPT+i._2)))
|
var id_interrupts = id_maskable_interrupts.map(i => (io.dpath.status(SR_IM+i._2) && i._1, UFix(CAUSE_INTERRUPT+i._2)))
|
||||||
|
|
||||||
var vec_replay = Bool(false)
|
val (vec_replay, vec_stalld) = if (conf.vec) {
|
||||||
var vec_stalld = Bool(false)
|
|
||||||
if (HAVE_VEC)
|
|
||||||
{
|
|
||||||
// vector control
|
// vector control
|
||||||
val vec = new rocketCtrlVec()
|
val vec = new rocketCtrlVec()
|
||||||
|
|
||||||
@ -447,15 +441,16 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
|||||||
val mask_pfximm2q_ready = !vec_dec.io.sigs.enq_pfximm2q || io.vec_iface.vpfximm2q.ready
|
val mask_pfximm2q_ready = !vec_dec.io.sigs.enq_pfximm2q || io.vec_iface.vpfximm2q.ready
|
||||||
val mask_pfcntq_ready = !vec_dec.io.sigs.enq_pfcntq || io.vec_iface.vpfcntq.ready
|
val mask_pfcntq_ready = !vec_dec.io.sigs.enq_pfcntq || io.vec_iface.vpfcntq.ready
|
||||||
|
|
||||||
vec_stalld =
|
id_interrupts = id_interrupts :+ (vec.io.irq, vec.io.irq_cause)
|
||||||
|
|
||||||
|
val stalld =
|
||||||
id_vec_val && (
|
id_vec_val && (
|
||||||
!mask_cmdq_ready || !mask_ximm1q_ready || !mask_ximm2q_ready || !mask_cntq_ready ||
|
!mask_cmdq_ready || !mask_ximm1q_ready || !mask_ximm2q_ready || !mask_cntq_ready ||
|
||||||
!mask_pfcmdq_ready || !mask_pfximm1q_ready || !mask_pfximm2q_ready || !mask_pfcntq_ready ||
|
!mask_pfcmdq_ready || !mask_pfximm1q_ready || !mask_pfximm2q_ready || !mask_pfcntq_ready ||
|
||||||
vec_dec.io.sigs.vfence && !vec.io.vfence_ready)
|
vec_dec.io.sigs.vfence && !vec.io.vfence_ready)
|
||||||
|
|
||||||
vec_replay = vec.io.replay
|
(vec.io.replay, stalld)
|
||||||
id_interrupts = id_interrupts :+ (vec.io.irq, vec.io.irq_cause)
|
} else (Bool(false), Bool(false))
|
||||||
}
|
|
||||||
|
|
||||||
val (id_interrupt_unmasked, id_interrupt_cause) = checkExceptions(id_interrupts)
|
val (id_interrupt_unmasked, id_interrupt_cause) = checkExceptions(id_interrupts)
|
||||||
val id_interrupt = io.dpath.status(SR_ET) && id_interrupt_unmasked
|
val id_interrupt = io.dpath.status(SR_ET) && id_interrupt_unmasked
|
||||||
@ -504,7 +499,6 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
|||||||
ex_reg_btb_hit := io.imem.resp.bits.taken
|
ex_reg_btb_hit := io.imem.resp.bits.taken
|
||||||
ex_reg_div_val := id_div_val
|
ex_reg_div_val := id_div_val
|
||||||
ex_reg_mul_val := id_mul_val
|
ex_reg_mul_val := id_mul_val
|
||||||
ex_reg_mul_fn := id_mul_fn.toUFix
|
|
||||||
ex_reg_mem_val := id_mem_val.toBool;
|
ex_reg_mem_val := id_mem_val.toBool;
|
||||||
ex_reg_valid := Bool(true)
|
ex_reg_valid := Bool(true)
|
||||||
ex_reg_pcr := id_pcr
|
ex_reg_pcr := id_pcr
|
||||||
@ -634,7 +628,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
|||||||
sboard.set((wb_reg_div_mul_val || wb_dcache_miss) && io.dpath.wb_wen, io.dpath.wb_waddr)
|
sboard.set((wb_reg_div_mul_val || wb_dcache_miss) && io.dpath.wb_wen, io.dpath.wb_waddr)
|
||||||
sboard.clear(io.dpath.mem_ll_wb, io.dpath.mem_ll_waddr)
|
sboard.clear(io.dpath.mem_ll_wb, io.dpath.mem_ll_waddr)
|
||||||
|
|
||||||
val id_stall_fpu = if (HAVE_FPU) {
|
val id_stall_fpu = if (conf.fpu) {
|
||||||
val fp_sboard = new Scoreboard
|
val fp_sboard = new Scoreboard
|
||||||
fp_sboard.set((wb_dcache_miss && wb_reg_fp_wen || io.fpu.sboard_set) && !replay_wb, io.dpath.wb_waddr)
|
fp_sboard.set((wb_dcache_miss && wb_reg_fp_wen || io.fpu.sboard_set) && !replay_wb, io.dpath.wb_waddr)
|
||||||
fp_sboard.clear(io.dpath.fp_sboard_clr, io.dpath.fp_sboard_clra)
|
fp_sboard.clear(io.dpath.fp_sboard_clr, io.dpath.fp_sboard_clra)
|
||||||
@ -734,10 +728,8 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
|||||||
io.dpath.sel_alu2 := id_sel_alu2.toUFix
|
io.dpath.sel_alu2 := id_sel_alu2.toUFix
|
||||||
io.dpath.fn_dw := id_fn_dw.toBool;
|
io.dpath.fn_dw := id_fn_dw.toBool;
|
||||||
io.dpath.fn_alu := id_fn_alu.toUFix
|
io.dpath.fn_alu := id_fn_alu.toUFix
|
||||||
io.dpath.div_fn := ex_reg_mul_fn
|
|
||||||
io.dpath.div_val := ex_reg_div_val
|
io.dpath.div_val := ex_reg_div_val
|
||||||
io.dpath.div_kill := mem_reg_div_val && killm_common
|
io.dpath.div_kill := mem_reg_div_val && killm_common
|
||||||
io.dpath.mul_fn := ex_reg_mul_fn
|
|
||||||
io.dpath.mul_val := ex_reg_mul_val
|
io.dpath.mul_val := ex_reg_mul_val
|
||||||
io.dpath.mul_kill := mem_reg_mul_val && killm_common
|
io.dpath.mul_kill := mem_reg_mul_val && killm_common
|
||||||
io.dpath.ex_fp_val:= ex_reg_fp_val;
|
io.dpath.ex_fp_val:= ex_reg_fp_val;
|
||||||
|
@ -3,10 +3,11 @@ package rocket
|
|||||||
import Chisel._
|
import Chisel._
|
||||||
import Node._
|
import Node._
|
||||||
import Constants._
|
import Constants._
|
||||||
|
import ALU._
|
||||||
|
|
||||||
class rocketDivider(earlyOut: Boolean = false) extends Component {
|
class Divider(earlyOut: Boolean = false)(implicit conf: RocketConfiguration) extends Component {
|
||||||
val io = new ioMultiplier
|
val io = new MultiplierIO
|
||||||
val w = io.req.bits.in0.getWidth
|
val w = io.req.bits.in1.getWidth
|
||||||
|
|
||||||
val s_ready :: s_neg_inputs :: s_busy :: s_neg_outputs :: s_done :: Nil = Enum(5) { UFix() };
|
val s_ready :: s_neg_inputs :: s_busy :: s_neg_outputs :: s_done :: Nil = Enum(5) { UFix() };
|
||||||
val state = Reg(resetVal = s_ready);
|
val state = Reg(resetVal = s_ready);
|
||||||
@ -15,25 +16,25 @@ class rocketDivider(earlyOut: Boolean = false) extends Component {
|
|||||||
val divby0 = Reg() { Bool() };
|
val divby0 = Reg() { Bool() };
|
||||||
val neg_quo = Reg() { Bool() };
|
val neg_quo = Reg() { Bool() };
|
||||||
val neg_rem = Reg() { Bool() };
|
val neg_rem = Reg() { Bool() };
|
||||||
val reg_tag = Reg() { UFix() };
|
|
||||||
val rem = Reg() { Bool() };
|
val rem = Reg() { Bool() };
|
||||||
val half = Reg() { Bool() };
|
val half = Reg() { Bool() };
|
||||||
|
val r_req = Reg{io.req.bits.clone}
|
||||||
|
|
||||||
val divisor = Reg() { Bits() }
|
val divisor = Reg() { Bits() }
|
||||||
val remainder = Reg() { Bits(width = 2*w+1) }
|
val remainder = Reg() { Bits(width = 2*w+1) }
|
||||||
val subtractor = remainder(2*w,w) - divisor
|
val subtractor = remainder(2*w,w) - divisor
|
||||||
|
|
||||||
val dw = io.req.bits.fn(io.req.bits.fn.width-1)
|
val dw = io.req.bits.dw
|
||||||
val fn = io.req.bits.fn(io.req.bits.fn.width-2,0)
|
val fn = io.req.bits.fn
|
||||||
val tc = (fn === DIV_D) || (fn === DIV_R);
|
val tc = isMulFN(fn, FN_DIV) || isMulFN(fn, FN_REM)
|
||||||
|
|
||||||
val lhs_sign = tc && Mux(dw === DW_64, io.req.bits.in0(w-1), io.req.bits.in0(w/2-1))
|
val lhs_sign = tc && Mux(dw === DW_64, io.req.bits.in1(w-1), io.req.bits.in1(w/2-1))
|
||||||
val lhs_hi = Mux(dw === DW_64, io.req.bits.in0(w-1,w/2), Fill(w/2, lhs_sign))
|
val lhs_hi = Mux(dw === DW_64, io.req.bits.in1(w-1,w/2), Fill(w/2, lhs_sign))
|
||||||
val lhs_in = Cat(lhs_hi, io.req.bits.in0(w/2-1,0))
|
val lhs_in = Cat(lhs_hi, io.req.bits.in1(w/2-1,0))
|
||||||
|
|
||||||
val rhs_sign = tc && Mux(dw === DW_64, io.req.bits.in1(w-1), io.req.bits.in1(w/2-1))
|
val rhs_sign = tc && Mux(dw === DW_64, io.req.bits.in2(w-1), io.req.bits.in2(w/2-1))
|
||||||
val rhs_hi = Mux(dw === DW_64, io.req.bits.in1(w-1,w/2), Fill(w/2, rhs_sign))
|
val rhs_hi = Mux(dw === DW_64, io.req.bits.in2(w-1,w/2), Fill(w/2, rhs_sign))
|
||||||
val rhs_in = Cat(rhs_hi, io.req.bits.in1(w/2-1,0))
|
val rhs_in = Cat(rhs_hi, io.req.bits.in2(w/2-1,0))
|
||||||
|
|
||||||
when (state === s_neg_inputs) {
|
when (state === s_neg_inputs) {
|
||||||
state := s_busy
|
state := s_busy
|
||||||
@ -77,7 +78,7 @@ class rocketDivider(earlyOut: Boolean = false) extends Component {
|
|||||||
count := shift
|
count := shift
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
when (state === s_done && io.resp_rdy || io.req_kill) {
|
when (io.resp.fire() || io.kill) {
|
||||||
state := s_ready
|
state := s_ready
|
||||||
}
|
}
|
||||||
when (io.req.fire()) {
|
when (io.req.fire()) {
|
||||||
@ -86,17 +87,17 @@ class rocketDivider(earlyOut: Boolean = false) extends Component {
|
|||||||
half := (dw === DW_32);
|
half := (dw === DW_32);
|
||||||
neg_quo := lhs_sign != rhs_sign
|
neg_quo := lhs_sign != rhs_sign
|
||||||
neg_rem := lhs_sign
|
neg_rem := lhs_sign
|
||||||
rem := (fn === DIV_R) || (fn === DIV_RU);
|
rem := isMulFN(fn, FN_REM) || isMulFN(fn, FN_REMU)
|
||||||
reg_tag := io.req_tag;
|
|
||||||
divby0 := Bool(true);
|
divby0 := Bool(true);
|
||||||
divisor := rhs_in
|
divisor := rhs_in
|
||||||
remainder := lhs_in
|
remainder := lhs_in
|
||||||
|
r_req := io.req.bits
|
||||||
}
|
}
|
||||||
|
|
||||||
val result = Mux(rem, remainder(w+w, w+1), remainder(w-1,0))
|
val result = Mux(rem, remainder(w+w, w+1), remainder(w-1,0))
|
||||||
|
|
||||||
io.resp_bits := Mux(half, Cat(Fill(w/2, result(w/2-1)), result(w/2-1,0)), result)
|
io.resp.bits := r_req
|
||||||
io.resp_tag := reg_tag
|
io.resp.bits.data := Mux(half, Cat(Fill(w/2, result(w/2-1)), result(w/2-1,0)), result)
|
||||||
io.resp_val := state === s_done
|
io.resp.valid := state === s_done
|
||||||
io.req.ready := state === s_ready
|
io.req.ready := state === s_ready
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,6 @@ class Datapath(implicit conf: RocketConfiguration) extends Component
|
|||||||
val fpu = new ioDpathFPU();
|
val fpu = new ioDpathFPU();
|
||||||
val vec_ctrl = new ioCtrlDpathVec().flip
|
val vec_ctrl = new ioCtrlDpathVec().flip
|
||||||
val vec_iface = new ioDpathVecInterface()
|
val vec_iface = new ioDpathVecInterface()
|
||||||
val vec_imul_req = new io_imul_req
|
|
||||||
val vec_imul_resp = Bits(INPUT, hwacha.Constants.SZ_XLEN)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// execute definitions
|
// execute definitions
|
||||||
@ -158,35 +156,30 @@ class Datapath(implicit conf: RocketConfiguration) extends Component
|
|||||||
alu.io.in1 := ex_rs1.toUFix
|
alu.io.in1 := ex_rs1.toUFix
|
||||||
|
|
||||||
// divider
|
// divider
|
||||||
val div = new rocketDivider(earlyOut = true)
|
val div = new Divider(earlyOut = true)
|
||||||
div.io.req.valid := io.ctrl.div_val
|
div.io.req.valid := io.ctrl.div_val
|
||||||
div.io.req.bits.fn := Cat(ex_reg_ctrl_fn_dw, io.ctrl.div_fn)
|
div.io.req.bits.dw := ex_reg_ctrl_fn_dw
|
||||||
div.io.req.bits.in0 := ex_rs1
|
div.io.req.bits.fn := ex_reg_ctrl_fn_alu
|
||||||
div.io.req.bits.in1 := ex_rs2
|
div.io.req.bits.in1 := ex_rs1
|
||||||
div.io.req_tag := ex_reg_waddr
|
div.io.req.bits.in2 := ex_rs2
|
||||||
div.io.req_kill := io.ctrl.div_kill
|
div.io.req.bits.tag := ex_reg_waddr
|
||||||
div.io.resp_rdy := Bool(true)
|
div.io.kill := io.ctrl.div_kill
|
||||||
|
div.io.resp.ready := Bool(true)
|
||||||
io.ctrl.div_rdy := div.io.req.ready
|
io.ctrl.div_rdy := div.io.req.ready
|
||||||
io.ctrl.div_result_val := div.io.resp_val
|
io.ctrl.div_result_val := div.io.resp.valid
|
||||||
|
|
||||||
// multiplier
|
// multiplier
|
||||||
var mul_io = new rocketMultiplier(unroll = 4, earlyOut = true).io
|
val mul = new Multiplier(unroll = 4, earlyOut = true)
|
||||||
if (HAVE_VEC)
|
mul.io.req.valid := io.ctrl.mul_val
|
||||||
{
|
mul.io.req.bits.dw := ex_reg_ctrl_fn_dw
|
||||||
val vu_mul = new rocketVUMultiplier(nwbq = 1)
|
mul.io.req.bits.fn := ex_reg_ctrl_fn_alu
|
||||||
vu_mul.io.vu.req <> io.vec_imul_req
|
mul.io.req.bits.in1 := ex_rs1
|
||||||
vu_mul.io.vu.resp <> io.vec_imul_resp
|
mul.io.req.bits.in2 := ex_rs2
|
||||||
mul_io = vu_mul.io.cpu
|
mul.io.req.bits.tag := ex_reg_waddr
|
||||||
}
|
mul.io.kill := io.ctrl.mul_kill
|
||||||
mul_io.req.valid := io.ctrl.mul_val
|
mul.io.resp.ready := Bool(true)
|
||||||
mul_io.req.bits.fn := Cat(ex_reg_ctrl_fn_dw, io.ctrl.mul_fn)
|
io.ctrl.mul_rdy := mul.io.req.ready
|
||||||
mul_io.req.bits.in0 := ex_rs1
|
io.ctrl.mul_result_val := mul.io.resp.valid
|
||||||
mul_io.req.bits.in1 := ex_rs2
|
|
||||||
mul_io.req_tag := ex_reg_waddr
|
|
||||||
mul_io.req_kill := io.ctrl.mul_kill
|
|
||||||
mul_io.resp_rdy := Bool(true)
|
|
||||||
io.ctrl.mul_rdy := mul_io.req.ready
|
|
||||||
io.ctrl.mul_result_val := mul_io.resp_val
|
|
||||||
|
|
||||||
io.fpu.fromint_data := ex_rs1
|
io.fpu.fromint_data := ex_rs1
|
||||||
io.ctrl.ex_waddr := ex_reg_waddr
|
io.ctrl.ex_waddr := ex_reg_waddr
|
||||||
@ -267,18 +260,18 @@ class Datapath(implicit conf: RocketConfiguration) extends Component
|
|||||||
val dmem_resp_replay = io.dmem.resp.bits.replay && dmem_resp_xpu
|
val dmem_resp_replay = io.dmem.resp.bits.replay && dmem_resp_xpu
|
||||||
|
|
||||||
val mem_ll_wdata = Bits()
|
val mem_ll_wdata = Bits()
|
||||||
mem_ll_wdata := mul_io.resp_bits
|
mem_ll_wdata := mul.io.resp.bits.data
|
||||||
io.ctrl.mem_ll_waddr := mul_io.resp_tag
|
io.ctrl.mem_ll_waddr := mul.io.resp.bits.tag
|
||||||
io.ctrl.mem_ll_wb := mul_io.resp_val
|
io.ctrl.mem_ll_wb := mul.io.resp.valid
|
||||||
when (div.io.resp_val) {
|
when (div.io.resp.valid) {
|
||||||
mul_io.resp_rdy := Bool(false)
|
mul.io.resp.ready := Bool(false)
|
||||||
mem_ll_wdata := div.io.resp_bits
|
mem_ll_wdata := div.io.resp.bits.data
|
||||||
io.ctrl.mem_ll_waddr := div.io.resp_tag
|
io.ctrl.mem_ll_waddr := div.io.resp.bits.tag
|
||||||
io.ctrl.mem_ll_wb := Bool(true)
|
io.ctrl.mem_ll_wb := Bool(true)
|
||||||
}
|
}
|
||||||
when (dmem_resp_replay) {
|
when (dmem_resp_replay) {
|
||||||
mul_io.resp_rdy := Bool(false)
|
mul.io.resp.ready := Bool(false)
|
||||||
div.io.resp_rdy := Bool(false)
|
div.io.resp.ready := Bool(false)
|
||||||
mem_ll_wdata := io.dmem.resp.bits.data_subword
|
mem_ll_wdata := io.dmem.resp.bits.data_subword
|
||||||
io.ctrl.mem_ll_waddr := dmem_resp_waddr
|
io.ctrl.mem_ll_waddr := dmem_resp_waddr
|
||||||
io.ctrl.mem_ll_wb := Bool(true)
|
io.ctrl.mem_ll_wb := Bool(true)
|
||||||
@ -308,7 +301,7 @@ class Datapath(implicit conf: RocketConfiguration) extends Component
|
|||||||
Mux(io.ctrl.pcr != PCR_N, pcr.io.r.data,
|
Mux(io.ctrl.pcr != PCR_N, pcr.io.r.data,
|
||||||
wb_reg_wdata))
|
wb_reg_wdata))
|
||||||
|
|
||||||
if (HAVE_VEC)
|
if (conf.vec)
|
||||||
{
|
{
|
||||||
// vector datapath
|
// vector datapath
|
||||||
val vec = new rocketDpathVec()
|
val vec = new rocketDpathVec()
|
||||||
|
@ -5,17 +5,9 @@ import Node._
|
|||||||
import Constants._
|
import Constants._
|
||||||
import Instructions._
|
import Instructions._
|
||||||
|
|
||||||
class ioALU extends Bundle(){
|
|
||||||
val dw = UFix(INPUT, 1);
|
|
||||||
val fn = UFix(INPUT, 4);
|
|
||||||
val in2 = UFix(INPUT, 64);
|
|
||||||
val in1 = UFix(INPUT, 64);
|
|
||||||
val out = UFix(OUTPUT, 64);
|
|
||||||
val adder_out = UFix(OUTPUT, 64);
|
|
||||||
}
|
|
||||||
|
|
||||||
object ALU
|
object ALU
|
||||||
{
|
{
|
||||||
|
val SZ_ALU_FN = 4
|
||||||
val FN_X = Bits("b????")
|
val FN_X = Bits("b????")
|
||||||
val FN_ADD = UFix(0)
|
val FN_ADD = UFix(0)
|
||||||
val FN_SL = UFix(1)
|
val FN_SL = UFix(1)
|
||||||
@ -29,14 +21,34 @@ object ALU
|
|||||||
val FN_SRA = UFix(13)
|
val FN_SRA = UFix(13)
|
||||||
val FN_OP2 = UFix(15)
|
val FN_OP2 = UFix(15)
|
||||||
|
|
||||||
|
val FN_DIV = FN_XOR
|
||||||
|
val FN_DIVU = FN_SR
|
||||||
|
val FN_REM = FN_OR
|
||||||
|
val FN_REMU = FN_AND
|
||||||
|
|
||||||
|
val FN_MUL = FN_ADD
|
||||||
|
val FN_MULH = FN_SL
|
||||||
|
val FN_MULHSU = FN_SLT
|
||||||
|
val FN_MULHU = FN_SLTU
|
||||||
|
|
||||||
|
def isMulFN(fn: Bits, cmp: Bits) = fn(1,0) === cmp(1,0)
|
||||||
def isSub(cmd: Bits) = cmd(3)
|
def isSub(cmd: Bits) = cmd(3)
|
||||||
def isSLTU(cmd: Bits) = cmd(0)
|
def isSLTU(cmd: Bits) = cmd(0)
|
||||||
}
|
}
|
||||||
|
import ALU._
|
||||||
|
|
||||||
class ALU extends Component
|
class ALUIO(implicit conf: RocketConfiguration) extends Bundle {
|
||||||
|
val dw = Bits(INPUT, SZ_DW)
|
||||||
|
val fn = Bits(INPUT, SZ_ALU_FN)
|
||||||
|
val in2 = UFix(INPUT, conf.xprlen)
|
||||||
|
val in1 = UFix(INPUT, conf.xprlen)
|
||||||
|
val out = UFix(OUTPUT, conf.xprlen)
|
||||||
|
val adder_out = UFix(OUTPUT, conf.xprlen)
|
||||||
|
}
|
||||||
|
|
||||||
|
class ALU(implicit conf: RocketConfiguration) extends Component
|
||||||
{
|
{
|
||||||
import ALU._
|
val io = new ALUIO
|
||||||
val io = new ioALU();
|
|
||||||
|
|
||||||
// ADD, SUB
|
// ADD, SUB
|
||||||
val sub = isSub(io.fn)
|
val sub = isSub(io.fn)
|
||||||
|
@ -186,9 +186,9 @@ class rocketDpathPCR(implicit conf: RocketConfiguration) extends Component
|
|||||||
reg_status_ux := wdata(SR_U64).toBool;
|
reg_status_ux := wdata(SR_U64).toBool;
|
||||||
reg_status_s := wdata(SR_S).toBool;
|
reg_status_s := wdata(SR_S).toBool;
|
||||||
reg_status_ps := wdata(SR_PS).toBool;
|
reg_status_ps := wdata(SR_PS).toBool;
|
||||||
reg_status_ev := Bool(HAVE_VEC) && wdata(SR_EV).toBool;
|
reg_status_ev := Bool(conf.vec) && wdata(SR_EV).toBool;
|
||||||
reg_status_ef := Bool(HAVE_FPU) && wdata(SR_EF).toBool;
|
reg_status_ef := Bool(conf.fpu) && wdata(SR_EF).toBool;
|
||||||
reg_status_ec := Bool(HAVE_RVC) && wdata(SR_EC).toBool;
|
reg_status_ec := Bool(conf.rvc) && wdata(SR_EC).toBool;
|
||||||
reg_status_et := wdata(SR_ET).toBool;
|
reg_status_et := wdata(SR_ET).toBool;
|
||||||
}
|
}
|
||||||
when (waddr === PCR_EPC) { reg_epc := wdata(VADDR_BITS,0).toFix }
|
when (waddr === PCR_EPC) { reg_epc := wdata(VADDR_BITS,0).toFix }
|
||||||
|
@ -108,7 +108,8 @@ class rocketDpathVec extends Component
|
|||||||
UFix(52,7) -> UFix(5,9)
|
UFix(52,7) -> UFix(5,9)
|
||||||
))
|
))
|
||||||
|
|
||||||
val uts_per_bank = Mux(Bool(hwacha.Constants.HAVE_PVFB) & nreg_mod_bank > UFix(MAX_THREADS,9), UFix(MAX_THREADS, 9), nreg_mod_bank)
|
val max_threads = UFix(WIDTH_BMASK)
|
||||||
|
val uts_per_bank = Mux(Bool(HAVE_PVFB) & nreg_mod_bank > max_threads, max_threads, nreg_mod_bank)
|
||||||
|
|
||||||
val reg_hwvl = Reg(resetVal = UFix(32, 12))
|
val reg_hwvl = Reg(resetVal = UFix(32, 12))
|
||||||
val reg_appvl0 = Reg(resetVal = Bool(true))
|
val reg_appvl0 = Reg(resetVal = Bool(true))
|
||||||
|
@ -3,109 +3,72 @@ package rocket
|
|||||||
import Chisel._
|
import Chisel._
|
||||||
import Node._
|
import Node._
|
||||||
import Constants._
|
import Constants._
|
||||||
import hwacha._
|
import ALU._
|
||||||
import hwacha.Constants._
|
|
||||||
|
|
||||||
class ioMultiplier extends Bundle {
|
class MultiplierReq(implicit conf: RocketConfiguration) extends Bundle {
|
||||||
val req = new io_imul_req().flip
|
val fn = Bits(width = SZ_ALU_FN)
|
||||||
val req_tag = UFix(INPUT, 5)
|
val dw = Bits(width = SZ_DW)
|
||||||
val req_kill = Bool(INPUT)
|
val in1 = Bits(width = conf.xprlen)
|
||||||
val resp_val = Bool(OUTPUT)
|
val in2 = Bits(width = conf.xprlen)
|
||||||
val resp_rdy = Bool(INPUT)
|
val tag = UFix(width = conf.nxprbits)
|
||||||
val resp_tag = UFix(OUTPUT, 5)
|
|
||||||
val resp_bits = Bits(OUTPUT, SZ_XLEN)
|
override def clone = new MultiplierReq().asInstanceOf[this.type]
|
||||||
}
|
}
|
||||||
|
|
||||||
class rocketVUMultiplier(nwbq: Int) extends Component {
|
class MultiplierResp(implicit conf: RocketConfiguration) extends Bundle {
|
||||||
val io = new Bundle {
|
val data = Bits(width = conf.xprlen)
|
||||||
val cpu = new ioMultiplier
|
val tag = UFix(width = conf.nxprbits)
|
||||||
val vu = new Bundle {
|
|
||||||
val req = new io_imul_req
|
|
||||||
val resp = Bits(INPUT, SZ_XLEN)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val valid = Reg(resetVal = Bits(0, IMUL_STAGES))
|
override def clone = new MultiplierResp().asInstanceOf[this.type]
|
||||||
val wbq_cnt = Reg(resetVal = Bits(0, log2Up(nwbq+1)))
|
|
||||||
val tag = Vec(IMUL_STAGES) { Reg() { Bits() } }
|
|
||||||
|
|
||||||
val fire = io.cpu.req.valid && io.cpu.req.ready
|
|
||||||
|
|
||||||
valid := Cat(fire, valid(IMUL_STAGES-1) && !io.cpu.req_kill, valid(IMUL_STAGES-2,1))
|
|
||||||
when (fire) {
|
|
||||||
tag(IMUL_STAGES-1) := io.cpu.req_tag
|
|
||||||
}
|
|
||||||
for (i <- 0 until IMUL_STAGES-1) {
|
|
||||||
tag(i) := tag(i+1)
|
|
||||||
}
|
|
||||||
when (valid(0) != (io.cpu.resp_val && io.cpu.resp_rdy)) {
|
|
||||||
wbq_cnt := Mux(valid(0), wbq_cnt + UFix(1), wbq_cnt - UFix(1))
|
|
||||||
}
|
|
||||||
|
|
||||||
var inflight_cnt = valid(0)
|
|
||||||
for (i <- 1 until IMUL_STAGES)
|
|
||||||
inflight_cnt = inflight_cnt + valid(i)
|
|
||||||
inflight_cnt = inflight_cnt + wbq_cnt
|
|
||||||
val wbq_rdy = inflight_cnt < UFix(nwbq)
|
|
||||||
|
|
||||||
val wbq = (new Queue(nwbq)) { Bits(width = io.cpu.resp_bits.width + io.cpu.resp_tag.width) }
|
|
||||||
wbq.io.enq.valid := valid(0)
|
|
||||||
wbq.io.enq.bits := Cat(io.vu.resp, tag(0))
|
|
||||||
wbq.io.deq.ready := io.cpu.resp_rdy
|
|
||||||
|
|
||||||
io.cpu.req.ready := io.vu.req.ready && wbq_rdy
|
|
||||||
io.cpu.resp_val := wbq.io.deq.valid
|
|
||||||
io.cpu.resp_bits := wbq.io.deq.bits >> UFix(io.cpu.resp_tag.width)
|
|
||||||
io.cpu.resp_tag := wbq.io.deq.bits(io.cpu.resp_tag.width-1,0).toUFix
|
|
||||||
|
|
||||||
io.vu.req <> io.cpu.req
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class rocketMultiplier(unroll: Int = 1, earlyOut: Boolean = false) extends Component {
|
class MultiplierIO(implicit conf: RocketConfiguration) extends Bundle {
|
||||||
val io = new ioMultiplier
|
val req = new FIFOIO()(new MultiplierReq).flip
|
||||||
|
val kill = Bool(INPUT)
|
||||||
|
val resp = new FIFOIO()(new MultiplierResp)
|
||||||
|
}
|
||||||
|
|
||||||
val w0 = io.req.bits.in0.getWidth
|
class Multiplier(unroll: Int = 1, earlyOut: Boolean = false)(implicit conf: RocketConfiguration) extends Component {
|
||||||
|
val io = new MultiplierIO
|
||||||
|
|
||||||
|
val w0 = io.req.bits.in1.getWidth
|
||||||
val w = (w0+1+unroll-1)/unroll*unroll
|
val w = (w0+1+unroll-1)/unroll*unroll
|
||||||
val cycles = w/unroll
|
val cycles = w/unroll
|
||||||
|
|
||||||
val r_val = Reg(resetVal = Bool(false));
|
val r_val = Reg(resetVal = Bool(false));
|
||||||
val r_dw = Reg { Bits() }
|
|
||||||
val r_fn = Reg { Bits() }
|
|
||||||
val r_tag = Reg { UFix() }
|
|
||||||
val r_lhs = Reg { Bits() }
|
|
||||||
val r_prod= Reg { Bits(width = w*2) }
|
val r_prod= Reg { Bits(width = w*2) }
|
||||||
val r_lsb = Reg { Bits() }
|
val r_lsb = Reg { Bits() }
|
||||||
val r_cnt = Reg { UFix(width = log2Up(cycles+1)) }
|
val r_cnt = Reg { UFix(width = log2Up(cycles+1)) }
|
||||||
|
val r_req = Reg{new MultiplierReq}
|
||||||
|
val r_lhs = Reg{Bits(width = w0+1)}
|
||||||
|
|
||||||
val dw = io.req.bits.fn(io.req.bits.fn.width-1)
|
val dw = io.req.bits.dw
|
||||||
val fn = io.req.bits.fn(io.req.bits.fn.width-2,0)
|
val fn = io.req.bits.fn
|
||||||
|
|
||||||
val lhs_msb = Mux(dw === DW_64, io.req.bits.in0(w0-1), io.req.bits.in0(w0/2-1)).toBool
|
val lhs_msb = Mux(dw === DW_64, io.req.bits.in1(w0-1), io.req.bits.in1(w0/2-1)).toBool
|
||||||
val lhs_sign = ((fn === MUL_H) || (fn === MUL_HSU)) && lhs_msb
|
val lhs_sign = (isMulFN(fn, FN_MULH) || isMulFN(fn, FN_MULHSU)) && lhs_msb
|
||||||
val lhs_hi = Mux(dw === DW_64, io.req.bits.in0(w0-1,w0/2), Fill(w0/2, lhs_sign))
|
val lhs_hi = Mux(dw === DW_64, io.req.bits.in1(w0-1,w0/2), Fill(w0/2, lhs_sign))
|
||||||
val lhs_in = Cat(lhs_sign, lhs_hi, io.req.bits.in0(w0/2-1,0))
|
val lhs_in = Cat(lhs_sign, lhs_hi, io.req.bits.in1(w0/2-1,0))
|
||||||
|
|
||||||
val rhs_msb = Mux(dw === DW_64, io.req.bits.in1(w0-1), io.req.bits.in1(w0/2-1)).toBool
|
val rhs_msb = Mux(dw === DW_64, io.req.bits.in2(w0-1), io.req.bits.in2(w0/2-1)).toBool
|
||||||
val rhs_sign = (fn === MUL_H) && rhs_msb
|
val rhs_sign = isMulFN(fn, FN_MULH) && rhs_msb
|
||||||
val rhs_hi = Mux(dw === DW_64, io.req.bits.in1(w0-1,w0/2), Fill(w0/2, rhs_sign))
|
val rhs_hi = Mux(dw === DW_64, io.req.bits.in2(w0-1,w0/2), Fill(w0/2, rhs_sign))
|
||||||
val rhs_in = Cat(Fill(w-w0, rhs_sign), rhs_hi, io.req.bits.in1(w0/2-1,0))
|
val rhs_in = Cat(Fill(w-w0, rhs_sign), rhs_hi, io.req.bits.in2(w0/2-1,0))
|
||||||
|
|
||||||
when (io.req.valid && io.req.ready) {
|
when (io.req.fire()) {
|
||||||
r_val := Bool(true)
|
r_val := Bool(true)
|
||||||
r_cnt := UFix(0, log2Up(cycles+1))
|
r_cnt := UFix(0, log2Up(cycles+1))
|
||||||
r_dw := dw
|
r_req := io.req.bits
|
||||||
r_fn := fn
|
|
||||||
r_tag := io.req_tag
|
|
||||||
r_lhs := lhs_in
|
r_lhs := lhs_in
|
||||||
r_prod:= rhs_in
|
r_prod:= rhs_in
|
||||||
r_lsb := Bool(false)
|
r_lsb := Bool(false)
|
||||||
}
|
}
|
||||||
.elsewhen (io.resp_val && io.resp_rdy || io.req_kill) {
|
.elsewhen (io.resp.fire() || io.kill) {
|
||||||
r_val := Bool(false)
|
r_val := Bool(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
val eOutDist = (UFix(cycles)-r_cnt)*UFix(unroll)
|
val eOutDist = (UFix(cycles)-r_cnt)*UFix(unroll)
|
||||||
val outShift = Mux(r_fn === MUL_LO, UFix(0), Mux(r_dw === DW_64, UFix(64), UFix(32)))
|
val outShift = Mux(isMulFN(r_req.fn, FN_MUL), UFix(0), Mux(r_req.dw === DW_64, UFix(64), UFix(32)))
|
||||||
val shiftDist = Mux(r_cnt === UFix(cycles), outShift, eOutDist)
|
val shiftDist = Mux(r_cnt === UFix(cycles), outShift, eOutDist)
|
||||||
val eOutMask = (UFix(1) << eOutDist) - UFix(1)
|
val eOutMask = (UFix(1) << eOutDist) - UFix(1)
|
||||||
val eOut = r_cnt != UFix(0) && Bool(earlyOut) && !((r_prod(w-1,0) ^ r_lsb.toFix) & eOutMask).orR
|
val eOut = r_cnt != UFix(0) && Bool(earlyOut) && !((r_prod(w-1,0) ^ r_lsb.toFix) & eOutMask).orR
|
||||||
@ -126,7 +89,7 @@ class rocketMultiplier(unroll: Int = 1, earlyOut: Boolean = false) extends Compo
|
|||||||
val out64 = shift(w0-1,0)
|
val out64 = shift(w0-1,0)
|
||||||
|
|
||||||
io.req.ready := !r_val
|
io.req.ready := !r_val
|
||||||
io.resp_bits := Mux(r_dw === DW_64, out64, out32)
|
io.resp.bits := r_req
|
||||||
io.resp_tag := r_tag;
|
io.resp.bits.data := Mux(r_req.dw === DW_64, out64, out32)
|
||||||
io.resp_val := r_val && (r_cnt === UFix(cycles))
|
io.resp.valid := r_val && (r_cnt === UFix(cycles))
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ import Util._
|
|||||||
|
|
||||||
case class DCacheConfig(sets: Int, ways: Int, co: CoherencePolicy,
|
case class DCacheConfig(sets: Int, ways: Int, co: CoherencePolicy,
|
||||||
nmshr: Int, nrpq: Int, nsdq: Int,
|
nmshr: Int, nrpq: Int, nsdq: Int,
|
||||||
reqtagbits: Int = -1)
|
reqtagbits: Int = -1, databits: Int = -1)
|
||||||
{
|
{
|
||||||
require(isPow2(sets))
|
require(isPow2(sets))
|
||||||
require(isPow2(ways)) // TODO: relax this
|
require(isPow2(ways)) // TODO: relax this
|
||||||
@ -25,8 +25,7 @@ case class DCacheConfig(sets: Int, ways: Int, co: CoherencePolicy,
|
|||||||
def untagbits = offbits + idxbits
|
def untagbits = offbits + idxbits
|
||||||
def tagbits = lineaddrbits - idxbits
|
def tagbits = lineaddrbits - idxbits
|
||||||
def ramoffbits = log2Up(MEM_DATA_BITS/8)
|
def ramoffbits = log2Up(MEM_DATA_BITS/8)
|
||||||
def databytes = 8 // assumed by StoreGen/LoadGen/AMOALU
|
def databytes = databits/8
|
||||||
def databits = databytes*8
|
|
||||||
def wordoffbits = log2Up(databytes)
|
def wordoffbits = log2Up(databytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -624,7 +623,7 @@ class AMOALU(implicit conf: DCacheConfig) extends Component {
|
|||||||
val out = Bits(OUTPUT, conf.databits)
|
val out = Bits(OUTPUT, conf.databits)
|
||||||
}
|
}
|
||||||
|
|
||||||
require(conf.databytes == 8)
|
require(conf.databits == 64)
|
||||||
|
|
||||||
val sgned = (io.cmd === M_XA_MIN) || (io.cmd === M_XA_MAX)
|
val sgned = (io.cmd === M_XA_MIN) || (io.cmd === M_XA_MAX)
|
||||||
val minmax = (io.cmd === M_XA_MIN) || (io.cmd === M_XA_MINU) || (io.cmd === M_XA_MAX) || (io.cmd === M_XA_MAXU)
|
val minmax = (io.cmd === M_XA_MIN) || (io.cmd === M_XA_MINU) || (io.cmd === M_XA_MAX) || (io.cmd === M_XA_MAXU)
|
||||||
|
@ -16,13 +16,5 @@ object Constants extends
|
|||||||
TLBConstants with
|
TLBConstants with
|
||||||
uncore.constants.MemoryInterfaceConstants
|
uncore.constants.MemoryInterfaceConstants
|
||||||
{
|
{
|
||||||
def HAVE_RVC = false
|
|
||||||
def HAVE_FPU = true
|
|
||||||
def HAVE_VEC = false
|
|
||||||
|
|
||||||
val MAX_THREADS =
|
|
||||||
hwacha.Constants.NUM_PVFB * hwacha.Constants.WIDTH_PVFB / hwacha.Constants.SZ_BANK
|
|
||||||
|
|
||||||
val START_ADDR = 0x2000
|
val START_ADDR = 0x2000
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,18 +4,24 @@ import Chisel._
|
|||||||
import Node._
|
import Node._
|
||||||
import Constants._
|
import Constants._
|
||||||
import uncore._
|
import uncore._
|
||||||
|
import Util._
|
||||||
|
|
||||||
case class RocketConfiguration(ntiles: Int, co: CoherencePolicyWithUncached,
|
case class RocketConfiguration(ntiles: Int, co: CoherencePolicyWithUncached,
|
||||||
icache: ICacheConfig, dcache: DCacheConfig,
|
icache: ICacheConfig, dcache: DCacheConfig,
|
||||||
|
fpu: Boolean, vec: Boolean,
|
||||||
fastLoadByte: Boolean = false)
|
fastLoadByte: Boolean = false)
|
||||||
{
|
{
|
||||||
val dcacheReqTagBits = 9 // enforce compliance with require()
|
val dcacheReqTagBits = 9 // enforce compliance with require()
|
||||||
|
val xprlen = 64
|
||||||
|
val nxpr = 32
|
||||||
|
val nxprbits = log2Up(nxpr)
|
||||||
|
val rvc = false
|
||||||
}
|
}
|
||||||
|
|
||||||
class Tile(resetSignal: Bool = null)(confIn: RocketConfiguration) extends Component(resetSignal)
|
class Tile(resetSignal: Bool = null)(confIn: RocketConfiguration) extends Component(resetSignal)
|
||||||
{
|
{
|
||||||
val memPorts = if (HAVE_VEC) 3 else 2
|
val memPorts = 2 + confIn.vec
|
||||||
implicit val dcConf = confIn.dcache.copy(reqtagbits = confIn.dcacheReqTagBits + log2Up(memPorts))
|
implicit val dcConf = confIn.dcache.copy(reqtagbits = confIn.dcacheReqTagBits + log2Up(memPorts), databits = confIn.xprlen)
|
||||||
implicit val conf = confIn.copy(dcache = dcConf)
|
implicit val conf = confIn.copy(dcache = dcConf)
|
||||||
|
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
@ -40,7 +46,7 @@ class Tile(resetSignal: Bool = null)(confIn: RocketConfiguration) extends Compon
|
|||||||
io.tilelink.probe_rep <> dcache.io.mem.probe_rep
|
io.tilelink.probe_rep <> dcache.io.mem.probe_rep
|
||||||
io.tilelink.probe_rep_data <> dcache.io.mem.probe_rep_data
|
io.tilelink.probe_rep_data <> dcache.io.mem.probe_rep_data
|
||||||
|
|
||||||
if (HAVE_VEC) {
|
if (conf.vec) {
|
||||||
val vicache = new Frontend()(ICacheConfig(128, 1, conf.co)) // 128 sets x 1 ways (8KB)
|
val vicache = new Frontend()(ICacheConfig(128, 1, conf.co)) // 128 sets x 1 ways (8KB)
|
||||||
arbiter.io.requestor(2) <> vicache.io.mem
|
arbiter.io.requestor(2) <> vicache.io.mem
|
||||||
core.io.vimem <> vicache.io.cpu
|
core.io.vimem <> vicache.io.cpu
|
||||||
|
@ -4,7 +4,6 @@ import Chisel._;
|
|||||||
import Node._;
|
import Node._;
|
||||||
import Constants._;
|
import Constants._;
|
||||||
import scala.math._;
|
import scala.math._;
|
||||||
import hwacha._
|
|
||||||
|
|
||||||
class ioCAM(entries: Int, addr_bits: Int, tag_bits: Int) extends Bundle {
|
class ioCAM(entries: Int, addr_bits: Int, tag_bits: Int) extends Bundle {
|
||||||
val clear = Bool(INPUT);
|
val clear = Bool(INPUT);
|
||||||
|
Loading…
Reference in New Issue
Block a user