You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

技术问题

  1. 为实现0等待状态命中,采用组合逻辑(Mealy FSM)生成en_wr_cache是否属于不良设计?常见设计会用寄存器输出拆分关键路径,但这会导致流水线暂停或需引入存储缓冲。
  2. 如何处理数据总线以将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特定偏移的标准做法是用组合逻辑构建带掩码的写数据总线,配合单周期写使能,具体实现方式如下:

  1. 写数据与掩码的组合逻辑构建
    在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
    
  2. 锁存器规避要点
    必须给wdata_cache和cache_wr_mask设置全局默认值,确保所有分支路径都被覆盖,不会生成不必要的锁存器。这种方式下,wdata_cache始终为组合逻辑输出,能与en_wr_cache同步,保证下一时钟沿完成缓存写入。
  3. Cache RAM的配合要求
    需确保Cache RAM支持带掩码的单周期写入——多数同步SRAM都支持按字/字节的写掩码,仅更新目标偏移的字,其余字保持不变,完美匹配写命中时的即时更新需求。

内容的提问来源于stack exchange,提问作者Ilan Mermelstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 20:33:19