地址翻译缓存:命中/未命中与替换策略
SV39三级页表翻译需要3次内存访问,加上最终的数据访问共4次。TLB缓存最近的翻译结果,消除重复查找:
| 参数 | 典型值 | 说明 |
|---|---|---|
| TLB项数 | 32-128 | 更多项=更高命中率 |
| 页面大小 | 4KB | 标准页, 可用大页(2MB/1GB) |
| 命中率 | >99% | 程序局部性保证 |
| 缺失代价 | 3次访存+1次数据 | SV39三级页表 |
| 替换策略 | LRU/NRU | 决定淘汰哪个项 |
// Lesson 10: TLB — Translation Lookaside Buffer (4-entry, LRU)
module tlb(
input wire clk, rst_n,
input wire lookup_req,
input wire [38:0] vaddr,
output reg [55:0] paddr,
output reg hit, valid,
input wire fill_req,
input wire [38:0] fill_vaddr,
input wire [55:0] fill_paddr,
input wire [1:0] fill_perm,
input wire fill_valid
);
parameter ENTRIES = 4;
reg [38:0] tag [0:ENTRIES-1]; reg [43:0] ppn [0:ENTRIES-1];
reg [1:0] perm [0:ENTRIES-1]; reg entry_valid [0:ENTRIES-1];
reg [1:0] lru_cnt [0:ENTRIES-1];
integer i;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for(i=0;i<ENTRIES;i=i+1) begin entry_valid[i]<=0; lru_cnt[i]<=0; end
end else begin
if (fill_req) begin : find_lru
reg [1:0] rep_idx; rep_idx=0;
for(i=1;i<ENTRIES;i=i+1)
if(lru_cnt[i]<lru_cnt[rep_idx]) rep_idx=i[1:0];
tag[rep_idx]<=fill_vaddr; ppn[rep_idx]<=fill_paddr[55:12];
perm[rep_idx]<=fill_perm; entry_valid[rep_idx]<=fill_valid;
lru_cnt[rep_idx]<=3;
end
for(i=0;i<ENTRIES;i=i+1)
if(lru_cnt[i]>0) lru_cnt[i]<=lru_cnt[i]-1;
end
end
always @(*) begin
hit=0; paddr=0; valid=0;
for(i=0;i<ENTRIES;i=i+1)
if(entry_valid[i] && tag[i]===vaddr)
begin hit=1; paddr={ppn[i],vaddr[11:0]}; valid=1; end
end
endmodule
TLB位于CPU和Cache之间,是地址翻译的第一站:
当操作系统修改页表(如换页、修改权限)时,必须保证TLB与页表一致:
| 资料 | 内容 | 链接 |
|---|---|---|
| RISC-V特权规范 | CSR、Trap、中断完整定义 | riscv.org/specifications |
| RISC-V手册 | 中文版免费教材 | crva.ict.ac.cn |
| OpenSBI源码 | M-mode固件参考实现 | github.com/riscv/opensbi |
| Linux RISC-V | 内核移植与驱动 | kernel.org |
| BOOM处理器 | UC Berkeley开源OoO核心 | github.com/riscv-boom/riscv-boom |
| 香山处理器 | 中科院开源高性能核心 | github.com/OpenXiangShan |
| 课程范围 | 课程号 | 主题 |
|---|---|---|
| 特权架构 | 01-06 | 特权级→CSR→ecall→mret→trap→中断 |
| 内存系统 | 07-12 | PLIC→CLINT→SV39→TLB→直接映射→组相联 |
| 算术单元 | 13-14 | Booth乘法器→恢复余数除法 |
| 乱序执行 | 15-19 | OoO→ROB→寄存器重命名→记分牌→Tomasulo |
| 分支预测 | 20-21 | 2位预测器→BTB |
| RISC-V扩展 | 22-26 | RVC→RVM→RVA→RVF→RVD |
| 系统集成 | 27-30 | PMP→解码器→SoC→启动流程 |
建议使用以下环境进行实验:
TLB性能可以通过以下方式测量和优化:
TLB的硬件实现有多种选择,影响面积、功耗和速度:
| 实现方式 | 查找方式 | 面积 | 功耗 | 速度 |
|---|---|---|---|---|
| 全相联CAM | 并行比较所有项 | 大 | 高 | 最快(1周期) |
| 组相联SRAM | Index索引+Tag比较 | 小 | 低 | 快(1-2周期) |
| 软件TLB | 软件遍历页表 | 最小 | 最低 | 慢(10+周期) |
现代处理器通常L1 TLB使用全相联CAM(32-64项),L2 STLB使用组相联SRAM(512-2048项)。CAM的功耗与项数成正比,所以L1 TLB不能太大。