2.3.3 二级内部存储器
TMS320C621x/C671x/C64x片内存储器的最主要特点是作为高速缓存使用,并且分为Level1和Level2两级。程序Cache和数据Cache组成共享二级存储器L2,如图2-23所示为TMS320C621x/C671x DSP中二级存储器框图,如图2-24所示为TMS320C6000二级缓存框图。
图2-23 TMS320C621x/C671x DSP二级存储器框图
图2-24 TMS320C6000二级缓存框图
1.一级程序Cache(L1P)
L1P是第一级的程序缓冲,它只能用做缓存,不能设置为映射存储器,也没有冻结和直通模式。在结构上L1P是64行的直接映射式缓存,每行大小为64B。对L1P中数据的申请只能以行为单位,因此每个申请提交的地址中的低6位都将被忽略,接着的6位被看做该地址对应数据在缓存中的映射位置的索引。CPU中32位地址中剩下的位将作为申请数据的唯一的标记,如图2-25所示。
图2-25 TMS320C621x/C671x L1P地址分配
L1P操作是由CPU控制状态寄存器,L1P冲洗基地址寄存器L1PFBAR,L1P冲洗字计数寄存器(L1PFWC),以及缓存配置寄存器CCFG的。
L1P命中在1个周期内完成,不阻塞CPU,L1P缺失而L2命中要使CPU阻塞5个周期。若L1P缺失L2也缺失,则CPU将一直阻塞,直到L2从外部存储器中得到数据并将其传输到L1P后,L1P再把数据返回到CPU。
最初的CPU对任何一个地址的程序取指令都会产生缺失,此时将转向L2提出数据请求,返回的数据同时存入L1P中。以后再取该指令时将会产生命中。命中时将在单周期内向CPU返回相应的数据,如图2-26所示为TMS320C62x直接映射缓存框图。
图2-26 TMS320C62x直接映射缓存框图
L1P中内容的更新是由L1P控制器自动完成的,可以使用两种方法来手动控制使L1P中的内容无效:
● 将CCFG中的IP位写入1,使L1P Tag RAM中的所有Cache标记变为无效;
● 使用L1PFBAR和L1PFWC控制寄存器,该方法可令L1P中某一段缓存数据无效。
首先向L1PFBAR中写入一个地址(必须为32位对齐的),说明强制失效操作的起始地址,然后将要求失效数据长度写入L1PFWC。L1P搜索对应的外部地址在从L1PFBAR到L1PFBAR+L1PFWC-4范围内的行,同时将它们设置为无效。如果L1PFBAR和L1PFWC的值不是L1P中行大小的整数倍,则其中含有该范围内的所有行都将变为无效。当L1PFWC寄存器被写入时,指定区段的缓存令无效操作立即完成。
2.一级数据Cache(L1D)
一级数据Cache(L1D)是含有64个集的4KB的双路联合集缓存,每行大小为32B,由于存取的最小单位为字,所以每一个申请提交的地址的最低2位都将被L1D忽略,位2作为字地址,位3和位4作为4个8B子行的选择子集/线,其后的6位选择缓存中相应的组,地址中剩余的其他位作为申请数据的唯一标记,如图2-27所示。
图2-27 TMS320C621x/C671x L1D地址分配
L1D命中在1个周期内完成,不阻塞CPU,L1D缺失而L2命中将使CPU阻塞4个周期,都缺失将使CPU一直阻塞,直到L2从外部存储器重新得到数据并将其传输到L1D,然后再把数据返回到CPU。
L1D和L2 Cache之间有1个写缓冲器,这个缓冲器能最多保持4个写缺失字,只要这个缓冲器没有满,那么就能够在不阻塞CPU的情况下接受L1D的写缺失或牺牲操作,1个L1D写缺失或1个命中写缓冲器入口的侦听,将阻塞CPU直到缓冲器重新被冲洗。
同样,L1D只能作为缓存,不能作为映射的存储器。同时也没有冻结和直通的模式, L1D的结构框图如图2-28所示。
图2-28 L1D的结构框图
用户手动控制使L1D缓存数据无效同样有两种方法:
● 将CCFG控制寄存器中的ID位置1,这用L1D Tag RAM中的所有Cache标记变为无效;
● 利用L1DFBAR和L1DFWC控制寄存器。首先向L1DFBAR中写入一个字对齐的起始地址,再将要求无效的字数目写入L1DFWC,当L1DFWC的写入操作完成时,对应外部地址在L1DFBAR到L1DFBAR+L1DFWC-4范围内的行,并将它们置为无效。如果L1DFBAR和L1DFWC的值不是L1D中行大小的整数倍,则其中含有这一范围内的所有行都将变为无效。但是只有该范围内的那些字才会存入L2。
3.二级Cache(L2)
L1P和L1D都可以对L2二级存储器进行存取操作。当L1P和L1D发生缺失时,首先会向L2发出申请,L2如何回应该请求取决于L2的状态。L2有5种操作模式,取决于CCFG寄存器的设置,如图2-29所示为TMS320C62x CCFG的结构格式。表2-16为TMS320C62x CCFG各字段的功能说明。
图2-29 TMS320C62x缓存配置寄存器(CCFG)的结构格式
表2-16 TMS320C62x缓存配置寄存器(CCFG)各字段说明
复位时L2RAM的模式为64KB的映射存储器,以便完成可能需要的上电自加载。一旦L2RAM中的任何一部分设置为Cache,那么该部分就不再出现在存储器映射中。L2缓存行宽是128B。
(1)L2的接口
L2控制器处理的申请来自三个方向:L1P、L1D和EDMA的请求。因为L1P只发送读请求,它们之间的接口是一条256位宽的单向数据总线。L1D和L2之间的接口包括一条128位由L1D到L2的写总线和一条128位由L2到L1D的读总线组成。L2通过独立的读/写总线与EDMA传输数据。
(2)L2的操作
从L1P和L1D都可以访问L2,对于一个L1P或L1D的Cache缺失,首先向L2发送申请等待服务。至于L2如何响应这一申请将依赖于所选择的L2操作模式。写缓存配置寄存器(CCFG)的L2模式字段可以设置L2的相应操作模式。L2可以作为映射SRAM和Cache位。
L2模式字段的复位值是000b,所以L2复位时配置为映射SRAM以支持数据引导过程。任何配置为Cache的L2RAM就不再位于存储器映射中。如当L2MODE字段为010b时,在TMS320C64x存储器映射中就没有从0001 0000h到0001 FFFFh的地址范围。L1D对L2的每次存取需要2个周期。由于L1D中行的宽度是L1D和L2间总线的2倍,在Cache缺失情况下对L2的申请需要2次存取。所以,如果L2中包含所需数据,L1D发出Cache缺失请求将在4个周期后得到响应。而L1P发出的Cache缺失请求最快要5个周期来完成。
L2存储器由4个存储体构成,每个存储体的宽度为64位。只要数据在不同的Bank中就可以同时完成两个存取的访问。由于L1P的数据总线宽度为256位,只要L1P提出申请,如果同时L1D或者EDMA也申请,那么必然会造成Bank的冲突,导致阻塞。L1D与EDMA可以分别存取不同的Bank来避免阻塞。在CCFG中有相应的位来控制访问的优先级仲裁,只是L1D与L1P的优先级始终为高。
当L2作为映射RAM时,对其存取与一般RAM的存取完全相同;当L2配置为Cache时,其操作与L1D类似。如果L2中没有需要的数据,将申请转发给EDMA。此时为了满足于L1P的申请,L2作为Cache时,缓存数据的更新算法采用LRU。
【例2.1】 TMS320C62x/C67x设备中16KB SRAM和48KB 3路Cache连接实例。
TMS320C62x/C67x设备中连接命令文件如下:
MEMORY { L2SRAM: origin = 00000000h length = 00004000h //存储器L2SRAM的地址范围 CE0: origin = 80000000h length = 01000000h //CE0存储空间的地址范围 } SECTIONS { .cinit > L2SRAM //将.cinit段分配到L2SRAM的空间内 .text > L2SRAM //将.text段分配到L2SRAM的空间内 .stack > L2SRAM //将.stack段分配到L2SRAM的空间内 .bss > L2SRAM //将.bss段分配到L2SRAM的空间内 .const > L2SRAM //将.const段分配到L2SRAM的空间内 .data > L2SRAM //将.data段分配到L2SRAM的空间内 .far > L2SRAM //将.far段分配到L2SRAM的空间内 .switch > L2SRAM //将.switch段分配到L2SRAM的空间内 .sysmemm > L2SRAM //将.sysmem段分配到L2SRAM的空间内 .tables > L2SRAM //将.tables段分配到L2SRAM的空间内 .cio > L2SRAM //将.cio段分配到L2SRAM的空间内 .external > CE0 //将.external段分配到CE0的空间内 }
以上链接命令文件通过MEMORY伪指令确定系统中所包含的各种存储器,以及它们所占据的地址范围;用MEMORY定义一个存储器模型后再使用SECTION伪指令将各输出段定位到所定义的存储器。