don't disassemble within chisel
This commit is contained in:
		@@ -317,10 +317,10 @@ class Datapath(implicit conf: RocketConfiguration) extends Module
 | 
			
		||||
    Mux(io.ctrl.sel_pc === PC_PCR, pcr.io.evec,
 | 
			
		||||
        wb_reg_pc)).toUInt // PC_WB
 | 
			
		||||
 | 
			
		||||
  printf("C: %d [%d] pc=[%x] W[r%d=%x] R[r%d=%x] R[r%d=%x] inst=[%x] %s\n",
 | 
			
		||||
  printf("C: %d [%d] pc=[%x] W[r%d=%x] R[r%d=%x] R[r%d=%x] inst=[%x] DASM(%x)\n",
 | 
			
		||||
         tsc_reg(32,0), io.ctrl.wb_valid, wb_reg_pc,
 | 
			
		||||
         Mux(wb_wen, wb_reg_waddr, UInt(0)), wb_wdata,
 | 
			
		||||
         wb_reg_inst(26,22), Reg(next=Reg(next=ex_rs1)),
 | 
			
		||||
         wb_reg_inst(21,17), Reg(next=Reg(next=ex_rs2)),
 | 
			
		||||
         wb_reg_inst, Disassemble(wb_reg_inst))
 | 
			
		||||
         wb_reg_inst, wb_reg_inst)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -192,268 +192,3 @@ object Instructions
 | 
			
		||||
  def CUSTOM3_RD_RS1 = Bits("b??????????????????????1101111011")
 | 
			
		||||
  def CUSTOM3_RD_RS1_RS2 = Bits("b??????????????????????1111111011")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
object Disassemble
 | 
			
		||||
{
 | 
			
		||||
  def apply(insn: UInt) = {
 | 
			
		||||
    val name :: fmt :: Nil = ListLookup(insn, default, table)
 | 
			
		||||
    sprintf("%s %s", name, operands(insn, fmt))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private def operands(insn: Bits, fmt: Bits): Bits = {
 | 
			
		||||
    val x = AVec(Str(" x0"), Str(" ra"), Str(" s0"), Str(" s1"),
 | 
			
		||||
                 Str(" s2"), Str(" s3"), Str(" s4"), Str(" s5"),
 | 
			
		||||
                 Str(" s6"), Str(" s7"), Str(" s8"), Str(" s9"),
 | 
			
		||||
                 Str("s10"), Str("s11"), Str(" sp"), Str(" tp"),
 | 
			
		||||
                 Str(" v0"), Str(" v1"), Str(" a0"), Str(" a1"),
 | 
			
		||||
                 Str(" a2"), Str(" a3"), Str(" a4"), Str(" a5"),
 | 
			
		||||
                 Str(" a6"), Str(" a7"), Str(" t0"), Str(" t1"),
 | 
			
		||||
                 Str(" t2"), Str(" t3"), Str(" t4"), Str(" t5"))
 | 
			
		||||
    val f = AVec(Str(" fs0"), Str(" fs1"), Str(" fs2"), Str(" fs3"),
 | 
			
		||||
                 Str(" fs4"), Str(" fs5"), Str(" fs6"), Str(" fs7"),
 | 
			
		||||
                 Str(" fs8"), Str(" fs9"), Str("fs10"), Str("fs11"),
 | 
			
		||||
                 Str("fs12"), Str("fs13"), Str("fs14"), Str("fs15"),
 | 
			
		||||
                 Str(" fv0"), Str(" fv1"), Str(" fa0"), Str(" fa1"),
 | 
			
		||||
                 Str(" fa2"), Str(" fa3"), Str(" fa4"), Str(" fa5"),
 | 
			
		||||
                 Str(" fa6"), Str(" fa7"), Str(" ft0"), Str(" ft1"),
 | 
			
		||||
                 Str(" ft2"), Str(" ft3"), Str(" ft4"), Str(" ft5"))
 | 
			
		||||
 | 
			
		||||
    def hex(x: SInt, plus: Char = ' ') =
 | 
			
		||||
      Cat(Mux(x < SInt(0), Str("-0x"), Str(plus + "0x")), Str(x.abs, 16))
 | 
			
		||||
 | 
			
		||||
    val comma = Str(',')
 | 
			
		||||
    val lparen = Str('(')
 | 
			
		||||
    val rparen = Str(')')
 | 
			
		||||
 | 
			
		||||
    val rd = insn(31,27)
 | 
			
		||||
    val rs1 = insn(26,22)
 | 
			
		||||
    val rs2 = insn(21,17)
 | 
			
		||||
    val rs3 = insn(16,12)
 | 
			
		||||
    val immv = insn(21,10).toSInt
 | 
			
		||||
    val bmmv = Cat(insn(31,27), insn(16,10)).toSInt
 | 
			
		||||
    val jmmv = insn(31,7).toSInt
 | 
			
		||||
 | 
			
		||||
    val imm = hex(Mux(fmt === FMT_B, bmmv << UInt(1),
 | 
			
		||||
                  Mux(fmt === FMT_I || fmt === FMT_LD || fmt === FMT_FLD, immv,
 | 
			
		||||
                  Mux(fmt === FMT_ST || fmt === FMT_FST, bmmv,
 | 
			
		||||
                  SInt(0)))))
 | 
			
		||||
    val jmm = hex(jmmv << UInt(1))
 | 
			
		||||
    val lmm = Cat(Str("0x"), Str(insn(26,7).toUInt, 16))
 | 
			
		||||
 | 
			
		||||
    val addr = Cat(comma, imm, lparen, x(rs1), rparen)
 | 
			
		||||
 | 
			
		||||
    val r0 = x(rd)
 | 
			
		||||
    val r1 = Cat(r0, comma, x(rs1))
 | 
			
		||||
    val r2 = Cat(r1, comma, x(rs2))
 | 
			
		||||
    val f1 = Cat(f(rd), comma, f(rs1))
 | 
			
		||||
    val f2 = Cat(f1, comma, f(rs2))
 | 
			
		||||
    val f3 = Cat(f2, comma, f(rs3))
 | 
			
		||||
    val fx = Cat(f(rd), comma, x(rs1))
 | 
			
		||||
    val xf1 = Cat(x(rd), comma, f(rs1))
 | 
			
		||||
    val xf2 = Cat(xf1, comma, f(rs2))
 | 
			
		||||
    val z = Str(' ')
 | 
			
		||||
    val i = Cat(r1, comma, imm)
 | 
			
		||||
    val b = Cat(x(rs1), comma, x(rs2), comma, imm)
 | 
			
		||||
    val j = jmm
 | 
			
		||||
    val l = Cat(x(rd), comma, lmm)
 | 
			
		||||
    val ld = Cat(x(rd), addr)
 | 
			
		||||
    val st = Cat(x(rs2), addr)
 | 
			
		||||
    val fld = Cat(f(rd), addr)
 | 
			
		||||
    val fst = Cat(f(rs2), addr)
 | 
			
		||||
    val amo = r2
 | 
			
		||||
 | 
			
		||||
    val opts = Seq(r0, r1, r2, f1, f2, f3, fx, xf1, xf2, z, i, b, j, l,  ld, st,
 | 
			
		||||
                   fld, fst, amo)
 | 
			
		||||
    val maxLen = opts.map(_.getWidth).reduce(_ max _)
 | 
			
		||||
    val padded = opts.map(x => x.toUInt << UInt(maxLen - x.getWidth))
 | 
			
		||||
    AVec(padded)(fmt.toUInt)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private def FMT_X   = Bits("b?????", 5)
 | 
			
		||||
  private def FMT_R0  = Bits(0, 5)
 | 
			
		||||
  private def FMT_R1  = Bits(1, 5)
 | 
			
		||||
  private def FMT_R2  = Bits(2, 5)
 | 
			
		||||
  private def FMT_F1  = Bits(3, 5)
 | 
			
		||||
  private def FMT_F2  = Bits(4, 5)
 | 
			
		||||
  private def FMT_F3  = Bits(5, 5)
 | 
			
		||||
  private def FMT_FX  = Bits(6, 5)
 | 
			
		||||
  private def FMT_XF1 = Bits(7, 5)
 | 
			
		||||
  private def FMT_XF2 = Bits(8, 5)
 | 
			
		||||
  private def FMT_0   = Bits(9, 5)
 | 
			
		||||
  private def FMT_I   = Bits(10, 5)
 | 
			
		||||
  private def FMT_B   = Bits(11, 5)
 | 
			
		||||
  private def FMT_J   = Bits(12, 5)
 | 
			
		||||
  private def FMT_L   = Bits(13, 5)
 | 
			
		||||
  private def FMT_LD  = Bits(14, 5)
 | 
			
		||||
  private def FMT_ST  = Bits(15, 5)
 | 
			
		||||
  private def FMT_FLD = Bits(16, 5)
 | 
			
		||||
  private def FMT_FST = Bits(17, 5)
 | 
			
		||||
  private def FMT_AMO = Bits(18, 5)
 | 
			
		||||
 | 
			
		||||
  private def default = List(Str("unknown "), FMT_0)
 | 
			
		||||
 | 
			
		||||
  import Instructions._
 | 
			
		||||
  private def table = Array(
 | 
			
		||||
    BNE->       List(Str("bne     "), FMT_B),
 | 
			
		||||
    BEQ->       List(Str("beq     "), FMT_B),
 | 
			
		||||
    BLT->       List(Str("blt     "), FMT_B),
 | 
			
		||||
    BLTU->      List(Str("bltu    "), FMT_B),
 | 
			
		||||
    BGE->       List(Str("bge     "), FMT_B),
 | 
			
		||||
    BGEU->      List(Str("bgeu    "), FMT_B),
 | 
			
		||||
 | 
			
		||||
    JAL->       List(Str("jal     "), FMT_J),
 | 
			
		||||
    JALR->      List(Str("jalr    "), FMT_LD),
 | 
			
		||||
    AUIPC->     List(Str("auipc   "), FMT_L),
 | 
			
		||||
 | 
			
		||||
    LB->        List(Str("lb      "), FMT_LD),
 | 
			
		||||
    LH->        List(Str("lh      "), FMT_LD),
 | 
			
		||||
    LW->        List(Str("lw      "), FMT_LD),
 | 
			
		||||
    LD->        List(Str("ld      "), FMT_LD),
 | 
			
		||||
    LBU->       List(Str("lbu     "), FMT_LD),
 | 
			
		||||
    LHU->       List(Str("lhu     "), FMT_LD),
 | 
			
		||||
    LWU->       List(Str("lwu     "), FMT_LD),
 | 
			
		||||
    SB->        List(Str("sb      "), FMT_ST),
 | 
			
		||||
    SH->        List(Str("sh      "), FMT_ST),
 | 
			
		||||
    SW->        List(Str("sw      "), FMT_ST),
 | 
			
		||||
    SD->        List(Str("sd      "), FMT_ST),
 | 
			
		||||
 | 
			
		||||
    AMOADD_W->  List(Str("amoaddw "), FMT_AMO),
 | 
			
		||||
    AMOSWAP_W-> List(Str("amoswapw"), FMT_AMO),
 | 
			
		||||
    AMOAND_W->  List(Str("amoandw "), FMT_AMO),
 | 
			
		||||
    AMOOR_W->   List(Str("amoorw  "), FMT_AMO),
 | 
			
		||||
    AMOMIN_W->  List(Str("amominw "), FMT_AMO),
 | 
			
		||||
    AMOMINU_W-> List(Str("amominuw"), FMT_AMO),
 | 
			
		||||
    AMOMAX_W->  List(Str("amomaxw "), FMT_AMO),
 | 
			
		||||
    AMOMAXU_W-> List(Str("amomaxuw"), FMT_AMO),
 | 
			
		||||
    AMOADD_D->  List(Str("amoaddd "), FMT_AMO),
 | 
			
		||||
    AMOSWAP_D-> List(Str("amoswapd"), FMT_AMO),
 | 
			
		||||
    AMOAND_D->  List(Str("amoandd "), FMT_AMO),
 | 
			
		||||
    AMOOR_D->   List(Str("amoord  "), FMT_AMO),
 | 
			
		||||
    AMOMIN_D->  List(Str("amomind "), FMT_AMO),
 | 
			
		||||
    AMOMINU_D-> List(Str("amominud"), FMT_AMO),
 | 
			
		||||
    AMOMAX_D->  List(Str("amomaxd "), FMT_AMO),
 | 
			
		||||
    AMOMAXU_D-> List(Str("amomaxud"), FMT_AMO),
 | 
			
		||||
 | 
			
		||||
    LR_W->      List(Str("lr.w    "), FMT_AMO),
 | 
			
		||||
    LR_D->      List(Str("lr.d    "), FMT_AMO),
 | 
			
		||||
    SC_W->      List(Str("sc.w    "), FMT_AMO),
 | 
			
		||||
    SC_D->      List(Str("sc.d    "), FMT_AMO),
 | 
			
		||||
 | 
			
		||||
    LUI->       List(Str("lui     "), FMT_L),
 | 
			
		||||
    ADDI->      List(Str("addi    "), FMT_I),
 | 
			
		||||
    SLTI ->     List(Str("slti    "), FMT_I),
 | 
			
		||||
    SLTIU->     List(Str("sltiu   "), FMT_I),
 | 
			
		||||
    ANDI->      List(Str("andi    "), FMT_I),
 | 
			
		||||
    ORI->       List(Str("ori     "), FMT_I),
 | 
			
		||||
    XORI->      List(Str("xori    "), FMT_I),
 | 
			
		||||
    SLLI->      List(Str("slli    "), FMT_I),
 | 
			
		||||
    SRLI->      List(Str("srli    "), FMT_I),
 | 
			
		||||
    SRAI->      List(Str("srai    "), FMT_I),
 | 
			
		||||
    ADD->       List(Str("add     "), FMT_R2),
 | 
			
		||||
    SUB->       List(Str("sub     "), FMT_R2),
 | 
			
		||||
    SLT->       List(Str("slt     "), FMT_R2),
 | 
			
		||||
    SLTU->      List(Str("sltu    "), FMT_R2),
 | 
			
		||||
    AND->       List(Str("and     "), FMT_R2),
 | 
			
		||||
    OR->        List(Str("or      "), FMT_R2),
 | 
			
		||||
    XOR->       List(Str("xor     "), FMT_R2),
 | 
			
		||||
    SLL->       List(Str("sll     "), FMT_R2),
 | 
			
		||||
    SRL->       List(Str("srl     "), FMT_R2),
 | 
			
		||||
    SRA->       List(Str("sra     "), FMT_R2),
 | 
			
		||||
 | 
			
		||||
    ADDIW->     List(Str("addiw   "), FMT_I),
 | 
			
		||||
    SLLIW->     List(Str("slliw   "), FMT_I),
 | 
			
		||||
    SRLIW->     List(Str("srliw   "), FMT_I),
 | 
			
		||||
    SRAIW->     List(Str("sraiw   "), FMT_I),
 | 
			
		||||
    ADDW->      List(Str("addw    "), FMT_R2),
 | 
			
		||||
    SUBW->      List(Str("subw    "), FMT_R2),
 | 
			
		||||
    SLLW->      List(Str("sllw    "), FMT_R2),
 | 
			
		||||
    SRLW->      List(Str("srlw    "), FMT_R2),
 | 
			
		||||
    SRAW->      List(Str("sraw    "), FMT_R2),
 | 
			
		||||
 | 
			
		||||
    MUL->       List(Str("mul     "), FMT_R2),
 | 
			
		||||
    MULH->      List(Str("mulh    "), FMT_R2),
 | 
			
		||||
    MULHU->     List(Str("mulhu   "), FMT_R2),
 | 
			
		||||
    MULHSU->    List(Str("mulhsu  "), FMT_R2),
 | 
			
		||||
    MULW->      List(Str("mulw    "), FMT_R2),
 | 
			
		||||
 | 
			
		||||
    DIV->       List(Str("div     "), FMT_R2),
 | 
			
		||||
    DIVU->      List(Str("divu    "), FMT_R2),
 | 
			
		||||
    REM->       List(Str("rem     "), FMT_R2),
 | 
			
		||||
    REMU->      List(Str("remu    "), FMT_R2),
 | 
			
		||||
    DIVW->      List(Str("divw    "), FMT_R2),
 | 
			
		||||
    DIVUW->     List(Str("divuw   "), FMT_R2),
 | 
			
		||||
    REMW->      List(Str("remw    "), FMT_R2),
 | 
			
		||||
    REMUW->     List(Str("remuw   "), FMT_R2),
 | 
			
		||||
 | 
			
		||||
    SYSCALL->   List(Str("syscall "), FMT_0),
 | 
			
		||||
    SETPCR->    List(Str("setpcr  "), FMT_I),
 | 
			
		||||
    CLEARPCR->  List(Str("clearpcr"), FMT_I),
 | 
			
		||||
    ERET->      List(Str("eret    "), FMT_0),
 | 
			
		||||
    FENCE->     List(Str("fence   "), FMT_0),
 | 
			
		||||
    FENCE_I->   List(Str("fence.i "), FMT_0),
 | 
			
		||||
    MFPCR->     List(Str("mfpcr   "), FMT_R2),
 | 
			
		||||
    MTPCR->     List(Str("mtpcr   "), FMT_R2),
 | 
			
		||||
    RDTIME->    List(Str("rdtime  "), FMT_R0),
 | 
			
		||||
    RDCYCLE->   List(Str("rdcycle "), FMT_R0),
 | 
			
		||||
    RDINSTRET-> List(Str("rdinstrt"), FMT_R0),
 | 
			
		||||
 | 
			
		||||
    FCVT_S_D->  List(Str("fcvt.sd "), FMT_F1),
 | 
			
		||||
    FCVT_D_S->  List(Str("fcvt.ds "), FMT_F1),
 | 
			
		||||
    FSGNJ_S->   List(Str("fsgnj.s "), FMT_F2),
 | 
			
		||||
    FSGNJ_D->   List(Str("fsgnj.d "), FMT_F2),
 | 
			
		||||
    FSGNJX_S->  List(Str("fsgnx.s "), FMT_F2),
 | 
			
		||||
    FSGNJX_D->  List(Str("fsgnx.d "), FMT_F2),
 | 
			
		||||
    FSGNJN_S->  List(Str("fsgnjn.s"), FMT_F2),
 | 
			
		||||
    FSGNJN_D->  List(Str("fsgnjn.d"), FMT_F2),
 | 
			
		||||
    FMIN_S->    List(Str("fmin.s  "), FMT_F2),
 | 
			
		||||
    FMIN_D->    List(Str("fmin.d  "), FMT_F2),
 | 
			
		||||
    FMAX_S->    List(Str("fmax.s  "), FMT_F2),
 | 
			
		||||
    FMAX_D->    List(Str("fmax.d  "), FMT_F2),
 | 
			
		||||
    FADD_S->    List(Str("fadd.s  "), FMT_F2),
 | 
			
		||||
    FADD_D->    List(Str("fadd.d  "), FMT_F2),
 | 
			
		||||
    FSUB_S->    List(Str("fsub.s  "), FMT_F2),
 | 
			
		||||
    FSUB_D->    List(Str("fsub.d  "), FMT_F2),
 | 
			
		||||
    FMUL_S->    List(Str("fmul.s  "), FMT_F2),
 | 
			
		||||
    FMUL_D->    List(Str("fmul.d  "), FMT_F2),
 | 
			
		||||
    FMADD_S->   List(Str("fmadd.s "), FMT_F3),
 | 
			
		||||
    FMADD_D->   List(Str("fmadd.d "), FMT_F3),
 | 
			
		||||
    FMSUB_S->   List(Str("fmsub.s "), FMT_F3),
 | 
			
		||||
    FMSUB_D->   List(Str("fmsub.d "), FMT_F3),
 | 
			
		||||
    FNMADD_S->  List(Str("fnmadd.s"), FMT_F3),
 | 
			
		||||
    FNMADD_D->  List(Str("fnmadd.d"), FMT_F3),
 | 
			
		||||
    FNMSUB_S->  List(Str("fnmsub.s"), FMT_F3),
 | 
			
		||||
    FNMSUB_D->  List(Str("fnmsub.d"), FMT_F3),
 | 
			
		||||
    FMV_X_S->   List(Str("fmv.x.s "), FMT_XF1),
 | 
			
		||||
    FMV_X_D->   List(Str("fmv.x.d "), FMT_XF1),
 | 
			
		||||
    FCVT_W_S->  List(Str("fcvt.ws "), FMT_XF1),
 | 
			
		||||
    FCVT_W_D->  List(Str("fcvt.wd "), FMT_XF1),
 | 
			
		||||
    FCVT_WU_S-> List(Str("fcvt.wus"), FMT_XF1),
 | 
			
		||||
    FCVT_WU_D-> List(Str("fcvt.wud"), FMT_XF1),
 | 
			
		||||
    FCVT_L_S->  List(Str("fcvt.ls "), FMT_XF1),
 | 
			
		||||
    FCVT_L_D->  List(Str("fcvt.ld "), FMT_XF1),
 | 
			
		||||
    FCVT_LU_S-> List(Str("fcvt.lus"), FMT_XF1),
 | 
			
		||||
    FCVT_LU_D-> List(Str("fcvt.lud"), FMT_XF1),
 | 
			
		||||
    FEQ_S->     List(Str("feq.s   "), FMT_XF2),
 | 
			
		||||
    FEQ_D->     List(Str("feq.d   "), FMT_XF2),
 | 
			
		||||
    FLT_S->     List(Str("flt.s   "), FMT_XF2),
 | 
			
		||||
    FLT_D->     List(Str("flt.d   "), FMT_XF2),
 | 
			
		||||
    FLE_S->     List(Str("fle.s   "), FMT_XF2),
 | 
			
		||||
    FLE_D->     List(Str("fle.d   "), FMT_XF2),
 | 
			
		||||
    FMV_S_X->   List(Str("fmv.s.x "), FMT_FX),
 | 
			
		||||
    FMV_D_X->   List(Str("fmv.d.x "), FMT_FX),
 | 
			
		||||
    FCVT_S_W->  List(Str("fcvt.sw "), FMT_FX),
 | 
			
		||||
    FCVT_D_W->  List(Str("fcvt.dw "), FMT_FX),
 | 
			
		||||
    FCVT_S_WU-> List(Str("fcvt.swu"), FMT_FX),
 | 
			
		||||
    FCVT_D_WU-> List(Str("fcvt.dwu"), FMT_FX),
 | 
			
		||||
    FCVT_S_L->  List(Str("fcvt.sl "), FMT_FX),
 | 
			
		||||
    FCVT_D_L->  List(Str("fcvt.dl "), FMT_FX),
 | 
			
		||||
    FCVT_S_LU-> List(Str("fcvt.slu"), FMT_FX),
 | 
			
		||||
    FCVT_D_LU-> List(Str("fcvt.dlu"), FMT_FX),
 | 
			
		||||
    FRSR->      List(Str("frsr    "), FMT_R0),
 | 
			
		||||
    FSSR->      List(Str("fssr    "), FMT_R1),
 | 
			
		||||
    FLW->       List(Str("flw     "), FMT_FLD),
 | 
			
		||||
    FLD->       List(Str("fld     "), FMT_FLD),
 | 
			
		||||
    FSW->       List(Str("fsw     "), FMT_FST),
 | 
			
		||||
    FSD->       List(Str("fsd     "), FMT_FST)
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user