Support disabling atomics extension
This commit is contained in:
		| @@ -180,8 +180,9 @@ class CSRFile(implicit p: Parameters) extends CoreModule()(p) | |||||||
|   val system_insn = io.rw.cmd === CSR.I |   val system_insn = io.rw.cmd === CSR.I | ||||||
|   val cpu_ren = io.rw.cmd =/= CSR.N && !system_insn |   val cpu_ren = io.rw.cmd =/= CSR.N && !system_insn | ||||||
|  |  | ||||||
|   val isa_string = "IMA" + |   val isa_string = "IM" + | ||||||
|     (if (usingVM) "S" else "") + |     (if (usingVM) "S" else "") + | ||||||
|  |     (if (usingAtomics) "A" else "") + | ||||||
|     (if (usingFPU) "FD" else "") + |     (if (usingFPU) "FD" else "") + | ||||||
|     (if (usingRoCC) "X" else "") |     (if (usingRoCC) "X" else "") | ||||||
|   val isa = ((if (xLen == 32) BigInt(0) else BigInt(2)) << (xLen-2)) | |   val isa = ((if (xLen == 32) BigInt(0) else BigInt(2)) << (xLen-2)) | | ||||||
|   | |||||||
| @@ -98,30 +98,6 @@ class XDecode(implicit val p: Parameters) extends DecodeConstants | |||||||
|     SW->        List(Y,    N,N,N,N,N,Y,Y,A2_IMM, A1_RS1, IMM_S, DW_XPR,FN_ADD,   Y,M_XWR,    MT_W, N,N,N,N,N,N,CSR.N,N,N,N), |     SW->        List(Y,    N,N,N,N,N,Y,Y,A2_IMM, A1_RS1, IMM_S, DW_XPR,FN_ADD,   Y,M_XWR,    MT_W, N,N,N,N,N,N,CSR.N,N,N,N), | ||||||
|     SD->        List(xpr64,N,N,N,N,N,Y,Y,A2_IMM, A1_RS1, IMM_S, DW_XPR,FN_ADD,   Y,M_XWR,    MT_D, N,N,N,N,N,N,CSR.N,N,N,N), |     SD->        List(xpr64,N,N,N,N,N,Y,Y,A2_IMM, A1_RS1, IMM_S, DW_XPR,FN_ADD,   Y,M_XWR,    MT_D, N,N,N,N,N,N,CSR.N,N,N,N), | ||||||
|  |  | ||||||
|     AMOADD_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_ADD, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOXOR_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_XOR, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOSWAP_W-> List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_SWAP,MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOAND_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_AND, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOOR_W->   List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_OR,  MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOMIN_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MIN, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOMINU_W-> List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MINU,MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOMAX_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MAX, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOMAXU_W-> List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MAXU,MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOADD_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_ADD, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOSWAP_D-> List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_SWAP,MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOXOR_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_XOR, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOAND_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_AND, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOOR_D->   List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_OR,  MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOMIN_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MIN, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOMINU_D-> List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MINU,MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOMAX_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MAX, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     AMOMAXU_D-> List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MAXU,MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|  |  | ||||||
|     LR_W->      List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XLR,    MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     LR_D->      List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XLR,    MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     SC_W->      List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XSC,    MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|     SC_D->      List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XSC,    MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), |  | ||||||
|  |  | ||||||
|     LUI->       List(Y,    N,N,N,N,N,N,N,A2_IMM, A1_ZERO,IMM_U, DW_XPR,FN_ADD,   N,M_X,      MT_X, N,N,N,N,N,Y,CSR.N,N,N,N), |     LUI->       List(Y,    N,N,N,N,N,N,N,A2_IMM, A1_ZERO,IMM_U, DW_XPR,FN_ADD,   N,M_X,      MT_X, N,N,N,N,N,Y,CSR.N,N,N,N), | ||||||
|     ADDI->      List(Y,    N,N,N,N,N,N,Y,A2_IMM, A1_RS1, IMM_I, DW_XPR,FN_ADD,   N,M_X,      MT_X, N,N,N,N,N,Y,CSR.N,N,N,N), |     ADDI->      List(Y,    N,N,N,N,N,N,Y,A2_IMM, A1_RS1, IMM_I, DW_XPR,FN_ADD,   N,M_X,      MT_X, N,N,N,N,N,Y,CSR.N,N,N,N), | ||||||
|     SLTI ->     List(Y,    N,N,N,N,N,N,Y,A2_IMM, A1_RS1, IMM_I, DW_XPR,FN_SLT,   N,M_X,      MT_X, N,N,N,N,N,Y,CSR.N,N,N,N), |     SLTI ->     List(Y,    N,N,N,N,N,N,Y,A2_IMM, A1_RS1, IMM_I, DW_XPR,FN_SLT,   N,M_X,      MT_X, N,N,N,N,N,Y,CSR.N,N,N,N), | ||||||
| @@ -185,6 +161,42 @@ class XDecode(implicit val p: Parameters) extends DecodeConstants | |||||||
|     CSRRCI->    List(Y,    N,N,N,N,N,N,N,A2_IMM, A1_ZERO,IMM_Z, DW_XPR,FN_ADD,   N,M_X,      MT_X, N,N,N,N,N,Y,CSR.C,N,N,N)) |     CSRRCI->    List(Y,    N,N,N,N,N,N,N,A2_IMM, A1_ZERO,IMM_Z, DW_XPR,FN_ADD,   N,M_X,      MT_X, N,N,N,N,N,Y,CSR.C,N,N,N)) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | class ADecode(implicit val p: Parameters) extends DecodeConstants | ||||||
|  | { | ||||||
|  |   val table: Array[(BitPat, List[BitPat])] = Array( | ||||||
|  |                 //               jal                                                               renf1             fence.i | ||||||
|  |                 //               | jalr                                                            | renf2           | | ||||||
|  |                 //         fp_val| | renx2                                                         | | renf3         | | ||||||
|  |                 //         | rocc| | | renx1     s_alu1                          mem_val           | | | wfd         |  | ||||||
|  |                 //   val   | | br| | | | s_alu2  |       imm    dw     alu       | mem_cmd mem_type| | | | div       |  | ||||||
|  |                 //   |     | | | | | | | |       |       |      |      |         | |         |     | | | | | wxd     | fence | ||||||
|  |                 //   |     | | | | | | | |       |       |      |      |         | |         |     | | | | | | csr   | | amo | ||||||
|  |                 //   |     | | | | | | | |       |       |      |      |         | |         |     | | | | | | |     | | | | ||||||
|  |     AMOADD_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_ADD, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOXOR_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_XOR, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOSWAP_W-> List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_SWAP,MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOAND_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_AND, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOOR_W->   List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_OR,  MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOMIN_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MIN, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOMINU_W-> List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MINU,MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOMAX_W->  List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MAX, MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOMAXU_W-> List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MAXU,MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOADD_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_ADD, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOSWAP_D-> List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_SWAP,MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOXOR_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_XOR, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOAND_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_AND, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOOR_D->   List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_OR,  MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOMIN_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MIN, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOMINU_D-> List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MINU,MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOMAX_D->  List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MAX, MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     AMOMAXU_D-> List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XA_MAXU,MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |  | ||||||
|  |     LR_W->      List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XLR,    MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     LR_D->      List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XLR,    MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     SC_W->      List(Y,    N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XSC,    MT_W, N,N,N,N,N,Y,CSR.N,N,N,Y), | ||||||
|  |     SC_D->      List(xpr64,N,N,N,N,N,Y,Y,A2_ZERO,A1_RS1, IMM_X, DW_XPR,FN_ADD,   Y,M_XSC,    MT_D, N,N,N,N,N,Y,CSR.N,N,N,Y)) | ||||||
|  | } | ||||||
|  |  | ||||||
| class FDecode(implicit val p: Parameters) extends DecodeConstants | class FDecode(implicit val p: Parameters) extends DecodeConstants | ||||||
| { | { | ||||||
|   val table: Array[(BitPat, List[BitPat])] = Array( |   val table: Array[(BitPat, List[BitPat])] = Array( | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ case object XLen extends Field[Int] | |||||||
| case object FetchWidth extends Field[Int] | case object FetchWidth extends Field[Int] | ||||||
| case object RetireWidth extends Field[Int] | case object RetireWidth extends Field[Int] | ||||||
| case object UseVM extends Field[Boolean] | case object UseVM extends Field[Boolean] | ||||||
|  | case object UseAtomics extends Field[Boolean] | ||||||
| case object UsePerfCounters extends Field[Boolean] | case object UsePerfCounters extends Field[Boolean] | ||||||
| case object FastLoadWord extends Field[Boolean] | case object FastLoadWord extends Field[Boolean] | ||||||
| case object FastLoadByte extends Field[Boolean] | case object FastLoadByte extends Field[Boolean] | ||||||
| @@ -32,6 +33,7 @@ trait HasCoreParameters extends HasAddrMapParameters { | |||||||
|  |  | ||||||
|   val usingVM = p(UseVM) |   val usingVM = p(UseVM) | ||||||
|   val usingFPU = p(UseFPU) |   val usingFPU = p(UseFPU) | ||||||
|  |   val usingAtomics = p(UseAtomics) | ||||||
|   val usingFDivSqrt = p(FDivSqrt) |   val usingFDivSqrt = p(FDivSqrt) | ||||||
|   val usingRoCC = !p(BuildRoCC).isEmpty |   val usingRoCC = !p(BuildRoCC).isEmpty | ||||||
|   val usingFastMulDiv = p(FastMulDiv) |   val usingFastMulDiv = p(FastMulDiv) | ||||||
| @@ -119,6 +121,7 @@ class Rocket(implicit p: Parameters) extends CoreModule()(p) { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   var decode_table = new XDecode().table |   var decode_table = new XDecode().table | ||||||
|  |   if (usingAtomics) decode_table ++= new ADecode().table | ||||||
|   if (usingFPU) decode_table ++= new FDecode().table |   if (usingFPU) decode_table ++= new FDecode().table | ||||||
|   if (usingFPU && usingFDivSqrt) decode_table ++= new FDivSqrtDecode().table |   if (usingFPU && usingFDivSqrt) decode_table ++= new FDivSqrtDecode().table | ||||||
|   if (usingRoCC) decode_table ++= new RoCCDecode().table |   if (usingRoCC) decode_table ++= new RoCCDecode().table | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user