关于rocc的内容很多,我会分多章进行讲解。
初步规划以下面章节为划分。
1. 协议,自定义指令说明。
2. rocket-chip RoCC各模块的scala代码说明。
3. 软件代码编译实现。
4. rocket-chip RoCC各模块硬件实现和硬件仿真。
第二部分rocket-chip RoCC各模块的scala代码说明。
1) Rocket-chip中的定制CSR寄存器
利用grep指令搜索scala中关于0x7c0和0x7c1的内容,结果如下图。

顺着找下去可以找到RocketCore.scala模块。

利用bpmCSR(bpmCSRId=0x7c0)和chickenCSR(chickenCSRId=0x7c1)定义不同的方法。

getOrElse()主要就是防范措施,如果有值,那就可以得到这个值,如果没有就会得到一个默认值。
def getOrElse[B1 >: B](key: A, default: => B1): B1 = get(key) match {
case Some(v) => v
case None => default
}
从API中可以看出,传入的参数是(key,default)这种形式,返回值是:如果有key那就get(key),如果没有,就返回default。
在代码中的意思是如果chickenCSRId=0x7c1存在相应的bit,则取对应bit的值,如果不存在相应的bit,则取false.B/true.B值,固定相应def的值。
可以通过继续追查disableICachePrefetch等关键字,找到使用这些def的具体位置。
0x7c0和0x7c1的内相关容可以看前文。
2) Rocket-chip中定制指令的使用
我们利用grep和正则表达式可以轻易搜到定制指令相关的scala源文件,如下图所示。

可以看到,与rocket-chip定制指令相关的scala文件有sybsystem/Configs.scala和tile/LazyRoCC.scala。
在sybsystem/Configs.scala中对各定制指令模块进行例化,并指定各模块使用的定制指令编号,具体入下图。

再利用WithRoccExample作为关键字进行搜索后,可以在system/Configs.scala文件中找到WithRoccExample的调用,使用的方式为:new WithRoccExample ++。这样编译后,生成的rocket-chip RTL就会带有accumulator、translator、counter和blackbox这四个模块。
下面对tile/LazyRoCC.scala的部分代码进行简单说明。
先看一下rocc统一的模块端口,如下图。

我在第一章节已经说明了,custom0~3都是使用R类指令格式的,所以可以看到上图中RoCCInstruction就是按照R类指令格式来定义的,funct就是funct7,而xd、xs1和xs2就是funct3。在accumulator模块中xs1和xs2没有用到,xd是作为需要返回计算结果到rd寄存器的标志。也就是说,funct、rs2(32个通用寄存器的编号)、rs1(32个通用寄存器的编号)、xd、xs1、xs2、rd(32个通用寄存器的编号)、opcode都要以散开信号的形式进入到rocc模块中,这里的rocc模块没有特定指明是哪个,也就是全部都要遵守这个约定。
继续看RoCCCommand,首先将刚定义的RoCCInstruction拿出来,然后再加了rs1、rs2和status。这里的rs1和rs2和前面RoCCInstruction的不同,这里的rs1和rs2不是32个通用寄存器的编号,是该对应编号通用寄存器所存储的数值,具体就是0-31共32个通用寄存器,现在的编号2寄存器存的32bits数据为0x12345678,而编号7存的是0xFFFFAAAA,如果RoCCInstruction中的rs1为2,rs2为7,则RoCCCommand中的rs1为0x12345678,rs2为0xFFFFAAAA,它们都是xLen的宽度,我的总线宽度为32bits,所以它们的存储值也就是32bits。statu

本文详细介绍了Rocket-chip中RoCC(Rocket Custom Coprocessor)模块的 scala 代码结构,包括定制 CSR 寄存器、指令的使用以及 RoCC 指令格式。讲解了RoCCCommand、RoCCResponse、RoCCCoreIO和RoCCIO的定义,并分析了RoCCCommandRouter如何根据opcode路由定制指令。同时,概述了RoCCModuleImp、LazyRoCC和OpcodeSet等关键概念,展示了RoCC模块与核心之间的交互机制。
最低0.47元/天 解锁文章
3233

被折叠的 条评论
为什么被折叠?



