Rocket - util - Replacement
Posted wjcdx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
??
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
??
直接看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. 附录
略
以上是关于Rocket - util - Replacement的主要内容,如果未能解决你的问题,请参考以下文章
Rocket - util - ECC
Rocket - util - AsyncQueue
Rocket - util - PrefixSum
Rocket - util - MaskGen
Rocket - util - ReduceOthers
Rocket - util - Timer