Rocket - regmapper - RegField

https://mp.weixin.qq.com/s/7WKB1QxcVzqm2Q7bWcKHzA

 

简单介绍RegField的实现。

 

 

1. 简单介绍

 

定义寄存器域相关的参数类型。

 

2. RegFieldAccessType

 

访问类型:读、写、读写:

 

3. RegFieldWrType

 

写操作类型:

写一清零,写一置位,写一反转,

写零清零,写零置位,写零反转,

清除,置位,修改

 

4. RegFieldRdAction

 

读操作的作用:清零,置位,修改:

 

5. RegFieldDesc

 

1) class

 

寄存器域描述,定义寄存器域的各种属性:

a. name:名称;

b. desc:描述;

c. group:所在组;

d. groupDesc:组描述;

e. access:访问类型,默认为读写类型;

f. wrType:写类型;

g. rdAction:读的动作;

h. volatile:寄存器的值是否会自动变换;

i. reset:复位值;

j. enumberations:推测为寄存器域各个值代表意义的描述:

 

2) object

 

创建一个reserved的寄存器域:

 

6. RegFieldGroup

 

使用name和desc描述regs中的寄存器:

 

7. RegReadFn

 

1) class

 

读寄存器的函数:

包含两个参数:

a. combinational:是否为组合逻辑;

b. fn:参数为输入信号,返回值为输出信号的用于生成读取逻辑的函数:

 

2) object

 

用于生成读取逻辑的辅助方法。

a. 直接传入逻辑生成函数作为参数:

 

b. 使用RegisterReadIO作为参数:

 

RegisterReadIO在RegisterCrossing中定义:

 

c. 只输入oready用于生成读取逻辑:

 

d. 使用ReadValidIO读取:

 

e. 直接使用一个UInt作为读取逻辑的输出:

 

f. 把Unit转换为RegReadFn的隐式类型转换方法:

 

8. RegWriteFn

 

与RegReadFn同理,用于生成写入逻辑的辅助方法。

 

9. RegField

 

用于描述一个寄存器域。

 

1) case class

 

定义了寄存器域的比特位宽度,读函数、写函数,描述信息:

a. pipelined

 

读写函数中是否有非组合逻辑:

 

b. readOnly:

 

生成一个只读版本的拷贝:

 

c. toJson:

 

把寄存器域的各个属性转换为JSON格式的对象,以便输出:

PS. 可以看到这里需要外部提供字节偏移量和位偏移量信息(因为RegField只有位宽度信息,寄存器域可以复用,具体放在哪个位置可以是变化的)。

 

2) object

 

辅助方法,用于创建各种类型的寄存器域:

其中:

a. ()表示空函数;

b. r:生成只读寄存器;

c. w:生成只写寄存器;

 

d. w1ToClear:生成一个协议清零的读写寄存器:

 

e. rwReg:为BlackBox寄存器生成读写逻辑:

 

f. bytes:生成一个以字节为单位进行读写的逻辑:

 

其中:

a) fullBytes为全部为有效位的字节;

b) partialBytes为部分位有效位的字节(是否应该为partialByte,因为要么1个字节,要么0个字节,不是复数);

c) padBytes:补到numBytes宽度所需要添加的字节数;

 

g. 为寄存器reg生成一个以字节为单位进行读写的逻辑:

 

10. HasRegMap

 

该特征为子类引入一个中断向量表,一个生成寄存器访问逻辑的方法:

 

posted @ 2019-09-18 23:26  wjcdx  阅读(532)  评论(0编辑  收藏  举报