gem5 可以模拟多种计算机体系结构,包括处理器、内存、缓存、互连网络等,以及它们之间的相互作用。以下是 gem5 主要模拟的内容:
- 处理器架构: gem5 可以模拟多种处理器架构,包括 x86、ARM、RISC-V 等。这些处理器可以是单核或多核的,gem5 支持不同的指令集和微架构特性。
- 内存层次结构: gem5 可以模拟处理器的缓存层次结构,包括 L1、L2、L3 缓存等。研究者可以使用 gem5 来评估不同的缓存策略、一致性协议和内存访问模式。
- 内存系统: gem5 支持对内存系统的建模,包括主内存、内存控制器和内存总线。这使得用户可以研究内存性能、带宽、延迟等方面的影响。
- 互连网络: 在多核系统中,gem5 允许对处理器之间的互连网络进行建模,以研究通信延迟、带宽以及网络拓扑结构的影响。
- 功耗和能耗: gem5 可以模拟处理器和系统的功耗和能耗,帮助研究者评估不同的能源管理策略和优化方法。
- 指令级仿真: gem5 支持指令级的仿真,可以用于执行特定的程序,以便分析程序的行为、性能和资源使用情况。
- 系统性能评估: gem5 提供了丰富的性能度量和统计信息,帮助研究者评估不同的硬件和软件配置对系统性能的影响。
- 架构设计,先实现具体的DMA controller类(考虑DMA controller关联的其他模块),之后实现python脚本的调用,
- 实现具体的指令
class AddrMapper : public SimObject
- class AddrMapperSenderState : public Packet::SenderState
- class MapperRequestPort : public RequestPort
- class MapperResponsePort : public ResponsePort
class StcSysDMA : public BasicPioDevice
- dma_desc_t
- StcSysDMAChannel
control bus
data bus
DMA建模
- DMA负责在LLB和DDR之间进行数据传输。
- 每个bank有两个DMA控制器,每个控制器有两个独立channel。
- DMA控制器通过noc网络访问DDR和LLB。
- LLB0和LLB1通过地址进行区分,原则上不建议单次DMA transfer中访问多个LLB。
LLB→DDR
DDR→LLB
DDR→DDR
LLB→LLB
- 一个controller有两个DMAchannel
- 每个channel结构如上图
- channel内有一个读port,一个写port
- 读取的数据放入缓冲FIFO中,FIFO大小为80*64byte, 写port从FIFO中读取数据写入目标内存
- 两个port如果访问内存地址为512bit对齐,则使能burst
gem5中的类
- class StcSysDMA:
- 定义DMA controller用到的全部寄存器。
- 定义DMA channel的结构struct StcSysDMAChannel,以及实现控制器内多个DMA channel。
- 实现read(); write()方法,实现了目标软件读写寄存器时对应的硬件响应。
- struct StcSysDMAChannel:
- 定义channel的读写port
- 定义channel的状态机
- 定义并实现读写FIFO的控制逻辑
- 实现start(); prepare(); copy(); finish();方法
- class FifoBuffer
- 实现了FIFO对读写数据的空间限制
- 将读写数据操作隔离,根据读写各自数据包大小发送请求
classDiagram
class StcSysDMA{
channel_<StcSysDMAChannel>[]
dma regs
}
class StcSysDMAChannel{
rport<MasterPort>
wport<MasterPort>
fifoBuffer
}
class MasterPort
class FifoBuffer
StcSysDMA --|> StcSysDMAChannel : channel
StcSysDMAChannel --|> MasterPort : rport / wport
StcSysDMAChannel --|> FifoBuffer : fifoBuffer read
sequenceDiagram
readAction->>Read_transmitList:push List
Read_transmitList->>fifoQueue:sendReadRequest
fifoQueue->>fillMark:recvReadResponse
fillMark->>fillMark:generateWriteRequest
fillMark->>Read_transmitList:pop List
write
sequenceDiagram
writeAction->>Write_transmitList:push List
Write_transmitList->>fillMark:check writeRequest
fillMark->>Write_transmitList:sendWriteRequest
Write_transmitList->>Write_transmitList:recvWriteResponse
Write_transmitList->>Write_transmitList:pop List
DMA从传输事务包含一系列的给定数目的数据传输序列。传输的数目可以通过软件编程,8位,16位或32位。
每一次DMA传输包含3个操作
- 通过 DMA_SxPAR 或 DMA_SxM0AR 寄存器寻址,从外设数据寄存器或存储器单元中加载数据。
- 通过 DMA_SxPAR 或 DMA_SxM0AR 寄存器寻址,将加载的数据存储到外设数据寄存器或存储器单元
- DMA_SxNDTR 计数器在数据存储结束后递减,该计数器中包含仍需执行的事务数
在产生事件后,外设会向 DMA 控制器发送请求信号。 DMA 控制器根据通道优先级处理该请求。只要 DMA 控制器访问外设, DMA 控制器就会向外设发送确认信号。外设获得 DMA 控制器的确认信号后,便会立即释放其请求。一旦外设使请求失效, DMA 控制器就会释放确认信号。如果有更多请求,外设可以启动下一个事务
背景
建模是一个手段,不是目的,用于
- 架构探索
- 性能优化
建模的两大派系
- systemc,需要自己打造组件库,运算较慢
- gem5,
建模分类
- 功能建模,简单、基础
- 硬件验证,需求>IC设计(IC设计就是一个建模的过程)
- 架构探索,核心竞争力之一,更具有持续性
- 性能建模
NPC:核内sram
LLB:多核共享sram
GDDR6
标量→向量→矩阵
custom vme
custom_bc mme
tcp mte