cache写回法 verilog实现_Cache & Related Part2

本文介绍了cache的基础知识,包括直接映射、全关联和组关联三种缓存映射方式,以及write-back和write-through策略。讨论了多级缓存的层次结构和性能优化,如L1、L2、L3缓存的设计选择,并提到了预取技术对性能提升的作用。此外,还探讨了缓存友好的代码编写原则。
摘要由CSDN通过智能技术生成

因为眼镜坏了,这篇文章写起来花了不少功夫,里面还有些错字,请见谅= =

我们上一个 part 聊过了 direct-mapped cache,这一节我们重复一些 cache 的 basics,然后聊 cache 相关的优化。

Recall

我们之前介绍过了 direct-mapped cache,之所以叫这个名字,是因为:

This cache structure is called direct mapped, since each memory location is mapped directly to exactly one location in the cache.

我们上一节中,一个地址可以被分成:

  1. tag
  2. index
  3. offset

而 cache 本身的存储不只是存放地址,它需要存放的是:

  1. Invalid bit
  2. tag
  3. block data

我查了一下,这里 block 的概念比较接近 cacheline 的概念. 我的电脑 lscpu 下试试:

我的台式,使用 lscpu

架构:                           x86_64
CPU 运行模式:                   32-bit, 64-bit
字节序:                         Little Endian
Address sizes:                   43 bits physical, 48 bits virtual
CPU:                             16
在线 CPU 列表:                  0-15
每个核的线程数:                 2
每个座的核数:                   8
座:                             1
NUMA 节点:                      1
厂商 ID:                        AuthenticAMD
CPU 系列:                       23
型号:                           113
型号名称:                       AMD Ryzen 7 3800X 8-Core Processor
步进:                           0
Frequency boost:                 enabled
CPU MHz:                        1961.707
CPU 最大 MHz:                   3900.0000
CPU 最小 MHz:                   2200.0000
BogoMIPS:                       7802.74
虚拟化:                         AMD-V
L1d 缓存:                       256 KiB
L1i 缓存:                       256 KiB
L2 缓存:                        4 MiB
L3 缓存:                        32 MiB
NUMA 节点0 CPU:                 0-15</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的回策略的CacheVerilog实现: ```verilog module cache( input clk, input rst, input [31:0] addr, input [31:0] data_in, input write_en, output reg [31:0] data_out ); parameter CACHE_SIZE = 1024; // Cache大小 parameter BLOCK_SIZE = 32; // 块大小 parameter TAG_WIDTH = 16; // 标记位宽度 parameter INDEX_WIDTH = 6; // 索引位宽度 parameter OFFSET_WIDTH = 5; // 偏移量位宽度 reg [CACHE_SIZE/BLOCK_SIZE-1:0] valid; // 有效位数组 reg [CACHE_SIZE/BLOCK_SIZE-1:0] tag; // 标记位数组 reg [CACHE_SIZE/BLOCK_SIZE-1:0] data [BLOCK_SIZE/4-1:0][CACHE_SIZE/BLOCK_SIZE-1:0]; // 数据组织方式为组相联,每个块4个字 reg [INDEX_WIDTH-1:0] index; // 索引变量 reg [OFFSET_WIDTH-1:0] offset; // 偏移量变量 wire [31:0] block_addr; // 块地址变量 wire [31:0] tag_addr; // 标记地址变量 assign index = addr[INDEX_WIDTH+OFFSET_WIDTH-1:OFFSET_WIDTH]; assign offset = addr[OFFSET_WIDTH-1:0]; assign block_addr = {addr[31:OFFSET_WIDTH],{OFFSET_WIDTH{1'b0}}}; assign tag_addr = {addr[31:TAG_WIDTH],{TAG_WIDTH{1'b0}}}; always @(posedge clk or negedge rst) begin if(!rst) begin valid <= 0; tag <= 0; data <= 0; data_out <= 0; end else if(write_en) begin // 操作 if(valid[index] &amp;&amp; tag[index] == tag_addr) begin // 命中 data[offset/4][index] <= data_in; end else begin // 不命中 if(valid[index]) begin // 踢出数据 // 如果是回策略,则将块回到主存 if(tag[index] != tag_addr) begin // 回操作 // 这里假设有一个主存模块,对于回请求,将数据回到主存 memory_write(tag[index]*BLOCK_SIZE, data[0][index]); end end // 读取新数据 data_out <= memory_read(block_addr); // 更新Cache valid[index] <= 1'b1; tag[index] <= tag_addr; data[0][index] <= data_out; end end else begin // 读操作 if(valid[index] &amp;&amp; tag[index] == tag_addr) begin // 命中 data_out <= data[offset/4][index]; end else begin // 不命中 if(valid[index]) begin // 踢出数据 // 如果是回策略,则将块回到主存 if(tag[index] != tag_addr) begin // 回操作 // 这里假设有一个主存模块,对于回请求,将数据回到主存 memory_write(tag[index]*BLOCK_SIZE, data[0][index]); end end // 读取新数据 data_out <= memory_read(block_addr); // 更新Cache valid[index] <= 1'b1; tag[index] <= tag_addr; data[0][index] <= data_out; end end end endmodule ``` 这个Cache采用组相联的方式进行数据存储,每个块有4个字,总共有1024个块,所以Cache大小为32KB。标记位16位,索引位6位,偏移量位5位。 在操作时,如果命中,则将数据Cache;如果不命中,则根据回策略将块回到主存,并读取新的块数据更新Cache。 在读操作时,如果命中,则从Cache中读取数据;如果不命中,则根据回策略将块回到主存,并读取新的块数据更新Cache

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值