RISC-V L1缓存设计:写命中处理的组合与时序逻辑问询
自定义RISC-V L1缓存控制器设计问题
设计规格
- 架构:直接映射
- 块大小:每行4字(128位)
- 策略:写回、写分配
- 内存接口:同步主存,
mem_ready信号指示当前周期及下一周期数据有效/已接收 - 设计目标:缓存命中(读、写)实现0等待状态,标签匹配时无需暂停CPU,在下一时钟沿完成写操作
现有方案
采用Mealy型有限状态机(FSM),基于当前状态和输入标志(命中/未命中)组合生成控制信号(如en_wr_cache),简化代码片段如下:
always_comb begin // Defaults to prevent latches stall_cpu = 1'b0; en_wr_mem = 1'b0; en_rd_mem = 1'b0; en_wr_cache = 1'b0; // wdata_cache logic? (See Question 2) case (state) IDLE_HIT: begin if (!hit) begin // MISS HANDLING stall_cpu = 1'b1; if (d0) begin // Line is dirty -> Writeback en_wr_mem = 1'b1; end else begin // Clean -> Read Allocate en_rd_mem = 1'b1; end end else begin // HIT HANDLING (Immediate) if (wr_cache) begin en_wr_cache = 1'b1; // logic to assign wdata_cache = data_cpu here? end end end WRITE_MEM: begin en_wr_mem = 1'b1; if (mem_ready) begin en_rd_mem = 1'b1; // Start reading new line immediately en_wr_mem = 1'b0; end end READ_MEM: begin en_rd_mem = 1'b1; if (mem_ready) begin en_rd_mem = 1'b0; en_wr_cache = 1'b1; // Write allocated line to cache end end endcase end
技术问题
- 为实现0等待状态命中,采用组合逻辑(Mealy FSM)生成
en_wr_cache是否属于不良设计?常见设计会用寄存器输出拆分关键路径,但这会导致流水线暂停或需引入存储缓冲。 - 如何处理数据总线以将CPU数据写入缓存行的正确偏移?我希望实现类似
wdata_cache[block_offset] = data_cpu的操作:若放在always_comb块中,未覆盖所有情况会有锁存器风险;若放在always_ff块中,数据会晚一个周期到达,无法配合即时写使能信号。驱动Cache RAM特定数据负载的标准设计模式是什么?
问题1解答
用组合逻辑生成en_wr_cache实现0等待命中并非不良设计,但需要权衡关键路径延迟:
- 核心优势:完全贴合0等待的设计目标,命中时无需额外存储缓冲或流水线暂停,硬件开销更低。
- 潜在风险:组合逻辑会串联
state、hit、wr_cache等信号的延迟,高频设计中可能触发时序违例。 - 折中方案:若时序压力较大,可对非命中路径的控制信号用寄存器打拍拆分路径,但命中路径必须保留组合逻辑输出以保证即时响应。事实上,多数高性能处理器的L1缓存命中路径都采用纯组合逻辑,就是为了实现零等待。
问题2解答
驱动Cache RAM特定偏移的标准做法是用组合逻辑构建带掩码的写数据总线,配合单周期写使能,具体实现方式如下:
- 写数据与掩码的组合逻辑构建
在always_comb块中,先将wdata_cache默认赋值为当前缓存行的读出数据(rdata_cache),再根据block_offset选择对应字位置,用CPU数据覆盖;同时生成写掩码,仅使能目标偏移的存储单元写入。示例代码:always_comb begin wdata_cache = rdata_cache; // 默认保留缓存行原有数据 cache_wr_mask = 4'b0000; // 默认无写入掩码 if (en_wr_cache) begin case (block_offset) 2'b00: begin wdata_cache[31:0] = data_cpu; cache_wr_mask = 4'b0001; end 2'b01: begin wdata_cache[63:32] = data_cpu; cache_wr_mask = 4'b0010; end 2'b10: begin wdata_cache[95:64] = data_cpu; cache_wr_mask = 4'b0100; end 2'b11: begin wdata_cache[127:96] = data_cpu; cache_wr_mask = 4'b1000; end endcase end end - 锁存器规避要点
必须给wdata_cache和cache_wr_mask设置全局默认值,确保所有分支路径都被覆盖,不会生成不必要的锁存器。这种方式下,wdata_cache始终为组合逻辑输出,能与en_wr_cache同步,保证下一时钟沿完成缓存写入。 - Cache RAM的配合要求
需确保Cache RAM支持带掩码的单周期写入——多数同步SRAM都支持按字/字节的写掩码,仅更新目标偏移的字,其余字保持不变,完美匹配写命中时的即时更新需求。
内容的提问来源于stack exchange,提问作者Ilan Mermelstein
相关产品推荐
相关产品推荐

