rvdecoderdb的使用

chisel

DSL(Domain-Specific Language)

ChiselDecoder

TODO

RVDecoderDB

rvdecoderDB 是一个chisel项目,它可以解析来自riscv-opcodes 的指令信息

安装,使用

安装

把rvdecoderdb的源代码clone下来然后加入build.sc的sources目录就行了

1
2
3
4
5
def sources = T.sources {
super.sources() ++ Seq(
PathRef(os.pwd / "rvdecoderdb" / "rvdecoderdb")
)
}

使用

首先要import org.chipsalliance.rvdecoderdb

然后可以指定targetSet,并且选择你需要的指令类型(可以先在riscv-opcodes里面搜)

1
2
3
4
5
6
7
val instTable  = rvdecoderdb.fromFile.instructions(os.pwd / "riscv-opcodes")
val targetSets = Set("rv_i", "rv_m", "rv_zicsr", "rv_system")
val instList = instTable
.filter(instr => targetSets.contains(instr.instructionSet.name))
.filter(_.pseudoFrom.isEmpty)
.map(Insn(_))
.toSeq

instTable就是riscv-opcodes

API,args

rvdecoderdb/src/Instruction.scala&&rvdecoderdb/src/Utils.scala

Note

args不是string类型!,所以如果想比较args-name,应该

1
inst.inst.args.map(_.name).contains("rs1")

向其中添加方法

1
2
3
4
5
6
7
object Insn {
implicit class addMethodsToInsn(i: Insn) {
def hasArg(arg: String) = i.inst.args.map(_.name).contains(arg)

lazy val opcode: BitPat = i.bitPat(6, 0)
}
}

Debug

可以使用rvdecoderDB提供的toString方法来打印信息

1
2
3
4
  //for debugs
instList.foreach { insn =>
println(s"${insn.toString()}")
}

rvdecoderdb的使用
https://20040702.xyz/2025/01/12/rvdecoderdb/
作者
Seeker
发布于
2025年1月12日
许可协议