实时数字信号处理,第4章 存储器,分级存储器模型,内核都支持分级存储器 片上一级(L1) 指令、数据和暂存存储器3个独立部分 内核一部分 单周期访问 片上二级(L2) 核外片上存储器 空间较大但延迟也较大 片外L3存储器 同步、异步存储器 有更大的空间,但延迟也更大,内核片上存储器L1,100KB 32KB指令存储器 16KB指令SRAM;16KB指令Cache/SRAM(可通过通道或线锁定Cache) 64KB数据存储器 32KB SRAM;32KB数据Cache/SRAM 4KB Scratch Pad SRAM(数据暂存存储器) 5个特点 改进的哈佛体系结构 每时钟周期多达4个内核存储器访问 一个64-bit指令取指,两个32-bit数据加载,一个流水线的32-bit数据存储 同时进行系统DMA、Cache维持和内核访问 具有高带宽、低延迟性能,能提供确定性访问时间和非常高的吞吐量 用于要求直接控制访问时间的应用 用于关键DSP算法和快速文本切换(CCLK速度) 指令和数据Cache(带Cache控制硬件的SRAM) 高性能、简单编程模型,消除了数据移入/出L1存储器的显性操作 快速移植、开发,无需为存储器组织进行性能优化 指令和数据cahe选项用于微控制器代码 提供了操作方便的Cache控制程序设计指令,如PREFETCH和FLUSH 具有存储器保护功能,L1指令SRAM,32KB L1指令SRAM配置为SRAM 16KB存储器组分为4KB子组,由处理器和DMA独立访问 16KB L1指令存储器配置为4通路设置关联Cache 指令可进入高速缓存中4个不同的通道 减小了高速缓存线(Cache Line)的置换频率,提高了整体性能 可以解除L1指令Cache单个通道或线的锁定,允许进一步控制时间关键代码,L1数据SRAM,数据组A和数据组B 如果都配置为SRAM,每个16KB组都分成4个4KB子组,可以独立地被处理器和DMA访问 各自的一个16KB组可配置2通路设置关联结构Cache 提供了两个独立的位置来保持被缓存的数据 减少了Cache Line的置换率,提高了整体性能,Scratch Pad SRAM,专门的独立的4KB Scratch Pad SRAM 用于Scratchpad Data SRAM 不能设置为Cache或DMA对象 在要求快速的应用中用于映射用户和监控堆栈 在中断处理时获得最快的上下文环境切换,L2、L3、MMR、BOOT,L2 128KB L2具有低延迟、高带宽能力,与L1构成了片上存储器分级结构 不能配置为Cache,能够存储指令和数据 但为使能了部分或全部Cache的系统提供确定的、限定的访问时间 L1 Cache设置成从L2上高速缓存指令和数据 L3 4组异步存储器空间和4组同步DRAM(SDRAM)空间 每个异步组固定为64MB,而每个同步组可以配置成16-128MB SDRAM起始地址是0x0000 0000,异步存储器组起始地址是0x2000 0000 MMR 存储器空间高端部分分配给内核和系统MMR 在监控模式或仿真模式下访问这个区域 Boot ROM 内部存储器空间的低2KB空间 根据引导方式,复位时处理器在这个空间执行相应的引导程序 处理器没有定义单独的I/O空间,L1指令存储器组结构,L1指令存储器子组,指令存储器控制寄存器IMEM_CONTROL,1,ENICPLB位与CPLB描述符,使能L2存储器被高速缓存访问 存储器配置为Cache 用ENICPLB位使能CPLB 通过CPLB描述符(ICPLB_DATAx和ICPLB_ADDRx寄存器)指定想要作为Cache使能的存储器页面 复位后默认的指令CPLB是禁止的 只通过L1存储器接口来执行最小地址检查 异常 试图访问保留(没有安装)的L1指令空间、L1数据空间、MMR空间去取指令 描述符(ICPLB_DATAx和ICPLB_ADDRx寄存器)更新 先必须使用ENICPLB位禁止CPLB 应跟着一条CSYNC指令 加载存储顺序是不可靠的 使能或禁止Cache或CPLB 写IMEM_CONTROL后紧接一条SSYNC指令以确保正确的行为 要确保正确行为和未来兼容性,所有保留位必须置0,L1指令SRAM取指,内核通过64位宽取指总线读取指令 地址64-bit对齐 返回任一16-bit、32-bit或64-bit指令的组合 4个16-bit指令,两个16-bit指令和一个32-bit指令,或一个64-bit指令 DAG不能直接访问L1指令存储器 异常 写L1指令SRAM必须通过64-bit宽的系统DMA口 SRAM单端口子组集合,双端口特征 系统和内核同时进行访问 不是同一子组的同一个(地址位2匹配的)32-bit单元 否则,系统DMA控制器优先权高于内核,L1指令Cache,4通路设置关联的16KB指令Cache 不能直接访问Cache 为改善关键代码平均延迟,每一Cache通路可单独锁定 只有被CPLB指定的能够作为高速缓存的存储器页面才可进行高速缓存操作 任何要访问的存储器位置必须有一个可用的相关联的页面定义 否则会产生CPLB异常 CPLB描述参见“存储器保护和属性”,指令高速缓存组织,高速缓存线,Cache 高速缓存线(Cache Line)的集合 Cache Line 由标签(Tag)和数据(Data)构成 Tag 了20位地址标签(Address Tag)、最近最少使用的(LRU)位、一个有效位、一个线锁定位 Data 4个64位字指令数据 Tag和Data分别存储在Tag和Data存储器数组中,高速缓存访问命中和错失,Cache命中 来自于内核取指请求的地址与Cache中的有效入口匹配 要取指地址的高18位及位11和10与当前一个Cache Set里有效高速缓存线地址标签的比较 取指地址的位9到5来选择Cache Set Address-Tag比较匹配则Cache命中 目标64-bit指令字首先送到指令对齐单元,保存在2个64-bit的指令缓冲器之一里 Cache错失 产生Cache Line填充访问 重新找回错失的Cache Line 访问L2或L3的地址就是目标指令字的地址 内核停止运行直到目标指令字返回,高速缓存线填充,从存储器里取32个字节数据 要求在L2或外部的读数据口上一个高速缓存线读数据传送 即一组4个64位字突发的数据字 读传送的地址:目标指令字的地址 首先返回目标指令字 之后按地址顺序依次获取后续3个指令字 如果需要的话,将回绕,如表4-2所示,高速缓存线填充缓冲器,线填充缓冲器 返回的新高速缓存线写入L1存储器一个4KB存储器组前,每个64位字被缓冲到2个4入口线填充缓冲器之一 允许内核访问新Cache Line上的数据,不必等缓存线写入Cache 两个独立的缓冲器允许继续加载来自于慢速的外部存储器里的数据 不会导致跳转到快速的片上L2存储器而暂停 使用哪一个线缓冲器取决于存储器页面CPLB里的CPLB_MEMLEV位,高速缓存线置换,Tag-Address比较操作时取指地址的位9到5作为索引来选择Cache Set Cache错失 Cache Line置换单元检查相关Cache Set有效位以决定新Cache Line入口 通路?,?=0、1、2、3 首先检查无效入口(也就是有效位清除的入口) 一个无效入口,它就为新的Cache Line 多个无效入口,基于优先级选择新Cache Line置换入口 首先是通路0,然后是通路1,接着是通路2,最后是通路3 例如: 如果通路3是无效的,通路0、1和2都是有效的,那么将选择通路3 如果通路0和1是无效的,而通路2和3是有效的,那么将选择通路0 如果通路2和3是无效的,而通路0和1是有效的,那么将选择通路2 其次,置换逻辑使用LRU算法,指令Cache管理,指令高速缓存用线锁定 ICPLB_DATAx寄存器CPLB_LRUPRIO位 用于控制哪些代码继续保留在指令Cache中 Cache Line填充时它随缓存线的Tag一起保存 它将与LRU算法一起决定当所有通路都被占用而要获取一个新的高速缓存线时,将牺牲哪个通路 指示一个缓存线重要性是低还是高 改进的LRU策略中一个重要性高的可以置换一个重要性低的,反之不能 若通路重要性都高,则可缓存的重要性低的将继续取给内核,但不被高速缓存 重要性低的只能置换没有被占用的通路,或其它低重要性的 获取的重要性高 首先寻找并置换没有被占用的通路,然后是最近最少使用的低重要性的,最后是重要性高的(使用LRU策略) IMEM_CONTROL寄存器的LRUPRIORST位 同时将所有先前被缓存的重要性高的指令转换成低重要性的,指令Cache管理,指令高速缓存用通路锁定 使能Cache后有4个通路可用 锁定位(ILOC[3:0]) 每位控制一个通路 锁定特定通路可以阻止其参与LRU置换策略 所有4个通路都锁定,将阻止Cache分配 一个被缓存的指令在其所在通路被锁定时只能使用IFLUSH指令来移出,或在“backdoor” MMR协助下对Tag阵列进行操纵来实现 下面给出的示例序列演示了如何解锁通路0 如果感兴趣的代码已经在指令Cache,首先使整个Cache失效 如果需要的话,禁止中断以防止ISR潜在地破坏锁定的Cache 设置ILOC[3:1]锁定其它通路,只允许Cache通路0可以被新代码置换 执行感兴趣代码。
任何可缓存异常,如退出代码,此代码执行所涉及的,都将进入指令Cache 一旦退出关键代码,清除ILOC[3:1]并设置ILOC[0],则关键代码(和设置ILOC[0]的指令)被锁进通路0 如果需要的话重新使能中断,指令Cache管理,指令Cache失效 可以用一个地址、一条Cache Line或整个Cache使指令Cache无效 指令IFLUSH 基于缓存线地址明确地使Cache Line无效,地址从P寄存器上产生 无修改过的(脏)数据,使Cache Line无效即可 例子:P2寄存器包含一个有效的存储器单元地址,已经进入Cache,则使该Cache Line变成无效的指令 iflush [p2] ; / *使包含由P2指向的地址的Cache Line无效* / 使存储器映射中一个特定地址无效,不能使整个Cache组无效 快一些的直接使整个Cache组无效的技术 直接设置Cache Line的无效位 使用附加的MMR ITEST_COMMAND和ITEST_DATA[1:0],直接读/写所有Cache入口 使整个指令Cache无效的另一方法 清除IMEM_CONTROL的位IMC,所有Cache中的有效位被设置成无效态 在使Cache无效前应使用一条SSYNC指令,这些操作的每一个之间应插入CSYNC指令,指令测试寄存器,整理文稿p.6最后一段,指令测试命令寄存器,指令测试数据寄存器ITEST_DATA1,指令测试数据寄存器ITEST_DATA0,指令测试数据寄存器ITEST_DATA0,L1数据存储器,用于存储数据 单口子段构成,多端口性能 降低了访问冲突 一个内核时钟周期的L1数据传送可以是 加载2个32-bit DAG 一个流水线的32-bit DAG存储 一个64-bit DMA IO 一个64-bit Cache填充访问,L1数据存储器结构,L1数据存储器SRAM子组起始地址,数据存储器控制寄存器DMEM_CONTROL,L1数据存储器,复位后默认情况下L1数据存储器都作为SRAM L1数据SRAM 访问同一个(地址位2匹配的)32-bit字、同一个4KB子组(地址位13 和12匹配)、同一个16KB半组(地址位16匹配)、同一个组(地址位21和20匹配)会发生冲突 访问权首先授予DAG,然后是存储缓冲区,最后是DMA和Cache填充处理 为确保足够的DMA带宽,如果已经被阻塞了连续16个内核时钟周期,或者如果在第1个DMA I/O处理前还有第2个DMA I/O已在队列中,可以给予DMA。