TI C66x多核DSP高级软件开发技术图书
人气:61

TI C66x多核DSP高级软件开发技术

前言C66x是TI(Texas Instruments)公司推出的新一代处理器内核,包含定点和浮点计算能力,C66x包含 90个新指令用于提升浮点和矢量运算。TMS320C6678是基于C66x内核的8核处理器,66AK2Hx是基于ARM CortexA15和C66...

内容简介

本书系统介绍了C66x多核软件开发的知识,并基于C6678的设计实例介绍了相关设计经验。系统介绍了C66x DSP器件的基础概念和多核软件设计的基础知识,引领读者循序渐进地掌握多核软件设计技术。对于传统DSP开发人员比较陌生的一些概念,如Cache、预取、数据一致性、数据依赖、死锁等,进行了重点描述。系统介绍了C66x多核器件的存储器、DMA传输、中断等内容,并结合工作实际,介绍了多核软件优化、多核并行设计及任务级优化经验。后,以多普勒成像的设计实例描述了如何实现并行设计。 全书共11章,内容包括C66x DSP的基本组成,如存储器组织、DMA传输、中断和异常、Cache缓存和数据一致性等,并包含CCS软件开发环境、SYS/BIOS实时操作系统、多核并行设计、软件设计优化等相关知识。 本书的特点是由浅入深、概念齐全、实践性强、指导性强。本书结合了多年多核软件开发的实际经验,对多核设计中常见的问题进行了详细的描述; 从基本概念出发,层层推进,介绍了多核并行、数据传输与处理并行和多层次并行设计的经验。 对于从事C66x多核软件开发的设计师,本书具有很强的指导意义,本书还适合作为高校计算机、数据处理、信号处理、通信等相关专业的本科和研究生教材。

编辑推荐

1.本书由浅入深、概念齐全、实践性强、指导性强,结合了多年多核软件开发的实际经验,对多核设计中常见的问题进行了详细的描述。 2.本书从基本概念出发,层层推进,介绍了多核并行、数据传输与处理并行和多层次并行设计的经验,是多核DSP并行软件开发者必备的参考书。

目录

目录

第1章TI多核C66x DSP介绍

1.1C6678处理器

1.1.1C6678概览

1.1.2设备

1.266AK处理器

1.366AK2H14/12/06和C6678各项功能对比

1.4C66x处理器内核

1.5电源休眠控制器

1.5.1C66x内核电源休眠管理介绍

1.5.2电源休眠管理特征

1.6锁相环及其设置

1.6.1主PLL和PLL控制器

1.6.2DDR3 PLL

1.6.3PASS PLL

1.7C6678处理器接口通信相关设备

1.7.1I2C设备

1.7.2SPI 设备

1.7.3HyperLink 设备

1.7.4UART 设备

1.7.5PCIE 设备

1.7.6TSIP 设备

1.7.7包加速器

1.7.8EMIF16设备

1.7.9安全加速器

1.7.10Gigabit Ethernet开关子系统

1.7.11管理数据输入输出

1.7.12串行RapidIO端口

1.7.13通用目的输入输出

1.8定时器

1.9信号量

1.10多核导航器

1.11设计建议

1.11.1初始化

1.11.2接口驱动程序

1.11.3时间戳的获取

1.11.4EVM板的使用

第2章C66x存储器组织

2.1C66x存储控制器

2.1.1L1P存储控制器

2.1.2L1D存储控制器

2.1.3L2存储控制器

2.1.4外部存储控制器

2.1.5扩展存储控制器

2.2多核共享存储控制器

2.2.1概览

2.2.2C66x内核从接口

2.2.3系统从接口

2.2.4系统主接口

2.2.5外部存储器主接口

2.2.6MSMC存储器

2.3扩展存储控制器XMC

2.3.1存储器映射寄存器概要

2.3.2XMC 存储器保护和地址扩展

2.3.3存储器保护和地址扩展过程

2.3.4地址扩展

2.3.5XMC存储器保护结构支持

2.3.6预取缓冲

2.4存储器保护架构

2.4.1存储器保护的目的

2.4.2特权级别

2.4.3存储器保护架构

2.5带宽管理

2.5.1介绍

2.5.2带宽管理架构

2.5.3带宽管理寄存器

2.6设计建议

2.6.1合理规划使用存储器

2.6.2存储器设置成不被Cache缓存和预取

第3章Cache缓存和数据一致性

3.1为什么使用Cache

3.2C64x和C66x DSP之间的Cache区别

3.3Cache 存储器结构概览

3.4Cache基础知识

3.4.1直接映射Cache——L1P Cache

3.4.2Cache缺失的类型

3.4.3组相联 Cache

3.4.4二级Cache

3.5L1P Cache

3.5.1L1P存储器和Cache

3.5.2L1P Cache结构

3.5.3L1P冻结模式

3.5.4程序启动的一致性操作

3.6L1D Cache

3.6.1L1D存储器和Cache

3.6.2L1D Cache结构

3.6.3L1D 冻结模式

3.6.4程序发起的Cache一致性操作

3.7L2 Cache

3.7.1L2存储器和Cache

3.7.2L2 Cache结构

3.7.3L2 冻结模式

3.7.4程序发起的Cache一致性操作

3.7.5Cache能力控制

3.8使用Cache

3.8.1配置L1 Cache

3.8.2配置L2 Cache

3.9数据一致性

3.9.1Snoop 一致性协议

3.9.2在外部存储器和Cache之间维持一致性

3.9.3对L2 Cache一致性操作使用指导

3.9.4对L1 Cache一致性操作使用指导

3.10片上Debug支持

3.11在运行中改变Cache配置

3.11.1禁用外部存储器Cache功能

3.11.2在运行中改变 Cache尺寸

3.12优化Cache性能

3.12.1Cache 性能特征

3.12.2阻塞情况

3.12.3优化技术概览

3.12.4应用级优化

3.12.5过程级优化

3.12.6C66x DSP Cache一致性操作小结

3.13设计建议

3.13.1消除虚假地址

3.13.2数据一致性问题

第4章DMA传输

4.1IDMA

4.1.1IDMA 结构

4.1.2IDMA通道 0

4.1.3IDMA 通道1

4.2EDMA3 控制器

4.2.1EDMA3 控制器介绍

4.2.2EDMA3 器件特定的信息

4.2.3EDMA3 通道控制器配置

4.2.4EDMA3 传输控制器配置

4.2.5EDMA3 通道同步事件

4.2.6EDMA3 通道控制器

4.2.7EDMA3 传输控制器

4.3EDMA3传输类型

4.3.1A同步传输

4.3.2AB同步传输

4.4参数RAM

4.4.1PaRAM参数集

4.4.2Dummy 与Null传输比较

4.4.3参数集更新

4.4.4连接传输

4.4.5常数地址模式传输/对齐问题

4.4.6单元大小

4.5发起一个 DMA传输

4.5.1DMA 通道

4.5.2QDMA 通道

4.5.3完成一个DMA传输

4.6提升DMA性能的几点建议

4.6.1尽量用较大的ACNT

4.6.2线性传输

4.6.3地址对齐

4.6.4恰当使用多个CC和TC传输

第5章中断和异常

5.1C6678处理器中断简介

5.2芯片中断控制器

5.3C66x 内核中断控制器概述

5.3.1特征

5.3.2功能块图

5.4中断控制器结构

5.4.1事件寄存器

5.4.2事件合并器

5.4.3中断选择器

5.4.4异常合并器

5.5C66x 内核事件

5.6中断控制器与DSP交互

5.6.1DSP 中断控制器接口

5.6.2DSP 服务中断事件

5.7中断设计建议

5.7.1不要过多使用中断或中断嵌套

5.7.2中断服务程序中代码不宜过长

5.7.3中断服务程序改变的全局变量要加上volatile标志

第6章如何使用CCS

6.1常用界面

6.1.1Project Explorer

6.1.2程序窗口

6.1.3目标配置窗口

6.1.4Debug 窗口

6.1.5Memory 窗口

6.1.6Expressions窗口

6.1.7Breakpoints窗口

6.1.8Problems窗口

6.1.9Console窗口

6.2新建工程

6.3新建一个目标配置文件

6.3.1新建ccxml文件

6.3.2设置仿真器

6.3.3添加器件

6.4常用操作

6.4.1Launch

6.4.2Group

6.4.3Connect

6.4.4加载程序

6.4.5设置断点调试程序

6.4.6复位

6.5常见问题

6.5.1头文件找不到

6.5.2EVM板未初始化,调试找不到DDR3

6.5.3选中不了仿真器

6.5.4加断点调试错误

6.5.5域选择不正确

6.5.6仿真器连接中断电

6.6设置字体和代码风格

6.6.1修改字体

6.6.2代码风格设置

6.7MCSDK

6.7.1MCSDK架构

6.7.2MCSDK 特点

6.8TI函数库调用

6.8.1格式选择

6.8.2库的调用

6.8.3库的使用

6.9理解CMD文件

6.9.1CMD文件简介

6.9.2MEMORY命令

6.9.3SECTIONS命令

第7章SYS/BIOS实时操作系统

7.1什么是SYS/BIOS

7.1.1SYS/BIOS的优势

7.1.2SYS/BIOS和XDC TOOL的关系

7.2SYS/BIOS包

7.3SYS/BIOS中使用C

7.3.1存储器管理

7.3.2Name Mangling

7.3.3从配置调用对象方法

7.3.4类构造器和析构器

7.4SYS/BIOS配置和编译

7.4.1在工程中添加SYS/BIOS支持

7.4.2创建一个独立的配置工程

7.4.3配置SYS/BIOS 应用

7.4.4用XGCONF打开一个配置文件

7.4.5用XGCONF执行任务

7.4.6保存配置

7.4.7关于XCONFG视图

7.4.8使用可用产品视图

7.4.9使用概要视图

7.4.10使用属性视图

7.4.11使用问题视图

7.4.12找到并修正错误

7.5编译一个SYS/BIOS应用

7.5.1了解编译流程

7.5.2编译和连接优化

7.6线程模块

7.6.1SYS/BIOS 启动顺序

7.6.2线程模块的概览

7.6.3线程类型

7.6.4线程优先级

7.6.5让步和抢占

7.6.6钩子

7.7硬件中断

7.7.1创建中断

7.7.2硬件中断嵌套和系统堆栈大小

7.7.3硬件钩子

7.8软件中断

7.8.1创建软件中断对象

7.8.2设置软件中断优先级

7.8.3软件中断优先级和系统堆栈大小

7.8.4软件中断执行

7.8.5优点和折中

7.8.6软件中断函数同步

7.8.7软件钩子

7.9任务

7.9.1创建任务

7.9.2任务执行状态和调度

7.9.3任务堆栈

7.9.4测试堆栈溢出

7.9.5任务钩子

7.9.6空闲循环

7.10SYS/BIOS同步模块

7.10.1信号量

7.10.2事件模块

7.10.3门模块

7.10.4邮箱

7.10.5队列

7.11定时服务

7.12Memory

7.12.1新建一个Platform

7.12.2栈

7.12.3Cache配置

7.12.4Cache Runtime API

7.12.5动态存储器分配

7.12.6Heap的实施

7.13硬件抽象层

7.14典型设计实例和建议

7.14.1典型设计

7.14.2设计建议

第8章多核并行设计

8.1并行粒度和并行级别

8.2并行方式

8.3任务类型

8.3.1相同任务的多个副本

8.3.2多个独立任务

8.3.3单个任务拆分成多个子任务

8.3.4多个松散耦合任务

8.3.5耦合度高的任务

8.4依赖关系

8.4.1数据依赖

8.4.2存储器依赖

8.5死锁和活锁

8.5.1死锁

8.5.2活锁

8.6同步

在线预览

第3章Cache缓存和数据一致性

与其他处理器一样,基于C66x内核的处理器也存在内核处理能力与存储器容量不匹配的问题。越靠近内核,存储器的通信带宽要求越高,但容量也就越小; 越远离内核,处理器容量越大,但带宽也就越小。C66x处理器内核使用寄存器,其用到的存储器从内到外依次是L1(L1P和L1D)、L2 SRAM、MSM SRAM(L3)、DDR3。如前所述,L1和L2位于C66x内核中,L3位于处理器中(C66x内核外面),DDR3位于处理器外。为了缓解处理器内核和外部存储器的矛盾,采用了Cache机制来实现外部数据在靠近处理器内核的存储器中保留一份拷贝,处理器内核经常与该数据拷贝交互数据,而不是直接和外部存储器交互数据。本章首先介绍了为什么使用Cache、Cache存储器结构概览、Cache基础知识,然后对C66x的各个Cache进行了详细介绍,并介绍了使用Cache、数据一致性、片上Debug支持和运行中改变Cache配置等内容,介绍了如何优化Cache性能和一些设计建议。3.1为什么使用Cache从DSP应用的角度,拥有一个大容量、快速的片上存储器是非常重要的。然而,处理器性能的提升比存储器发展的步伐更快,导致在内核与存储器速度间出现了一个性能缺口。越靠近内核内存速度越快,但容量也就越小。Cache的机制是基于位置原理设计的,在讲述Cache机制前先介绍一下位置原理。所谓位置原理,即假设如果一个存储器位置被引用,则其相同或相邻位置非常可能会很快又被引用。在一段时间内访问存储器的位置被指为时间位置,涉及相邻存储器的位置被指为空间位置。通过利用存储器访问位置原理,Cache缓存减少平均存储器访问时间。基于位置原理,在一小段时间内,通常一个程序从相同或相邻存储器位置重用数据。如果数据从一个慢速存储器映射到一个快速Cache存储器,在另一组数据替代前,尽可能经常访问Cache中的数据以提高数据访问效率。3.2C64x和C66x DSP之间的Cache区别对于使用过C64x内核的程序员来说,C66x内核Cache的概念与C64x内核中的相似,但也有很大不同。本节介绍C66x内核与C64x内核之间的Cache区别,主要有以下几点。1. 存储器尺寸和类型对于C66x器件,每个L1D和L1P在Cache之外实现SRAM。Cache的尺寸是用户配置的,可以被设置成4KB、8KB、16KB或32KB。可用的SRAM数量是器件相关的,并在器件特性数据手册中明确。而对于C64x器件,Cache被设计成尺寸为固定的16KB。C66x器件相对于C64x器件,L2的尺寸增加了。2. 写缓冲对于C66x器件,写缓冲的宽度增加到128位; 对于C64x器件,宽度是64位。3. Cache能力对于C66x器件,外部存储地址的Cache能力设置(通过MAR位)只影响L1D和L2 Cache缓存; 也就是说,到外部存储器地址的程序取指令(program fetch)总是被Cache缓存进来。不管Cache能力设置状况。这和C64x器件上的情况不一样,在C64x器件上Cache能力设置影响所有Cache,即L1P、L1D和L2。对于C66x器件,外部存储地址的Cache能力控制覆盖整个外部地址空间。对于C64x器件,外部存储地址的Cache能力控制只覆盖地址空间的一个子集。4. Snooping协议在C66x器件上的Snooping Cache一致性协议直接发送数据到L1D Cache和DMA。C64x器件通过invalid和writeback Cache Line来维持一致性。由于减少了由invalidate导致的Cache缺失开支,C66x Snooping机制更加有效。与C64x器件一样,Snoop协议在C66x器件中不维护L1P Cache和L2 SRAM之间的一致性,程序员负责维护其一致性。5. Cache一致性操作对于C66x器件,L2 Cache一致性操作总是操作在L1P和L1D,即使L2 Cache功能被禁用。这与C64x器件情况不同,其需要明确调用L1一致性操作。C66x器件支持一整套的区域和全局(Range and Global)L1D Cache一致性操作,而C64x器件只支持L1D区域invalidate和writebackinvalidate操作。在Cache尺寸上有改变,C66x器件在初始设置一个新尺寸前,自动writebackinvalidate Cache。而C64x器件需要执行一个完整的writebackinvalidate程序(虽然这些是被一部分CSL函数处理的)。对于C66x器件,L2 Cache不包括L1D和L1P,两者不相关。这意味着一个行从L2驱逐(evict),不会导致相应的行在L1P和L1D被驱逐。不相关的优势在于: 由于程序取指令导致的L2中的行分配不会从L1D Cache驱逐数据; 由于数据访问导致L2中的行分配不会从L1P驱逐程序代码,这减少Cache缓存缺失的数量。以下介绍C66x Cache存储器结构概览、Cache基础知识并详细介绍各级Cache。3.3Cache存储器结构概览C66x DSP存储器由内部两级基于Cache的存储器和外部存储器组成。L1P和L1D都可以被配置成SRAM和Cache,Cache较大可以达到32KB。所有Cache和数据路径自动被Cache控制器管理,如图3.1所示。1级存储器通过核访问,不需要阻塞。2级存储器可以被配置,并可被分成L2 SRAM和Cache。外部存储器可以为几MB大小。

图3.1C66x DSP Cache概览

C6678器件上电配置如下: 复位后L1P被配置为全为Cache,大小为32KB。复位后L1D被配置为全为Cache,大小为32KB。复位后L2全是SRAM,Cache的容量可以被配置为32KB、64KB、128KB、256KB或全为Cache。访问时间取决于接口和使用的存储器技术。3.4Cache基础知识通常, Cache可以分为直接映射Cache(directmapped Caches)和组相联Cache (setassociative Caches)两种类型。本节介绍Cache的一些基本知识。为了较好理解Cache机制,首先介绍几个Cache的基本概念。(1) Cache Line(Cache行): Cache处理的最小单位。Cache Line的尺寸要比内存存取的数据尺寸要大,一个行的大小为一个行尺寸(Line Size)。例如,C66x内核可以访问单个字节,而L1P Cache行尺寸为32B,L1D Cache行尺寸为64B,L2 Cache行尺寸为128B。但是,如果发生一次读失效,则Cache会将整条Cache Line的数据读入。(2) Line Frame(行帧): Cache中用于存储Cache Line的位置,包含被Cache的数据(1行)、一个关联的Tag地址和这一行的状态信息。这一行的状态信息包括是否Valid(有效)、Dirty(脏)和LRU状态。(3) Set(集): Line Frame的一个集合。直接映射的Cache中一个Set包含一个Line Frame,n路组相联的Cache每个Set包含n个Line Frame。(4) Tag(标签): Cache中被Cache的物理地址的高位作为一个Tag存储在Line Frame中,在决定Cache是否命中的时候,Cache控制器会查询Tag。(5) Valid(有效): 当Cache中的一个Line Frame保存了从下一级存储器取的数据,那么这个Line Frame的状态就是Valid的,否则,这个Line Frame的状态就是无效的(Valid = 0)。(6) Invalidate(失效): 是将Cache中标记为Valid的Line Frame状态标记为无效的过程,受影响的Cache Line内容被废弃。为了维持数据一致性,与writeback组合成writebackinvalidate,先将标记为Dirty的行写回到保存有这个地址的下一级存储器,再标记该行为无效状态。(7) Dirty(脏)和Clean(干净): 当一个Cache Line是Valid并包含更新后的数据,但还未更新到下一层更低的内存,则在Line Frame的Dirty位标志该Cache Line为脏的。一个Valid的Cache Line与下一层更低的内存一致,则Line Frame的Dirty位标志该Cache Line是Clean的(Dirty = 0)。(8) Hit(命中)和Miss(缺失): 当请求的内存地址的数据在Cache中,那么Tag匹配并且相应的Valid有效,则称为Hit,数据直接从Cache中取给DSP。相反,如果请求的内存地址的数据不在Cache中,Tag不匹配或相应的Valid无效,则称为Miss。(9) Victim Buffer(Victim缓冲): Cache中的一条Cache Line为新的Line腾出空间的过程称为驱逐(Evict),被驱逐的Cache Line被称为Victim(Line)。当Victim Line是Dirty的时,为了保持数据一致性,数据必须写回到下一级存储器中。Victim Buffer保存Vitim直到它们被写回到下一级存储器中。(10) Miss Pipelining(缺失流水): 对连续的缺失进行流水操作,提高对缺失处理的效率,降低阻塞(Stall)周期。(11) Touch: 对一个给定地址的存储器操作,被称为Touch那个地址。Touch也可以指的是读数组元素或存储器地址的其他范围,目的是分配它们到一个特定级别Cache中。一个内核中心循环用作Touch一个范围的内存,是为了分配它到Cache中,经常被称为一个Touch循环。Touch一个数组是软件控制预取数据的一种形式。3.4.1直接映射Cache——L1P Cache直接映射Cache的工作原理可以参照C66x L1P Cache。任何时候内核访问L2 SRAM或外部空间中的指令,指令都被调入L1P Cache。1. 读缺失如果一个程序从地址0020h取出,假设那个Cache是无效的,意味着Cache中没有Cache Line包含该数据的缓存,这就是一个读缺失。一个行帧的有效状态被Valid (V)位指示: Valid位为0表示相应的Cache Line是无效的,也就是说,不包含被Cache缓存的数据。当核请求读地址0020h, Cache控制器把这个地址分为三块(Tag、Set和Offset),如图3.2所示。

图3.2地址分块

Set部分(bits 13~5)指示地址映射到哪一个Set (如果是直接映射Cache,一个Set等于一个行帧)。对于地址0020h,Set部分检测为1。然后控制器检测Tag (bits 31~14)和Valid位。由于我们假设Valid位为0,控制器寄存器是一个缺失,也就是说被请求的地址没有包含在Cache中。一个缺失也意味着: 为了容纳请求地址的行,一个行帧会被分配。然后控制器从存储器取行(0020h~0039h),并存数据到行帧1。地址的Tag部分存储在Tag RAM中,Valid位变成1用以指示该Set包含有效数据。取出的数据同时也发送给核,访问结束。一个地址的Tag部分之所以必须被存储,这是因为当地址0020h再次被访问时会更清楚该地址已经被Cache缓存。2. 读命中Cache控制器把地址分割为三个部分: Tag、Set和Offset,如图3.2所示。Set部分决定地址映射到哪一个Set; 存储的Tag部分用于与请求的地址Tag部分比较。这个比较是必要的,因为存储器中多个行映射同一Set,通过Tag可以判断出请求的地址是否映射到Cache中。如果访问地址4020h也映射到同一个Set,Tag部分会不同,因而访问会是一个缺失。如果地址0020h被访问,Tag比较为真且Valid位为1,那么控制器寄存器为一个命中,并发送Cache Line中的数据到核,该访问结束。3.4.2Cache缺失的类型在组相联被讨论之前,好理解不同类型的Cache缺失。Cache较大的目的是减少平均存储器访问时间。从存储器到Cache取一个行帧的数据,对于每个缺失,都会有损失。因而,对于最常使用的Cache Line,在被其他行替换前,要尽可能多地重复使用。这样一来,初始损失影响最小且平均存储器访问时间变得最短。Cache使用相同行帧来存储冲突的Cache Line,替换一个行帧将导致从Cache中驱逐另一个行帧。如果后续驱逐的行帧又被访问,那么访问会缺失且这个行帧必须再次从低速存储器取出。因而,只要一个行帧还会被使用,应避免它被驱逐。1. 冲突和容量缺失一个Set对应的数据已经被Cache缓冲,随后同一个Set的其他存储器位置被访问,就会由于冲突导致驱逐,这个类型的缺失被称为冲突缺失。一个冲突缺失的产生是因为一个Cache Line在它被使用前因为冲突被驱逐,更深层次的原因可能是因为Cache容量被耗尽,从而导致冲突发生。如果Cache容量被耗尽,当缺失发生时,Cache中的所有行帧被分配,这就是一个容量缺失。如果一个数据组超过重用Cache容量,容量缺失发生。当容量耗尽,新行访问从数组开始逐步替代旧行。确认一个缺失的原因有助于选择相应措施避免缺失。冲突缺失意味着数据访问合乎Cache大小,但是Cache Line因为冲突被驱逐。在这种情况下,我们可能需要改变存储器布局,以便数据访问被分配到存储器中Cache没有冲突的地址中。或者,从硬件设计上,我们可以创建多个Set保持两个或更多行。因而,存储器的两个行映射到相同Set可以都被保持在Cache中,相互不驱逐。这就是组相联的Cache。为了避免容量缺失,需要减少一次操作数据的数量。2. 强制性缺失第三类缺失是强制性缺失或首次引用缺失。当数据及时次传入,在Cache中没有该数据的缓存,因而肯定发生该类型Cache缺失。与其他两种缺失不同,这种缺失不刻意避免,因而是强制的。3.4.3组相联Cache组相联Cache具有多路Cache以减少冲突缺失的可能性。C66x L1D Cache是一个2路组相联的Cache,具有4KB、8KB、16KB或32KB容量,并且Cache行尺寸为64字节。L1D Cache的特点在表3.1中描述。表3.2提供了L1D缺失阻塞特征。

表3.1L1D Cache特点

特征C66x DSPC64x DSP组织2路组相联2路组相联协议读分配Read Allocate, Writeback读分配Read Allocate, Writeback内核访问时间1周期1周期容量4KB、8KB、16KB或32KB16KB行尺寸64字节64字节替换策略最近经常使用(LRU)最近最少使用(LRU)写缓冲4 × 128位4 × 64位外部存储器容量可配置可配置

表3.2L1D缺失阻塞特征

参数L2类型0 WaitState, 2×128bit Banks1 WaitState, 4×128bit Banks

L2 SRAML2 CacheL2 SRAML2 Cache

单个读缺失10.512.512.514.52并行读缺失(流水)10.5 412.5 812.5 414.5 8M连续的读缺失(流水)10.5 3×(M-1)12.5 7×(M-1)12.5 3×(M-1)14.5 7×(M-1)M连续的并行读缺失(流水)10.5 4×(M/2-1) 3×M/212.5 8×(M/2-1) 7×M/212.5 4×(M-1)14.5 8×(M/2-1) 7×M/2在读缺失时Victim缓冲清空破坏缺失流水较大11个周期阻塞破坏缺失流水较大11个周期阻塞破坏缺失流水较大10个周期阻塞破坏缺失流水较大10个周期阻塞

写缓冲流出速度2周期/条目6周期/条目2周期/条目6周期/条目

与直接映射Cache相比,2路组相联Cache的每个Set由两个行帧组成: 一个行帧在路0; 另一个行帧在路1。存储器中的一条Cache Line仍然映射一个Set,不过现在可以存入两个行帧中的任一条。从这个意义上讲,一个直接映射的Cache也可以被看成一个1路Cache。组相联的Cache架构如图3.3所示。与直接映射类似,除了两个Tag比较不一样(组相联的Cache中多路都进行Tag比较),Cache命中和缺失的机理相似。

图3.3组相联Cache架构

1. 读缺失如果两路都为读缺失,数据首先从存储器被取出。LRU(Least Recently Used)位决定Cache行帧被分配在哪一路中。每个Set有一个LRU位,可以被认为是一个开关。如果LRU位是0,行帧在路0被分配; 如果LRU位是1,行帧在路1被分配。任何时候只要存在一个到该行帧的访问,LRU的状态位就被改变。当一路被访问,LRU位总是切换到相反的路,为的是保护最近使用的行帧不被驱逐。基于位置原理,最近最少使用原则(LRU)被用来在同一Set里选择一个行帧作为被驱逐的行,用于保存新的Cache数据。2. 写缺失L1D是一个读分配的Cache,意味着在读缺失时一个行帧被分配到Cache。在一个写缺失时,数据通过一个写缓冲被写到更低级存储器,不会因此而产生新的L1D Cache关系。写缓冲有4个条目(entry),在C66x器件中每个entry是128位宽。3. 读命中如果在路0有一个读命中,该行帧的数据在路0被访问; 如果在路1有一个读命中,该行帧的数据在路1被访问。4. 写命中在一个写命中活动中,数据被写到Cache,但是不是立即传递到更低的存储器。这种类型的Cache被称为写回writeback Cache,因为数据被一个内核的写访问修改并且在之后被写回到存储器。为了写回被修改的数据,哪一行被核写回必须清楚。为了实现这个目的,每条Cache Line具有一个Dirty位和它相关。最初,Dirty位是0。只要核写到一个被Cache的行,相应的Dirty位被设置。因为读缺失冲突,当Dirty的行需要被驱逐,它会被写回到存储器。如果那一行没有被修改(Clean Line),它的内容被丢弃。例如,假设行在Set 0,路0被内核写,LRU位指示在下一个缺失时路0将会被替换; 如果内核当前产生一个到存储器位置映射到Set 0的地址的读访问,当前的Dirty行首先写回到存储器,随后新数据被存储到这个行帧。一个写回可能被程序发起,通过发送一个写回命令到Cache控制器。3.4.4二级Cache如果在存储器尺寸和访问时间上,Cache和主存储器之间有较大差别,二级Cache被引进用于减少更多存储器访问数量。二级Cache基本操作方式与1级Cache相同; 然而, 2级Cache在容量上更大。1级和2级Cache相互作用如下: 一个地址在L1缺失就传给L2处理; L2使用相同的Valid位和Tag比较来决定被请求的地址是否在L2 Cache。L1命中直接从L1 Cache得到服务,并不需要牵涉L2 Cache。与L1P和L1D一样,L2存储空间可以被分成一个可寻址的内部存储器(L2 SRAM)和一个Cache (L2 Cache)部分。与L1 Cache只有读分配(read allocate)不一样,L2 Cache是读分配和写分配(write allocate)的Cache。L2 Cache只被用来Cache缓存外部存储器地址,然而,L1P和L1D被用于Cache缓存L2存储器和外部存储器地址。L2 Cache特征概述如表3.3所示。

表3.3L2 Cache特征

特征C66x DSPC64x DSP

组织方式4路组相联4路组相联协议读分配和写分配读分配和写分配写回写回容量32KB、64KB、128KB或256KB32KB、64KB、128KB或256KB行尺寸128B128B替换策略最近使用(LRU)最近最少使用(LRU)外部存储器容量可配置可配置

1. 读缺失和读命中考虑一个内核读请求的场景,即访问可被Cache缓存的外部存储器地址,而Cache在L1缺失(可能是L1P或L1D)。如果地址也在L2 Cache缺失,相应的行会引入L2 Cache。LRU位决定了哪路行帧被分配到其中。如果行帧包含Dirty数据,在新行被取出前,首先会写回到外部存储器(如果这一行的数据也包含在L1D,在L2 Cache Line被发送给外部存储器前,首先会写回到L2。为保持Cache一致性,这个操作是需要的)。近期分配的一行形成一个L1 Line并包含请求的地址,然后传送给L1。L1在其Cache存储器中存储该行,并发送请求的数据到内核。如果在L1中新行替换一个Dirty行,它的内容首先写回到L2。如果地址是一个L2命中,相应的行直接从L2传到L1 Cache。2. 写缺失和写命中如果一个核写请求到一个外部存储器地址在L1D中缺失,它将被通过写缓冲传送给L2。如果对于这个地址L2检测到一个缺失,相应的L2 Cache Line被从外部存储器取出,被用内核写操作修改并被存入分配的行帧中。LRU位决定哪路行帧用于分配给新数据。如果行帧包含Dirty数据,它会在新行取出前首先被写回到外部存储器。注意新行没有存储进L1D,因为它只是一个readallocate Cache。如果地址是一个L2命中,相应的L2 Cache Line直接更新为核写的数据。3. 外部存储地址Cache能力L2 SRAM地址总是Cache缓存进L1P和L1D,然而,默认状态下,外部存储地址在L1D和L2 Cache中,被分配为不可Cache缓存的。因此,Cache能力必须首先被用户明确使能。注意L1P Cache是不被配置影响的,并且总是Cache缓存外部存储器地址。如果地址是不可Cache缓存的,任何存储器访问(数据访问或程序取)无须分配行到L1D或L2 Cache。3.5L1P CacheC66x内核中L1P与L1D上电后默认全为Cache,与L1D Cache不同的是L1P Cache为直接映射Cache。本节描述L1P Cache的相关知识。3.5.1L1P存储器和CacheL1P存储器和Cache的目的就是较大化程序执行效率。L1P Cache的可配置性为系统设计提供了灵活性。L1P Cache的特点为: L1P Cache可配置成0KB、4KB、8KB和32KB,存储器保护可配置,Cache块和全局一致性操作可配置。L1P存储器支持较大128KB的RAM空间(具体参见器件配置情况)。L1P存储器不能被同一个核内的L1D、L1P和L2 Cache缓存。L1P只能被EDMA和IDMA写,不能被DSP存储写入。L1P可以被EDMA、IDMA和DSP访问读取。L1P存储器较大的等待状态为3周期,等待周期不能被软件配置,这是由具体器件决定的。L1P存储器等待状态通常为0个周期。为了在一个较高的时钟频率取程序代码并维持一个较大的系统空间,L1P Cache是很有必要的,并可以把部分或全部的L1P都作为Cache。从L1P存储器地址映射的最顶端开始,采用自顶向下的顺序,L1P把存储器转换为Cache。较高地址的L1P存储器首先被Cache缓存。用户可以通过寄存器控制L1P Cache的操作。表3.4列出了这些寄存器概要。

表3.4L1P Cache寄存器概要

地址缩略词寄存器描述

0184 0020hL1PCFGL1程序配置寄存器0184 0024hL1PCCL1程序Cache控制寄存器0184 4020hL1PIBARL1程序无效基址寄存器0184 4024hL1PIWCL1程序无效计数(字)寄存器0184 5028hL1PINVL1程序无效寄存器

3.5.2L1P Cache结构L1P Cache是直接映射的Cache,意味着系统中每个物理存储位置都在Cache中有一个可能归属的位置。当DSP想取一段代码,DSP首先要检

免责声明

更多相关图书
在线咨询