DSP

第六节:CPU读缓存,写缓存在不同级别的存储器的规律

2019-07-13 14:46发布

本文涉及到的一些术语请参考DSP系列的其他小节。              C64+ DSP的缓存控制器分为 L1P Controler,L1D Controler,L2 Controler,External
Memory Controler(EMC)。L1P 控制器有具备一个寄存器接口,允许用户配置部分或者全部的L1P
RAM 作为一般的RAM 或者作为缓存,同样:L1D 控制器也具有一个寄存器接口,允许用户去配置部分L1D RAM 作为数
据RAM 或者作为缓存,可以配置缓存大小为0K,4K,8K,16K,32K。L2也是一样,因此在L1P,L1D,L2中都有两个区域, 一个是区域0,另一个是区域1.区域0一般作为存储器使用,区域1则作为缓存。知道了这一点,则有利于理解第四节中的存储器体系的关系。    L1P:L1P的特点是,Direct-Mapped Caches和 Read Allocate,即直接映射和读分配。cpu访问时间:1周期。 直接影射型意味着地址和cache之间有显式的对应关系,而读分配则意味着,只有read miss时才会从下一级存储器读取数据来更新缓存。 请看下图: 图1:L1P缓存结构图     图2:L1P 缓存控制器 因为C64+DSP的32位处理器,所以有了图2中的32位的缓存控制器。 图1和图2的对应关系是: tag ram------tag,表示一个地址的唯一标识。因为不会出现两个相同的18位tag line frames----set,表示缓存中的某一行。 data,32byte-----offset。表示真正存储数据的偏移位置。 V标志为是缓存结构中的标志信息。表示此缓存是否有效。 图中排(set)段(bits 13-5)标志着此地址会被映射到哪个set(在直接型
缓存中,set 等价于line frame),对于地址0020h,set 段为1.缓存控制器会接着
去检查tag 段18位(bits 31-14)和valid 位。这里我们假设 valid 位是0,控制器就
会注册为miss,也就是说,所请求的地址不在缓存中 大家可以计算一下,理论上,32位地址可以全部在缓存结构中得到映射。   下面讨论L1D: L1D的特点是:2-way set-associative,Read Allocate, Write-back,Passed through 4 × 64-bit write
buffer. Only stalls when full 意思是:L1D属于典型的两路组set 关联型的缓存,读分配缓存, 回写型缓存: a:write miss时通过4X64bits的write buffer通道批量向下一级存储器写数据 ,当这个write buffer满时,则stall一个周期。 b:write hit时则暂时放在L1D,等合适的时候再写到下级存储器。  L1D存储器结构请看下图: 图3:L1D存储器结构   其实L1D缓存结构与L1P的最大不同是采用了两路结构。并且多了一个D标志位和LRU标志位。  D标志位即dirty,表示此行是否包括最新的数据。 LRU则表示最近最少使用。即最有可能被新缓存占用的。所以这个是决定两路缓存应该使用哪一个的标志。 因此当其中一路有任何状态改变,则就会标记为最近最常使用的。那么下次缓存冲突时便会优先选择另一路。    下面讲述L2 L2的特点是:4-way set-associative,Read and write allocate Write-back L2属于全能的,即有四路组并联,保证了缓冲容量,也在一定程度上保证了缓存命中率。 可以读分配,并且支持命中回写。可以写分配,支持命中回写。    一种典型的工作场景是: 1,对于程序段而言。当cpu运行时,若需要访问某个指令,则将地址数据拆分,按照规则先从L1P中寻找,假如 找到了,则直接命中返回,只需要一个周期。假如没有找到,则到L2 cache中去找,若L2 cache 找到,则将此 指令更新到L1P的对应位置,则返回给CPU.若L2 cache依然没有找到,则从DDR2去找,找到后,更新L2 cache(注意,更新L2 cache之前,若L2 cache对应位置Line,已经标记为dirty,则要先把此line回写到 DDR2,这就是维持缓存一致性,不过代码段通常不会有这种情况,因为代码段一般是只读的 ),然后更 新L1P cache,然后返回给CPU。 2.对于数据段而言。要分读和写两种情况。 读的情况和代码段基本一致。不同的是。 若L1D中没有数据命中,当L2读命中后,则需要更新L1D,此时需要先判定L1D的对应数据是否需要回 写(即是否标记为dirty)。需要回写则先写到下级存储器L2,若写命中,则暂时放在L2,因为L2也是回写型 的。若L2写失败,则L2会从DDR2中读取一行对于地址的数据,此数据与L1D要回写过来的数据合并更新 后,缓存在L2中(注意缓存之前,肯定也会检查L2此位置是否含有标记为dirty的数据,若有,则先把次数 据写到DDR2中)。  CPU写的情况是这样,若cpu需要向写数据,肯定会先写到L1D,因为L1D是属于读分配,写不分配的,所 以如果写命中了,则会直接更新L1D。因为L1D的回写型的,因此动作到此为止。若L1D写失败,因为写不 分配,所以会从L1D旁边的write bufer通道写到L2。若恰好L2写命中,因为L2是回写型的,所以动作也到此 为止,若L2写失败,则L2会从DDR2中读取一行对于地址的数据,此数据与L1D要回写过来的数据合并更新 后,缓存在L2中(注意缓存之前,肯定也会检查L2此位置是否含有标记为dirty的数据,若有,则先把次数 据写到DDR2中)。