zoukankan      html  css  js  c++  java
  • Rocket

    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. 附录
     
  • 相关阅读:
    低功耗蓝牙配对绑定解读和实践
    低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
    Nordic官方网络资源介绍(官网/devzone/GitHub)
    板子功耗高的原因有哪些
    同样的代码在官方开发板上运行正常,在自己板子上就跑不起来,怎么办
    如何理解nRF5芯片外设PPI
    nRF5芯片外设GPIO和GPIOTE介绍
    定时模块app_timer用法及常见问题—nRF5 SDK模块系列二
    Flash访问模块FDS用法及常见问题—nRF5 SDK模块系列一
    nRF5 SDK软件架构及softdevice工作原理
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10992221.html
Copyright © 2011-2022 走看看