您的位置:首页 > 其它

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

2012-08-11 13:57 260 查看
本文涉及到的一些术语请参考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中)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: