Rocket - util - Replacement

https://mp.weixin.qq.com/s/zCP7wPuxgQ-r94Tr6BV5iw

简单介绍Replacement的实现。

??

1. 基本介绍

用于实现Cache替换相关的功能。

??

From: Cache Replacement Policies, Prof. Mikko H. Lipasti, University of Wisconsin-Madison, ECE/CS 752 Spring 2016

2. ReplacementPolicy

代表替换策略的抽象类。

??

包含如下方法:

a. way: 返回要替换的cache行号;

b. miss:未命中时执行的方法;

c. hit:命中时执行的方法;

3. RandomReplacement

??

随机替换策略,实现ReplacementPolicy:

a. way: 来自于LFSR生成的随机值;

b. miss:未命中则需要替换:replace := Bool(true);

c. hit:命中时不执行任何动作;

ways表示Cache的行数,Random(ways, lfsr)把lfsr随机到[0, ways-1]的范围内。

4. SeqReplacementPolicy

包含多组Cache的替换策略。

??

a. access: 访问某一个组(set)的方法;

b. update: 根据valid和是否命中(hit),更新Cache组set中的第way个行;

c. way:要替换的行;

5. SeqRandom

基于组的随机替换策略。

??

a. logic: 实例化一个RandomReplacement对象;

b. access:访问组set:没有动作;

c. update:如果输入合法,并且没有命中,则执行logic.miss方法;

d. way:返回要替换的行;

6. PseudoLRU

实现一个简单的LRU(Least Recently Used,最近最少使用)策略:

??

1) n

n表示cache的行数;

??

2) state_reg

表示cache的状态;

表示cache所有行的状态;

LRU要记录的状态信息是最近的使用情况。

也就是说,一个n-1位的state_reg要记录n行cache最近的使用情况。

类似于下图:

??

state_reg每一个比特值表示是否在最近被访问。

3) access(way)

访问第way个cache行。

要执行的动作是更新state_reg中第way个cache行的使用信息;

4) replace = get_replace_way

获取要被替换的cache行,即最近最少使用的行。

5) get_next_state

参考链接:https://docs.qq.com/sheet/DUVdGZmViRlB1a1dI

??

a. state:记录LRU最近访问信息的state变量;

b. way:此次被访问的cache行;

c. 2^width(way)表示way可以表示的cache行数;理想情况下,width(way)=log2Up(n);

d. way(i)从way中取出第i个比特;

e. i从log2Up(n)-1到0,表示从way的高位到低位逐个取出每一位;

f. !bit需要与get_replace_way结合起来一起理解:把访问的way的第i比特取反写入next_state,那么这个比特可以作为要替换的行的行号中的相应比特使用;

g. idx:逐个把way中的比特合并到idx中;

通过一个实例来看一下这个过程:

a. 假设条件

??

其中:n = 8;i逐个去2, 1, 0;相应的bit为w2, w1, w0;

b. var next_state = (state << 1).asInstanceOf[UInt]

??

c. i = 2

??

d. i = 1

??

e. i = 0

??

f. 把w2, w1的值带入

??

g. 考虑w0的两个取值

??

可以看到:

根据w2的取值,把next_state的取值分成两个1/2部分;

根据w1的取值,又把每个1/2部分分成两个1/4部分;

根据w0的取值,又把每个1/4部分分成两个1/8的部分;

他们的意义在查找替换cache行时再讲。

6) get_replace_way

参考链接:https://docs.qq.com/sheet/DUVdGZmViRlB1a1dI

??

直接看5)中实例的情况。

a. 假设条件

??

b. in_bounds

用于判断idx是否在[0, n)范围内;

c. shifted_state

移位的作用在于方便各个变量的位对应。

??

d. i = 2

??

e. i = 1

??

f. i = 0

??

g. 考虑ss4, ss5, ss6, ss7的两种取值

??

可以看到这个值与get_replace_way中相反。

7) 实例的总结

当刚刚访问了way 0后,next_state(1) = 1,对应着get_replace_way中的shifted_state(1) = 1,如此返回的idx(2) = 1。

也就是说:

如果刚刚访问了way 0,那么当查找可以替换的cache行时,从第4/5/6/7中找。

进而:

如果在4/5/6/7中最近访问的是4,那么当查找可替换的cache行时,从第6/7行中找。

如果在6/7中最近访问的是6,那么当查找可替换的cache行时,idx = 7 = 0b111,即就会选择第7行。

7. SeqPLRU

实现一个包含多组cache的替换策略:

??

a. 每组一个记录LRU最近访问信息的state寄存器

??

b. 替换策略是PseudoLRU

??

c. access: 访问某一个组时,读取该组的LRU状态信息

??

d. update:更新cache状态

??

update_way:如果命中,则使用命中的行号;如果未命中,则需要替换一个cache行(行号为plru_way)。

更新LRU信息,并写入;

e. way:返回要替换的cache行号

??

8. 附录

原文地址:https://www.cnblogs.com/wjcdx/p/10992221.html

时间: 2024-11-08 03:58:46

Rocket - util - Replacement的相关文章

Rocket - util - AsyncQueue

https://mp.weixin.qq.com/s/6McbqOKM4fu4J5vdpZvxKw 简单介绍异步队列(AsyncQueue)的实现. ?? 0. 异步队列 异步队列的两端分属不同的时钟域,拥有各自的复位逻辑. 异步队列用于存值的一端为上游端(source),用于取值的一端为下游端(sink). 1. AsyncQueueParams ?? 异步队列的参数,包含如下几项: a. depth 队列深度,表示队列可以存储几个元素: b. sync 表示流水线的级数. c. safe 使

Rocket - util - ECC

https://mp.weixin.qq.com/s/yato1PrnHe517J8twgZFOg 介绍ECC(Error Correcting Code/Error Checking and Correcting)的实现框架.不涉及编码的具体实现细节. ?? 1. 码:Code ?? 所有编码(如奇偶校验码.海明码)的抽象父类. 包含如下几个方面: a. 能否检错:canDetect: b. 能否纠错:canCorrect: c. width():输入为数据的宽度,输出为编码后码文的宽度,一般

Rocket - util - MaskGen

https://mp.weixin.qq.com/s/_aJqf1cFJDK5RVRBhxTWOw 介绍MaskGen的实现. ?? 1. 基本介绍 给定总线宽度beatBytes,根据访问的地址(address)和访问的字节数(bytes = 2^lgSize),生成访问字节的掩码. 2. 实现 思路不复杂,写法很难懂.重构一下,提高可读性. 1) 首先忽略groupBy,清爽很多: ?? 2) 把addr_lo重命名为address,把lgSize重命名为size,这样可以很明显的看出来ad

Rocket - util - MultiWidthFifo

https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A 简单介绍MultiWidthFifo的实现. ?? 1. 基本介绍 实现一个输入宽度为inW,输出宽度为outW,可存n个outW宽度元素的FIFO. a. 如果inW == outW,直接使用队列(Queue)实现: b. 如果inW > outW,则相当于每次输入多个元素,而输出只能有一个元素: c. 如果inW < outW,则相当于每次输出多个元素,而输入只能有一个元素: 需要注意的是,

Rocket - util - Repeater

https://mp.weixin.qq.com/s/xyEq3DgYuf2QuNjssv8pkA 简单介绍Repeater的实现. ?? 1. 基本功能 A Repeater passes it's input to it's output, unless repeat is asserted. When repeat is asserted, the Repeater copies the input and repeats it next cycle. 2. 实现 1) io ?? a.

Rocket - util - PrefixSum

https://mp.weixin.qq.com/s/G2vLP-ncoJzSOgxGGEJkfA 简单介绍PrefixSum的实现. ?? 1. 基本介绍 ?? 把一个序列从前向后逐个执行迭代(assocOp),每针对一个元素执行一遍迭代,针对一整行执行一次迭代(layerOp). 2. PrefixSum ?? a. layers:抽象方法,返回层数,等于layerOp执行的次数: b. idLayer: 默认的layerOp,即没有动作,把输入原样返回: 3. RipplePrefixSu

Rocket - util - ReduceOthers

https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA 简单介绍ReduceOthers的实现. ?? 1. 基本介绍 输入一组Bool元素,把其他位置元素逐个相与的结果,作为当前位置的值输出. 2. helper helper实现ReduceOthers的核心功能: ?? 1) 输入参数 x是输入的一组Bool类型的元素. 2) 返回值 返回一个元组:(Seq[Bool], Bool) a. Seq[Bool]:每个位置上返回其他位置上元素逐个相与的

Rocket - util - Timer

https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A 简单介绍Timer的实现. ?? 1. 基本功能 实现定时器的功能. 2. Timer 实现一个静态装入的定时器: ?? 1) initCount 定时器的初始值,静态配置,不可动态改变. 2) maxInfligh 定时器事件的种类. 3) io ?? a. start:某个定时器事件需要启动定时器,io.start.bits为这个定时器事件的ID: b. stop:某个定时器事件需要停止定时器

java.util.regex.PatternSyntaxException: Dangling meta character &#39;*&#39; near index 0

使用repalceAll 方法出现java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0异常 代码如下: 1 @Test 2 public void testReplaceAll(){ 3 String sql = "select * from per_handle where id not in('3ce7405509414105a65e7456987e7393')"; 4 St