https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA
简单介绍RegisterRouter的实现。
1. 基本介绍
实现挂在TileLink总线上的寄存器节点。
2. TLRegisterNode
实现diplomacy概念下的寄存器节点,是一个下游节点,即末端节点:
1) 参数
a. address:支持的地址集合;
b. device:寄存器所属设备;
c. deviceKey:设备键值:控制寄存器;
d. concurrency:支持的并发访问数目;
e. beatBytes:数据总线宽度;
f. undefZero:略(不明其意);
g. executable:是否可执行;
2) 继承SinkNode
TLRegisterNode是一个末端节点:
其中:
a. supportsXXX:支持的TransferSize的能力是在[1, beatBytes];
b. 只支持Get/Put请求,其他请求不支持;
c. fifoId:按照顺序处理对寄存器的请求;
d. minLatency:需要至少一个时钟周期才能返回响应消息;
3) 限制条件
a. size:寄存器节点支持的地址集合的大小,放大到最近的2的幂;
b. size大于beatBytes;
c. 所有的地址都应该落在这个size范围内;
4) genRegDescsJson
生成JSON格式的寄存器描述:
a. 把mapping序列化,并写入到*.regmap.json注释文件中;
b. 同时进行注释并加入到Builder.annotations中;
5) regmap
把TLRegisterNode的输入边过来的请求转换为针对mapping的访问请求,然后做出响应:
a. 末端下游节点只有输入边
b. 生成寄存器映射的参数
其中:把source参数编入extra中。
c. 生成寄存器映射的输入接口,并与channel a相连:
d. 使用RegMapper生成寻址访问逻辑,并生成一个输出接口:
e. 根据寻址访问逻辑的输入输出接口状态,决定channel a/d的valid/ready:
f. 生成响应消息:
g. channel b/c/e不使用:
h. 生成注释信息:
3. TLRegisterRouterBase
RegisterRouter的基类:
a. extraResources:用于生成一个Resource映射;
b. device:创建一个设备;
c. node:has-a TLRegisterNode;
d. intnode:has-a IntSourceNode,可以作为一个中断源;
e. 没有实现lazy val module,保持抽象;
这里也体现了使用LazyModule包含(has-a)diplomacy node,而不把LazyModule定义为diplomacy node子类(is-a)的好处。那就是除了有一个(has-a)diplomacy node,还可以有多个(has-many)diplomacy node。而继承的话,只能是一个(is-a)而不能是多个diplomacy node。
4. TLRegBundleArg
参数类:
5. TLRegBundleBase
Bundle的基类,包含一个TLRegBundleArg:
6. TLRegBundle
新增一个参数类P:
7. TLRegModule
一个LazyModuleImp的子类,lazy val module的类型:
8. TLRegisterRouter
一个LazyModule的实现:
其中:
a. lazy val module使用moduleBuilder生成;
b. moduleBuilder包含两个参数:第一个参数生成一个TLRegBundleBase实例,第二个参数是一个TLRegisterRouterBase实例;
c. bundleBuilder使用TLRegBundleArg生成一个TLRegBundleBase实例;
9. HasTLControlRegMap
定义一个RegisterRouter子类混入(mix-in)的特征(trait):
a. controlNode:为子类添加一个控制寄存器节点;
b. controlXing:把controlNode连接到一个bus,因为TLRegisterNode是下游末端节点,所以这里使用crossIn,把controlNode作为下游节点;
c. regmap:把controlNode的channel a/d连接到根据mapping生成的寻址访问逻辑上;