Bitmap Checker
Categories:
Bitmap Checker硬件模块
Bitmap checker简介
Bitmap checker 的作用是将来自外部(ptw/lptw/hptw)的请求发送至cache,并根据是否命中进行内存访问查权限。最后将cache返回的或者内存访问得到的权限发送回请求源。
此外,bitmap(walker)支持non blocking 特性,每一个请求来源都有FSM负责录入请求进行处理。但是一次只能有一个fsm进行cache访问。
状态机描述
为了保持non blocking,有8个独立的状态机(entries)并行运行。每个 entry 维护独立的状态和数据处理。当有请求进入时,从下到上依次将fsm填满,由于总共就8个请求来源,因此不会出现无空闲fsm可用的情况。
当entry的PA重复时,仅有一个fsm会进行一次查cache 或者访问memory,其余重复fsm项的状态会被部分跳过。重复表示PA的tag位[47:18] 一致。
PA | |||
---|---|---|---|
段 | tag | Bitmap offset | Page offset |
位 | [47:18] | [17:12] | [11:0] |
Bitmap checker 模块状态机
状态机状态
状态 | 说明 |
---|---|
state_idle | 标明该fsm状态为空,可以录入新请求 当io.req.fire时,切换到新状态 转换条件:
|
state_addr_check | 进行pmp检查 转换条件:
|
state_cache_req | 将cachereq拉高,fire后→ state_cache_resp |
state_cache_resp | Cache resp fire后更新:
|
state_mem_req | 拉高valid 并等待,mem req fire时,将所有重复项目的id跟新为本fsm id,并将所有重复和本机 state 设置为mem wait |
state_mem_waiting | Fire时→state_mem_out,并将所有的符合id项目内值全部跟新为mem返回值 |
state_mem_out | 拉高 resp valid ,fire时→ state_idle |
接口信号
信号 | 位宽 | 描述 |
---|---|---|
Io.mem | 内存访问相关信号 | |
io.mem.resp.bits.id | 4 | memory 响应返回的 ID(需为bitmap编号) |
io.mem.resp.bits.value | 512 | memory 返回的 bitmap 数据块 |
io.mem.req_mask | 20 | Memory 请求屏蔽位 |
io.mem.req.bits.addr | 56 | memory 请求的 bitmap 数据地址 |
io.mem.req.bits.id | 4 | memory 请求的编号(恒定为bitmap编号) |
io.mem.req.bits.hptw_bypassed | 1 | (和bitmap 模块内部无关) |
Io.Req | 请求信号 | |
io.req.bits.bmppn | 27 | 被检查的物理页号 PPN |
io.req.bits.id | 4 | 请求编号,用于标识请求来源(和bitmap 模块内部无关) |
io.req.bits.vpn | 27 | 对应虚拟页号VPN,用于唤醒pagecache(和bitmap 模块内部无关) |
io.req.bits.level | 2 | 所查询页表的级别信息(0/1/2),用于唤醒pagecache(和bitmap 模块内部无关) |
io.req.bits.way_info | 8 | TLB way 编号用于唤醒pagecache(和bitmap 模块内部无关) |
io.req.bits.hptw_bypassed | 1 | 用于唤醒pagecache(和bitmap 模块内部无关) |
Io.resp | 返回结果 | |
io.resp.bits.cf | 1 | 检查权限是否允许访问 |
io.resp.bits.cfs | 8 | 相邻8个(3bit地址空间)的权限 |
io.resp.bits.id | 4 | 响应对应的请求id(和bitmap 模块内部无关) |
Io.pmp | Pmp查 | |
io.pmp.req.bits.addr | 56 | 进行PMP检查的物理地址 |
io.pmp.req.bits.cmd | 2 | 读/写权限请求类型(恒定为读) |
io.pmp.req.bits.size | 3 | 请求访问大小(恒定) |
io.pmp.resp.ld | 1 | PMP Load 权限检查结果 |
io.pmp.resp.mmio | 1 | PMP MMIO 检查结果 |
Io.wakeup | Resp时且非hptw bypassed 进行重填pagecache | |
io.wakeup.bits.setIndex | 4 | 唤醒用的setIndex(和bitmap 模块内部无关) |
io.wakeup.bits.tag | 4 | 唤醒tag(VPN高位)(和bitmap 模块内部无关) |
io.wakeup.bits.isSp | 1 | 是否为superpage(和bitmap 模块内部无关) |
io.wakeup.bits.way_info | 8 | TLB对应的way 信息(和bitmap 模块内部无关) |
io.wakeup.bits.pte_index | 6 | PTE 在段页表中的索引位置(和bitmap 模块内部无关) |
io.wakeup.bits.check_success | 1 | 是否 bitmap 检查通过 |
Refill | ||
io.refill.bits.data | 64 | 要写入cache 的bitmap 数据 |
CSR | ||
io_sfence_valid | 1 | SFENCE 操作有效信号(为高刷新fsm) |
io_csr_satp_changed | 1 | SATP 寄存器变更标志(为高刷新fsm) |
io_csr_vsatp_changed | 1 | VSATP 寄存器变更标志(为高刷新fsm) |
io_csr_hgatp_changed | 1 | HGATP 寄存器变更标志(为高刷新fsm) |
io_csr_mbmc_BMA | 58 | Bitmap 基址寄存器值 |