TLB
Polaris 后端的 DTLB 部件基于 NutShell 的 TLB 逻辑进行优化。主要优化了内部流水级结构及访存异常和 MMIO 访存检测的信号通路,其结构如下图所示:
Polaris 后端的 DTLB 被设计为两级流水,第一级为虚实地址转换逻辑,虚 拟地址会在 64 项 TLB 页表中查询物理地址,如果命中则 req 请求会被送往第二 级流水,第二级流水为空流水,用于减小时序压力,只负责与外部进行请求握手 (DCache 或 Mem)。
若虚拟地址在第一级流水中查找 TLB 表项失败,则第一级流水会将处理信 息传入 TLB 出错处理单元,该单元是一个多周期的访存单元,其会按照 sv39 的 三级页表逻辑,通过传入的虚拟地址逐级翻译,对内存发出访存请求,得到最终 的物理地址,然后将其传回第一级 TLB 流水,向第二级发出访存握手信号,并 将该映射关系通过随机替换的方式写入 TLB 表。如果在访问的过程中出错:例 如 TLB 表项有效位错误、权限错误、脏位标记错误等异常情况,则会将异常信 息传回第一级流水,由第一级流水向 LSU 返回异常信息。
TLB 的两级流水仅在虚拟内存开启时启用,在直接使用物理地址访存时, TLB 模块将关闭两级流水的数据通路,开启直连数据通路,将 LSU 的 req 和 resp 请求端口直接与外部访存端口相连,以减少非连续访存时访存指令的访存延迟 (非连续请求访存时可减少一级流水所带来的延迟)。