Rocket-chip-RoCC(2)

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

关于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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值