抽象建模的方法
芯片设计各个层级的信息(Stage)
- 架构设计
- ISA设计
- Memory、Cache的存储系统设计
- 1D/2D,DMA,等关键性能相关Feature的规格和行为设计
- 微架构设计
- 指令通道的拆分和调度的方法和拆解
- UISA设计
- 规格的设计
- bank的数量
- 读写口的数量
- 各级buffer的深度和竞争
- 按照Arch的设计,完成了所有微架构设计,形成微架构的Design Spec
- 按照Spec定义完成coding的RTL
- 完成流水线的切分
- PPA优化后的RTL
硬件流水建模表达的方式
- 按照流水线的pipeline切分来建模(竖向切分)
- 每一级流水线是一个或这个多个module
- 一个module里面可能包含多个feature spec定义的功能
- 需要信息 stage4
- 和RTL实际的效果比较接近
- 按照一个功能的需求来拆分(横向切分)
- 一个module可能包含多级流水线
- 一级流水可能包含多个module
- 需要信息 stage2/stage3
- 按照微架构要求来设计
- 指令发射的带宽
- L1访问的带宽限制和Latency
- 按照规格的设计来建模
- bank的数量限制
- 读写口的数量限制
- 各级buffer的深度和竞争
- 和架构、微架构的理论设计比较接近
- 混合以上两种
通用的架构层级(功能模型)的建模抽象方法
- 把功能模型表达成唯一的一个大的循环体
- 等价于只有一级流水线的微架构,就是一个最简单的module
- 每次循环表示执行一次功能
- 模块的输入输出是latch抽象的数据结构
- 每次执行都需要从input get,执行功能后,set output
- 前后两次循环执行之间保证顺序
架构和微架构的统一建模设计
- ISA DSL
- ISA仿真的实现
- 每次循环执行一条指令
- 不同的指令执行不同的功能
- 前后两次之间完全独立,保序
- ISA的功能定义采用DSL定义和打包,便于仿真和RTL工程统一
- ISA足够稳定和简单,很容易被拆分成固定的几个operator:读写寄存器、读写存储器
- 对指令定义的方式进行封装成通用的接口
- 功能模型通过构建一个由operator组成的**“计算图”**进行表达微架构可以识别每个operator的执行条件,控制每个operator的执行时机
- DTE
- 定义DTE的OP作为功能的基本拆分
- 每次循环完成一个OP
- 前后两次之间完全独立,保顺
对微架构的资源进行抽象
- 从微架构的设计层面建模,而不是实现层面(RTL)
- 微架构的硬件资源的抽象
- 存储器的读写口、Bank、发射带宽、接收buffer深度
- Credit资源
- 定义operator的微架构行为
- 获取微架构资源
- 计算、处理、算法
- 持续通过1和2表达整个计算图
- 把微架构的竞争、资源进行抽象后,剩下的就是带宽(throughput)和延迟模型(latency)
在功能模型上使用微架构的资源
- 在定义功能模型的时候,可以通过使用已经定义的微架构资源Operator来表达功能模型
- 运行引擎会自动trace功能模型的Operator组成计算图给微架构进行建模
- 可以使用通用的TL(Throughput&Latency)模型来运行功能模型,从而对功能进行性能建模
class module(): # 表示一个复杂状态机
input # 输入的latch
output # 输出的latch
local logic # 本地的状态信息
def Pipeline(): # 流水线:状态机的转换逻辑,本质上是一个计算图
Delay(1)
input.get()
input.get()
MicroArch_Operator1()
MicroArch_Operator2()
output.set()
input.get()
MicroArch_Operator3()
output.set()
总结
- 芯片的设计建模可以拆分成3个层面的表达
- 架构、算法、指令的表达
- 硬件微架构的资源限制
- 硬件的固定规格和延迟
- 不用层面的表达可以被整合成一个
No Comments