2.3 片内存储器
2.3.1 片内存储器结构
TMS320DM6437片内存储器采用两级缓存结构,如图2-5所示。第一级L1包含了程序缓存区L1P(32KB)和数据缓存区L1D(80KB)两个独立的高速缓存模块,这体现了程序与数据分开存储的哈佛结构,提高了DSP的并行运行效率。第一级缓冲区L1能与DSP内核直接进行数据交换,第二级缓冲区L2(128KB)不能与DSP内核直接交换数据,L2可以整体作为SRAM映射到存储空间,或者整体作为第二级Cache,或者配置成SRAM和Cache混合使用(通过.cmd文件中MEMORY L2RAM部分进行配置,见附录C),其中配置成RAM的部分从起始地址0x00800000开始编址,并且可被直接寻址,而配置成Cache的部分其容量必须是0KB、32KB、64KB或128KB。
TMS320DM6437在进行数据访问时,首先查看L1中是否有该数据存在,若L1中存在该数据,则直接从L1读写数据;若L1没有存储该数据,则访问二级缓存L2;若L2也没有缓存数据,则通过EMIF接口访问外部SDRAM,把数据从外部SDRAM复制到L2缓存区,再从L2缓存区复制到L1,最后由TMS320DM6437从L1读写该数据。
图2-5 存储空间结构
2.3.2 存储器空间分配
TMS320DM6437片内L1P、L1D及L2存储器的映射地址范围如表2-4所示。L1P RAM/Cache的空间大小为32KB,L1D RAM的空间大小为48KB,L1D RAM/Cache的空间大小为32KB,L2 RAM/Cache的空间大小为128KB。对于L1P、L1D及L2而言均存在两个地址,例如同一个L2存储器有一个局部地址0x00800000,也有一个全局地址如0x10800000,DSP核内访问L2时,可以使用局部地址0x00800000,其他外设如EDMA和PCI等,在访问L2时需要使用全局地址0x10800000。
表2-4 存储器的映射地址范围
要充分利用片内+片外三级存储器结构,必须提高DSP内核读取数据时的命中率,即当TMS320DM6437内核在读取代码/数据时,能够直接从L1级Cache或L2级Cache中读取,从而减少读取代码/数据时的等待时间,减小代码/数据访问带来的性能瓶颈。混合配置L2级内存是一个提高命中率的好方法,图2-6所示为L2的配置方式,将L2级存储器配置成SRAM和Cache混合,这样把一部分频繁使用的代码/数据存放在配置成SRAM的L2级存储器中,减少TMS320DM6437内核直接从片外SDRAM读取代码/数据的可能性。合理布置程序代码段的内存布局也很重要,把需要连续调用的几个函数存放在一片连续的内存空间中,并且配合Cache的大小,可以被Cache一次性读入,这样可以提高Cache的命中率。除此之外,为了提高Cache读取代码/数据的命中率,应尽量把操作相同或使用相关数据的指令写在一起,这样上一条操作留在Cache中的数据就可被下一条操作直接使用。
图2-6 L2配置方式
对Cache大小进行配置的原则是将尽量多的关键数据分配在片内,Cache越大越好,对于不同的应用需要用不同的配置。最优配置需要在开发中根据经验和实际测试结果进行选择。如在视频编解码应用中,由于片内内存容量的限制,不可能将所有数据和代码放入内存,所以在片内RAM,即L2级的SRAM中主要存放编码过程中频繁使用的一些关键数据,包括原始宏块数据、重构宏块缓冲区、DCT变换后的系数、量化后的系数等;片外SDRAM主要存放原始图像帧、当前编码重建帧和参考帧等,同时,可把Cache和SRAM分别配置为32KB和96KB大小,以适合存放图像数据。
2.3.3 一级片内程序存储器
片内程序存储器L1P(Level 1 Program Memory and Cache)的主要功能是最大化代码执行的性能,L1P的可配置性提高了系统灵活性,其配置成Cache的容量支持0KB、4KB、8KB、16KB和32KB。
L1P存储器最大可支持1MB的RAM和ROM,存储空间可分割成2个区域,每个区域不大于512KB。L1P存储器的基址被约束在1MB范围内,其总的大小必须是16KB的倍数。
L1P存储器被分割成2个区域,表示为L1P区域0和L1P区域1,它们的主要特点是:每个区域有不同数量的等待状态,且每个区域有单独的存储保护条目。这2个区域在存储空间中是连续的,区域0可以是0KB(禁用)或为16~256KB范围内2的幂次方大小。当区域0有效时,区域1的大小必须小于或等于区域0的大小。L1P的2个区域将存储保护条目分割成两组,共有32个存储保护页,前16页涉及区域0,后16页涉及区域1。当区域0为0KB时,存储保护页将不被使用。
L1P区域只能使用EDMA或IDMA访问写入,而不能使用CPU保存写入;L1P区域可使用EDMA或IDMA访问读取,而CPU访问只限于指令取指。即使L1P被内存映射,CPU也不能读取L1P。
L1P的2个区域有不同的等待状态,其等待状态的最大数目为3,且等待状态数目不可在软件中进行配置,当芯片生产时,等待状态数就已被定义。典型L1P SRAM有0个等待状态,而L1级ROM有多于0个等待状态。
为了便于以快速的时钟频率读取程序代码,L1P Cache是非常必要的,这样可以保持大的系统内存。Cache主要用于缓解从较慢的系统存储单元进行读/写操作带来的延迟。L1P可以部分或全部转换成Cache,其支持的缓存大小为4KB、8KB、16KB和32KB。通过从顶部的L1P内存映射开始向下工作,L1P中的RAM和Cache可转换成内存。L1P区域1的最高位地址首先变成Cache,而L1P Cache只占据区域1。重置“内存”和“最大缓存”后,Cache控制器初始化。L1P Cache操作受控于如表2-5所示的寄存器。
表2-5 L1P Cache寄存器
CPU中含有一个内部控制寄存器——控制状态寄存器(CSR),它为Cache控制操作规定了一个字段(PCC),从而为C64x+/C64x/C62x/C67x设备提供反相兼容。L1P配置寄存器(L1PCFG)控制L1P Cache的大小,如图2-7和表2-6所示。
图2-7 L1P配置寄存器(L1PCFG)
表2-6 L1P配置寄存器(L1PCFG)字段描述
L1P Cache控制寄存器(L1PCC)控制L1P是否为冻结模式,如图2-8和表2-7所示。
图2-8 LIP Cache控制寄存器(L1PCC)
表2-7 LIP Cache控制寄存器(L1PCC)字段描述
L1P无效基址寄存器(L1PIBAR)定义了一致性操作作用的无效块的基址,如图2-9和表2-8所示。
图2-9 L1P无效基址寄存器(L1PIBAR)
表2-8 L1P无效基址寄存器(L1PIBAR)字段描述
L1P无效字计数寄存器(L1PIWC)定义了一致性操作作用的无效块的大小,如图2-10和表2-9所示。
图2-10 L1P无效字计数寄存器(L1PIWC)
表2-9 L1P无效字计数寄存器(L1PIWC)字段描述
L1P无效寄存器(L1PINV)控制L1P Cache的全局无效,如图2-11和表2-10所示。
图2-11 L1P无效寄存器(L1PINV)
表2-10 L1P无效寄存器(L1PINV)字段描述
L1P Cache是直接映射缓存,这意味着系统的每一个物理内存单元在Cache中都保留一个可能的位置,当CPU试图取一段程序代码时,L1P必须检查是否在L1P Cache中保留了需要的地址。为此,CPU提供的32位地址被分割成3个字段(Tag、Set和Offset),如图2-12所示。
图2-12 数据存取地址结构
L1P缓冲行(Cache Line)的大小是32B,TMS320C64x的指令长度一般为4B,这就表示在L1P Cache读取指令的时候,每次能读取8条指令。偏置(Offset)字段占用了L1P缓冲行的前5位,其被Cache控制逻辑忽略。设置(Set)字段指明L1P缓冲行的地址,其缓存数据将被保留,设置字段的宽度取决于L1P配置成Cache的数量。L1P使用设置字段来查找和检查任意已缓存数据的标签(Tag)和有效位,这反映了标签地址是否真正是Cache中的有效地址。标签字段占据存储地址的上部,它确定了数据单元的真实物理位置。在程序取指中,如果标签匹配且对应的有效位被设置,那么它就称作“命中”,其数据将被直接从L1P Cache单元中读取并返回到CPU中。否则,称其为“未中”,并向L2控制器发送请求,获取系统对应位置中的数据。“未中”将有可能使得CPU挂起。在正常情况下,CPU不能向L1P写数据,L1P Cache配置规定了设置字段和标签字段的大小。
在所有的Cache配置中,L1P Cache作为直接映射缓存进行操作,这意味着系统内存中的每个位置都精确地对应于L1P Cache中的一个位置。由于L1P是直接映射,其缓存替换策略较简单:每个新的缓存行替换先前的缓冲行即可。L1P控制器可执行一个读分配缓存,这意味着L1P将在“读漏(Read Miss)”中取得一个32位的完整行。
L1P结构允许在运行时选择L1P Cache大小,通过写请求模式到L1PCFG寄存器的L1PMODE字段来选择L1P Cache大小,如表2-11所示。L1P Cache模式的实际范围受L1P区域1的约束,当L1P区域1仅有16KB大小时,L1P Cache将不大于16KB,因此,编码011b到111b的器件被映射到16KB Cache,且其L1P区域1仅有16KB。对于这些器件,设置为从100b到111b的L1PMODE选择16KB缓存模式,而不是32KB缓存模式。因此,模式000b到011b总是选择请求模式指定的大小(0~16KB),而模式100b到111b选择L1P内存指定的最大缓存大小(16KB或32KB)。
表2-11 通过L1PCFG寄存器中的L1PMODE位指定Cache大小
根据以上规定,当设计的程序需要一定量的Cache时,应该设置为模式值的上界,即应该设置L1PMODE为111b来获得“尽可能大的缓存”。当程序初始Cache模式变化时,L1P Cache本身内容将无效,这将确保在缓存标签变化时也不会发生错误。为了确保正确的Cache,需要进行无效设置,然而由于部分L1P RAM变成Cache,为了安全地改变L1P Cache模式,在应用中还需要遵守表2-12中的规则。
表2-12 L1P模式转换规则
在应用中,L1P Cache直接支持冻结模式操作,该模式允许应用程序保护CPU数据访问以保证来自Cache中的程序代码不被覆盖,这一特点在中断环境中非常有用。L1P冻结模式仅影响L1P Cache,不影响L1P RAM。
在冻结模式中,L1P Cache将正常地服务于“读命中”,“读命中”从Cache中返回数据。此模式中,L1P Cache将不会在“读漏(Read Miss)”中分配新的Cache,也不会造成现有的Cache内容被标记为无效。在L1PCC寄存器中,OPER字段控制L1P是否被冻结或正常操作。CPU通过写001b到L1PCC寄存器的OPER字段来设置L1P进入冻结模式,而返回正常模式是通过写0b到L1PCC寄存器的OPER字段。
2.3.4 一级片内数据存储器
片内数据存储器L1D(Level 1 Data Memory and Cache)主要功能是最大化数据处理性能,L1D的可配置性为系统使用L1D提供了灵活性。它具有以下特点:可配置Cache的大小,如0KB、4KB、8KB、16KB和32KB,支持存储保护,提供块缓存和全局一致操作。
L1D存储器最大可支持1MB的存储映射RAM和ROM,L1D存储器的基址被约束在1MB范围内,其总的大小必须是16KB的倍数。
L1D存储器被分割成2个区域,表示为L1D区域0和L1D区域1,其有以下特点:①每个区域有单独的内存保护条目;②部分L1D区域1可被转换为数据Cache。这2个区域在存储中是连续出现的,区域0可以是0KB(禁用)或为16~512KB范围内2的幂次方大小。区域1开始于区域0之后,其大小为16~512KB范围内16KB的倍数。当区域0使能时,区域1的大小必须小于或等于区域0的大小。L1D的2个区域将存储保护条目分割成两组,共有32个数据存储保护页,前16页涉及区域0,后16页涉及区域1。当区域0为0KB时,存储保护页将不被使用。
L1D存储器结构允许将部分或全部的L1D区域1转换成读分配、写返回和双向集关联的Cache。为了便于以全CPU时钟频率读写数据,同时具有大的系统内存,Cache是非常必要的,其主要用于缓解从较慢的系统存储单元进行读/写操作带来的延迟。Cache控制器设计支持4~32KB范围内的一系列Cache大小,然而,对于给定大小的设备,其在区域1实现的L1D RAM小于32KB。L1D Cache转换为L1D内存起始于L1D区域1的最高内存地址,并向下工作。重置“内存”和“最大缓存”后,Cache控制器即可初始化。L1D Cache操作受控于表2-13所示的控制寄存器,这些寄存器允许改变Cache的模式和手动初始Cache一致操作,除了表中所列控制寄存器,L1D Cache也会受到写入L2指定控制的影响。
表2-13 L1D Cache控制操作
CPU有一个内部控制寄存器,其给出一个字段用于Cache控制操作,即CSR。早期的设备中,CSR控制寄存器中的DCC字段以多种方式控制L1D操作。而TMS320C64x+DSP中,CSR不再控制L1D操作,L1D忽略了DCC字段中的值,前述的DCC字段只作为L1DCC和L1DCFG寄存器的这一部分。
L1D Cache配置寄存器(L1DCFG)控制L1D Cache的大小,如图2-13和表2-14所示。
图2-13 L1D配置寄存器(L1DCFG)
表2-14 L1D配置寄存器(L1DCFG)字段描述
L1D Cache控制寄存器(L1DCC)控制L1D是否为冻结模式,如图2-14和表2-15所示。
图2-14 LID Cache控制寄存器(L1DCC)
表2-15 LID Cache控制寄存器(L1DCC)字段描述
L1D无效寄存器(L1DINV)控制L1D Cache的全局无效,如图2-15和表2-16所示。
图2-15 L1D无效寄存器(L1DINV)
表2-16 L1D无效寄存器(L1DINV)字段描述
L1D写回寄存器(L1DWB)如图2-16和表2-17所示。
图2-16 L1D写回寄存器(L1DWB)
表2-17 L1D写回寄存器(L1DWB)字段描述
L1D无效写回寄存器(L1DWBINV)控制L1D Cache的无效写回操作,如图2-17和表2-18所示。
图2-17 L1D无效写回寄存器(L1DWBINV)
表2-18 L1D无效写回寄存器(L1DWBINV)字段描述
L1D无效基址寄存器(L1DIBAR)定义了无效块基址,如图2-18和表2-19所示。
图2-18 L1D无效基址寄存器(L1DIBAR)
表2-19 L1D无效基址寄存器(L1DIBAR)字段描述
L1D无效字计数寄存器(L1DIWC)定义了无效块的大小,其定义的大小为32位,如图2-19和表2-20所示。
图2-19 L1D无效字计数寄存器(L1DIWC)
表2-20 L1D无效字计数寄存器(L1DIWC)字段描述
L1D写回基址寄存器(L1DWBAR)定义写回块的基址,如图2-20和表2-21所示。
图2-20 L1D写回基址寄存器(L1DWBAR)
表2-21 L1D无效基址寄存器(L1DWBAR)字段描述
L1D无效写回字计数寄存器(L1DWIWC)定义了无效写回块的大小,其定义的大小为32位,如图2-21和表2-22所示。
图2-21 L1D无效写回字计数寄存器(L1DWIWC)
表2-22 L1D无效字计数寄存器(L1DWIWC)字段描述
L1D Cache是一个双向集关联Cache,这意味着系统的每个物理内存单元在Cache中都保留2个可能的位置,当CPU试图访问一段数据时,L1D必须检查是否在L1D Cache中保留了需要的地址。为此,CPU提供的32位地址被分割成6个数据字段,如图2-22所示。
图2-22 数据存取地址结构
L1D缓冲行(Cache Line)大小为64Bytes,偏置(Offset)字段占用了前6位,Cache控制逻辑忽略了地址的0到5位(Byte、Bank和Sub-line Fields),位0~5只确定哪个Bank和Bank中哪些字节被访问,因此,其与Cache标签(Tag)的比较逻辑不相关。设置(Set)字段表明L1D Cache Line地址,其缓存数据将被保留,设置字段的宽度取决于L1D配置成Cache的大小,如表2-23所示。使用设置字段来查找和检查任意已缓存数据的标签和有效位,这表明标签地址是否真正代表Cache中的有效地址。
表2-23 设置(Set)字段宽度对应的数据访问地址
标签字段占据存储地址的上部,其确定了数据单元的真实物理位置。Cache可与用于两路L1D Cache保存的标签相比较。如果其中的一个标签匹配且对应的有效位被设置,那么它就称作“命中”,其数据将被直接从L1D Cache中读取并返回到CPU中,否则,称其为“未中”,此时CPU挂起并向L2存储器发送请求,来获取系统对应位置中的数据。
CPU也可以写数据到L1D,当CPU执行保存操作时,L1D像执行读操作一样进行相同标签的比较,如果找到一个有效的匹配标签,则写为“命中”,数据被直接写入到L1D Cache位置中。否则为“漏写(Miss)”,数据排列在L1D写缓存区(Write Buffer)中。这个缓存区用于防止“漏写”后CPU被挂起,由于CPU不等待数据返回到写操作,所以在访问L2期间CPU不会被挂起。
数据Cache的另一个特点是具有从L1D Cache到L2的数据驱动能力,由于CPU能够修改L1D Cache的内容,它必须具有在数据真实物理位置中对数据进行更新的能力。这发生在当一个新的L1D行代替被修改的L1D行,或当CPU告诉L1D Cache通过软件控制写回修改数据的时候。
在所有的Cache配置中,L1D Cache以定点双向集关联的方式进行操作,这意味着系统内存中的每个位置可以保留在L1D Cache中2个可能的位置中。L1D Cache是只读分配Cache,这意味着L1D Cache仅在一次“读漏”中将获取一个64B的完整行,“写漏(Write Miss)”通过L1D写缓存直接被发送到L2,替代策略(Replacement Strategy)要求最近最少使用(Least-recently-used, LRU)的L1D行被新行替代,这将保持最近访问的数据总在L1D Cache中。
L1D为写回Cache,写命中(Write Hit)在L1D中直接处理,数据更新不会立即传到L2或其余的系统内存中。当修改Cache时,对应的相关“修改位(Dirty Bit)”被设置为1。当L1D为新的缓存数据腾取空间,或程序初始手动一致操作来强制写回,或CPU初始一个长距离读操作到一个已匹配的非缓存内存时,L1D只写回“修改行(Dirty Lines)。”
L1D Cache允许在运行时配置其大小,程序通过写请求模式到L1DCFG寄存器的L1DMODE字段来选择L1D Cache的大小,如表2-23所示。L1D Cache模式的实际范围受L1D区域1的约束,通常,较大的L1DMODE值指定一个较大的Cache大小,直到L1D内存可实现的大小为止,最大的L1D Cache大小在L1D区域1中RAM大小相适合的最大2的幂次方和32KB中取其最小值。例如,当L1D区域1仅有16KB大小时,L1D Cache不能大于16KB,这样,从011b到111b的编码映射到16KB,在这些设备上,L1DMODE设置从100b到111b将选择16KB Cache模式而不是32KB Cache模式。也就是说,000b到011b模式总是选择请求的大小(0~16KB);100b到111b模式选择L1D内存指定的最大大小(16KB或32KB)。
根据以上规定,当设计的程序需要一定量的Cache时,应该设置为模式值的上界;当设计的程序需要尽可能多的Cache时,应该设置L1DMODE为111b。当程序初始Cache模式变化时,L1D Cache本身内容写回,并在不损失数据的前提下将当前内容置为无效。为了确保正确的Cache且不损失缓存数据,写回-无效是必要的,并且为了安全改变L1D Cache模式,在应用中必须遵守类似于L1P模式改变的规则(见表2-12)。
在应用中,L1D Cache直接支持冻结模式操作,该模式允许实时应用程序在各部分代码中限制从L1D发出的数据量,如中断处理程序。L1D冻结模式仅影响L1D Cache,不影响L1D RAM。
除了少数LRU位不被修改的情况,在冻结模式中L1D Cache将正常地服务于读命中和写命中,读命中从Cache中返回数据,写命中更新缓存行的缓存数据并标记为使用。LRU位不被更新,其表示用于受影响Cache Line的最近最少使用方式。冻结模式中,L1D Cache将不会在“读漏(Read Miss)”中分配新的Cache Line,也不会驱逐已有的Cache内容。L1D中写缓存的“写漏(Write Miss)”按正常顺序排列。在L1DCC寄存器中,OPER字段控制L1D的冻结模式。CPU通过写1到L1PCC寄存器的OPER字段来设置L1D进入冻结模式,而返回正常模式是通过写0到L1PCC寄存器的OPER字段。
2.3.5 二级片内存储器
二级片内存储器(L2 Memory and Cache)为较快的一级片内存储器(L1P和L1D)与较慢的外部存储单元间数据传送存储提供了一个片上存储解决方案,其优势在于提供了比L1存储器更大的存储空间,同时也提供了比外部存储更快的数据访问。类似于L1存储器,L2可配制成Cache和非Cache(可寻址)存储器。
L2存储器提供了设备需要的灵活存储方式,包括2个存储端口(Port 0和Port 1),可配置的L2 Cache大小(32KB/64KB/128KB/256KB),存储保护,支持缓存块和全局一致操作,并具备4个可配置的节电模式页。
L2存储器提供的2个256位宽的存储接口称为Port 0和Port 1,这两个端口的使用依赖于设备,在多数设备中,2个存储端口使用如下。
(1)Port 0:L2 RAM、L2 Cache。
(2)Port 1:L2 ROM、L2 RAM、共享存储接口。
对于每个端口,L2控制器支持存储大小范围为64KB到819KB。L2存储器的2个存储端口各自独立,且每个存储端口可控制以下4×128位Banks、2×128位Banks、1×256位Banks任意一种。
这两个存储端口可编址存储段,其编址可能是不连续的,表2-24阐明了Port 0和Port 1如何在2×128位Banks的情况下用于低位优先(Little Endian)模式。
表2-24 2×128位Banks方案
L1P“读漏”(32B)需要单一端口的全部存储Bank,当L2存储器具有高延迟时,在同一周期或直到该端口完成访问前,其他访问不能进行。L1D的读漏(64B)或写回也需要单一端口的全部存储Bank,用于两次连续访问。
C64x+CPU的默认配置将全部的L2存储器映射为RAM/ROM,L2控制器的Port 0支持32KB、64KB、128KB或256KB的四路集关联Cache,在Port 0超过256KB的剩余存储和连接到Port 1的全部存储总是RAM或ROM。
L2 Cache的操作通过以下寄存器进行控制,表2-25对这些控制寄存器进行了总结。
表2-25 L2 Cache控制寄存器
这些寄存器分为3类,涉及以下部分:
(1)Cache大小和操作模式控制,这些寄存器控制Cache大小和Cache是否为冻结模式或正常操作模式;
(2)面向块和全局一致性操作,这些操作允许从Cache中手动移出数据;
(3)可缓存性控制,这些寄存器控制Cache是否允许存储一定范围内存的副本。
L2配置寄存器(L2CFG)控制L2 Cache操作,可设置L2内存作为Cache的大小、控制L2冻结模式及保持L1D/L1P无效位,如图2-23和表2-26所示。
图2-23 L2配置寄存器(L2CFG)
表2-26 L2配置寄存器(L2CFG)字段描述
L2写回基址寄存器(L2WBAR)如图2-24和表2-27所示。
图2-24 L2写回基址寄存器(L2WBAR)
表2-27 L2写回基址寄存器(L2WBAR)字段描述
L2写回字计数寄存器(L2WWC)定义无效块的大小,其大小以32位字进行定义,写入一个大于FFE0h的数字会导致写入单元不被修改,如图2-25和表2-28所示。
图2-25 L2写回字计数寄存器(L2WWC)
表2-28 L2写回字计数寄存器(L2WWC)字段描述
L2无效写回字计数寄存器(L2WIWC)定义无效块的大小,其大小以32位字进行定义,写入一个大于FFE0h的数字会导致写入单元不被修改,如图2-26和表2-29所示。
图2-26 L2无效写回字计数寄存器(L2WIWC)
表2-29 L2无效写回字计数寄存器(L2WIWC)字段描述
L2无效基址寄存器(L2IBAR)定义无效块的基址,如图2-27和表2-30所示。
图2-27 L2无效基址寄存器(L2IBAR)
表2-30 L2无效基址寄存器(L2IBAR)字段描述
L2无效字计数寄存器(L2IWC)定义了无效块的大小,其大小以32位字进行定义,写入一个大于FFE0h的数字会导致写入单元不被修改,如图2-28和表2-31所示。
图2-28 L2无效字计数寄存器(L2IWC)
表2-31 L2无效字计数寄存器(L2IWC)字段描述
L2写回寄存器(L2WB)控制L2 Cache的全局写回操作,如图2-29和表2-32所示。
图2-29 L2写回寄存器(L2WB)
表2-32 L2写回寄存器(L2WB)字段描述
L2无效写回寄存器(L2WBINV)控制L2 Cache的无效写回操作,如图2-30和表2-33所示。
图2-30 L2无效写回寄存器(L2WBINV)
表2-33 L2无效写回寄存器(L2WBINV)字段描述
L2无效寄存器(L2INV)控制L2 Cache的全局无效,如图2-31和表2-34所示。
图2-31 L2无效寄存器(L2INV)
表2-34 L2无效寄存器(L2INV)字段描述
L2内存属性寄存器(MARn)定义外部存储空间的可缓冲性,只在管理员模式下可写,其通用结构如图2-32所示,功能描述如表2-35所示。
图2-32 L2无效寄存器(L2INV)
表2-35 L2无效寄存器(L2INV)字段描述
L2内存结构提供了存储保护支持,详细的存储保护权限如表2-36所示。
表2-36 L2 Cache控制寄存器权限
L2 Cache是一种读写分配、四路集关联的Cache,为了跟踪L2 Cache的状态,还包含一个四路的Tag RAM。L2标签的地址组织是关于Cache和RAM间划分比例的函数,其通过L2CFG寄存器L2MODE字段进行控制。
L2缓冲行(Cache Line)大小为128B,偏置(Offset)字段占用了前7位,Cache控制逻辑忽略了这部分地址,如图2-33所示。设置(Set)字段指出了L2缓冲行的地址,其缓存数据将以各自方式被保留,设置字段的宽度依赖于L2配置成Cache的大小,如表2-37所示。L2控制器使用设置字段来查找和检查任意已缓存数据的标签和有效位。
图2-33 L2 Cache地址结构
表2-37 L2 MODE描述
标签字段占据存储地址的上部,其确定了Cache的真实物理位置。Cache将给定地址的标签字段与L2 Cache全部四路保存的标签相比较,如果其中任一标签匹配且缓存数据有效,那么称作“命中”,其数据将被直接从L2 Cache中读取或直接写入到L2 Cache,否则,称其为“未中”,当L2从系统存储位置中取一个完整行,请求被暂停。在读漏中,数据直接传递给适当的L1 Cache作为获取的一部分,在写漏中,L2将写与获取的行合并。
由于L2内容可被修改,L2 Cache能够在其真实物理位置上更新数据。L2 Cache是一个写回Cache,这意味着仅当需要时其写出更新。从L2 Cache中驱逐的数据写回到其在系统存储中的适当位置。这发生在一个新的L2线替代已被更新的数据线,或当L2控制器由CPU写回修改数据。一旦驱逐或写回发生,数据通过EMC发送到其在系统存储中的位置。
在所有的Cache模式中,L2 Cache以定点四路集关联的方式进行操作,这意味着系统内存中的每个位置可以保留在L2 Cache中4个可能的位置中。L2控制器执行一个读写分配Cache,这意味着L2将获取一个128字节的完整行用于可缓存位置,而不考虑其是读或写。替代策略与L1D的替代策略相同,其最近最少使用(Least-recently-used, LRU)L2行被新行替代。
为了响应全局重置,L2 Cache被转换为“全RAM模式”。为了响应局部重置,L2 Cache保持当前的操作模式,然而,整个Cache的内容失效,当无效发生时,所有的请求被挂起。如果启用了L1 Cache支持,L2控制器采取必要的步骤来确保当L2很难通过软硬件重置时,L1 Cache能以相同的方式响应。
L2 Cache允许在运行时配置其大小,程序通过写请求模式到L2CFG寄存器的L2MODE字段来选择L2 Cache的大小,如表2-37所示。通常,重置后不久,程序设置L2模式并保持不变,然而,一些程序会在工作中改变L2 Cache模式,特别是对于复杂系统的操作系统任务转换。需要注意确保遵循表2-38所示的步骤来保持存储系统一致和正确的Cache操作。当程序写入新的Cache模式到L2CFG寄存器,L2执行以下步骤:①L2 Cache使能,则写回并置为无效;②L2 Cache设置为需要的模式,需要注意的是改变L2模式不会影响L1 Cache的内容。
表2-38 L2模式转换规则
L2 Cache支持冻结模式,在该模式下,L2 Cache内容被冻结,即它将不能像正常操作一样被更新。L2冻结模式允许实时应用程序在各部分代码中限制从L2发出的数据量,如中断处理程序。使用L2CFG寄存器中的L2CC字段来设置冻结模式。
冻结模式只影响L2 Cache操作,而不影响L2 RAM,其也不影响L1P和L1D,同样,L1冻结模式也不影响L2 Cache。在冻结模式中,L2 Cache正常响应读写操作,此时L2直接发送读漏和写漏到外部存储器。冻结模式时L2不再分配新的缓冲行,缓冲行只能通过程序初始化操作从L2进行发送。表2-39总结了通过使用L2CFG寄存器中L2CC字段来设置冻结模式的方式。
表2-39 L2冻结模式