Rocket - tile - FPU
https://mp.weixin.qq.com/s/uy1U107isVojezdcyvhH9Q
简单介绍FPU相关的代码概要。目前主要处理较高层次上的模块关系,暂时不涉及具体模块逻辑的实现。
1. FPUParams/FPConstants
定义FPU相关的参数和常量:
暂时不涉及具体参数的含义。
2. HasFPUCtrlSigs
这是一个特征(trait),定义了解码FPU指令产生的相关信号:
3. FPUCtrlSigs
HasFPUCtrlSigs本身不可以实例化,FPUCtrlSigs作为类引入(mix-in)了HasFPUCtrlSigs,从而可以实例化,进而产生相关的解码信号:
4. FPUDecoder
FPUDecoder是FPU指令的解码器:
1) io
定义解码器的输入输出端口:
其中:
a. inst:输入的32位指令;
b. sigs:输出的解码信号;
c. 需要注意的是,这里并没有使用IO(...)包裹。也就是说,虽然名字为io,却并不会为之做模块IO相关的处理;
2) default
默认的解码信号值:
3) f
定义float相关的指令的解码信号值:
List中信号的顺序,与HasFPUCtrlSigs中定义的信号顺序一致。
4) d
定义double相关指令的解码信号值:
List中信号的顺序,与HasFPUCtrlSigs中定义的信号顺序一致。
5) insns
根据fLen是32位还是64位来确定是否支持double相关的指令:
6) decoder
decoder是解码出来的信号:
7) sigs
其中:
a. s是io.sigs的引用,就是写代码的时候简单一些,并不存在逻辑结构上的连接;
b. sigs是把s中的信号成员按顺序逐个取出组成列表;
c. 然后与decoder也就是解码出来的信号,按顺序逐个连接到一起;
d. 从而使得解码信号从io.sigs中输出;
5. FPUCoreIO
定义FPU与核心之间的接口:
6. FPUIO
定义FP请求和响应结果:
其中:
a. FPInput是请求输入:
b. FPResult是响应结果输出:
7. FType
定义浮点类型相关的参数及方法:
object FType中定义浮点类型相关的常量:
8. HasFPUParameters
定义FPU相关参数:
9. FPUModule
定义浮点模块的抽象父类,引入了浮点模块相关的参数,简化子类实现:
10. FPToInt/IntToFP/FPToFP
定义浮点转整型、整型转浮点、浮点转浮点功能模块:
11. MulAddRecFNPipe/FPUFMAPipe
定义两个流水线用于计算:
12. FPU
把多个模块组合到一起,实现FPU的功能: