KeyStone I DSP[C665x 与 C6678] 视频教程 熊谷辉 广州创龙电子科技有限公司
演示环境 开发套件 TL665x-EasyEVM + SOM-TL665x[DSP C6655/57] TL6678-EasyEVM + SOM-TL6678[DSP C6678] 仿真器 TL-XDS560v2 开发环境 CCSv5[5.5] CCSv6[6.2] 相关产品 FPGA 板卡 TL-A7HSAD[Xilinx Artix 7] TL-K7FMC[Xilinx Kintex 7] DSP + FPGA 板卡 核心板 SOM-TL665xF[DSP C6655/57 + Xilinx Artix 7] 开发板 TL665xF-EasyEVM
C66x DSP 内存、内存保护与地址扩展(MPAX)、缓存与预取
内存 资料来源于 TI 文档
存储器类型 大小 TMS320C665x TMS320C6678 L1P程序存储器 32KB L1D数据存储器 L2存储器 1024KB 内存 存储器类型 大小 TMS320C665x TMS320C6678 L1P程序存储器 32KB L1D数据存储器 L2存储器 1024KB 512KB MSMC多核共享内存 1MB 4MB DDR存储器 最大8GB 资料来源于 TI 文档
C665x 内存映射 - C665x Core0 Core1 L1,L2 L1,L2 资料来源于 TI 文档 DSP 本地内存映射 SOC 全局内存映射 资料来源于 TI 文档
内存映射 - C6678 C6678 DSP 本地内存映射 SOC 全局内存映射 SOC 全局内存映射 资料来源于 TI 文档
复位后内存映射图 MPAX提供地址扩展/转换功能,将32位的逻辑地址映射到36位物理地址上。 资料来源于 TI 文档
MPAX应用案例 资料来源于 TI 文档
MPAX段寄存器 资料来源于 TI 文档
MPAX段寄存器 - PERM PERM域内容 资料来源于 TI 文档
MPAX段寄存器 - SEGSZ SEGSZ域内容 资料来源于 TI 文档
BADDR(20-bit):逻辑基地址,需要把32位的逻辑地址的高20位写到该域,低12位默认为0。 MPAX段寄存器 - BADDR、RADDR BADDR(20-bit):逻辑基地址,需要把32位的逻辑地址的高20位写到该域,低12位默认为0。 RADDR(24-bit):物理基地址(替换地址),需要把映射的36位物理地址的高24位写到该域,低12位默认为0。 资料来源于 TI 文档
BADDR=A0000h; RADDR=0C0000; Size=1MB MPAX使用举例 1MB A0000000 A00FFFFF BADDR=A0000h; RADDR=0C0000; Size=1MB Segment2 0:0C000000 0:0C0FFFFF XMPAXH2[BADDR] = 0xA0000 XMPAXH2[SEGSZ] = 0x13 XMPAXL2[RADDR] = 0x0C0000 XMPAXL2[PERM] = 0x3F 资料来源于 TI 文档
C66x Cache Memory 架构 缓存 描述 替换策略 可缓存性 访问时间 大小 Cache Line L1 Program 程序 直接映射(Direct Mapped) 读分配(Read Allocate) 总是缓存 1 Cycle 4K / 8K / 16K / 32K 字节 32 字节 L1 Data 数据 2 路组相关(Set Associative) 回写(Write Back) 最近最少使用(Least Recently Used (LRU)) 可配置 64 字节 L2 程序及数据 4 路组相关(Set Associative) 读写分配(Read & Write Allocate) 32K / 64K / 128K / 256K / 512K / 1024K 字节 (C665x L2最大1024K,C6678 L2最大512K) 128字节 Allocation The process of finding a location in the cache to store newly cached data. This process can include evicting data that is presently in the cache to make room for the new data. Direct-mapped cache A direct-mapped cache maps each address in the lower-level memory to a single location in the cache. Multiple locations may map to the same location in the cache. This is in contrast to a multi-way set-associative cache, which selects a place for the data from a set of locations in the cache. A direct-mapped cache can be considered a single-way set-associative cache. Read allocate A read-allocate cache only allocates space in the cache on a read miss. A write miss does not cause an allocation to occur unless the cache is also a write-allocate cache. For caches that do not write allocate, the write data would be passed on to the next lower-level cache.
缓存初始化 缓存大小 L1 Program L1 Data L2 可缓存性 配置 MAR
CSL SYS/BIOS 缓存大小配置 #include “csl_cache.h” CACHE_setL1PSize(CACHE_L1_32KCACHE); CACHE_setL1DSize(CACHE_L1_32KCACHE); CACHE_setL2Size(CACHE_512KCACHE); SYS/BIOS #include <ti/sysbios/family/c66/Cache.h> Cache_Size cacheSize; cacheSize.l1pSize = Cache_L1Size_32K; cacheSize.l1dSize = Cache_L1Size_32K; cacheSize.l2Size = Cache_L2Size_512K; Cache_setSize(&cacheSize); 缓存大小配置
CSL SYS/BIOS 内存可缓存性配置 #include "cslr_cgem.h" #include "cslr_device.h" for(i = 128; i < 131; i++) { C66xCorePacRegs->MAR[i] = 1 | (1 << CSL_CGEM_MAR0_PFX_SHIFT); } SYS/BIOS #include <ti/sysbios/family/c66/Cache.h> Cache_setMar((Ptr *)0x80000000, 0x40000000, Cache_Mar_ENABLE; 内存可缓存性配置
内存可缓存性配置 MARn TMS320C66x DSP CorePac User Guide
CSL SYS/BIOS 软件维护缓存一致性 #include "dspcache.h" CACHE_invAllL1d (CACHE_Wait wait); CACHE_wbAllL1d (CACHE_Wait wait); CACHE_wbInvAllL1d (CACHE_Wait wait); CACHE_invL1d (void* blockPtr, Uint32 byteCnt, CACHE_Wait wait); CACHE_wbL1d (void* blockPtr, Uint32 byteCnt, CACHE_Wait wait); CACHE_wbInvL1d (void* blockPtr, Uint32 byteCnt, CACHE_Wait wait); SYS/BIOS #include <ti/sysbios/family/c64p/Cache.h> Cache_inv(Ptr blockPtr, SizeT byteCnt, Bits16 type, Bool wait); Cache_invL1pAll(); Cache_wb(Ptr blockPtr, SizeT byteCnt, Bits16 type, Bool wait); Cache_wbAll(); Cache_wbInv(Ptr blockPtr, SizeT byteCnt, Bits16 type, Bool wait); Cache_wbInvAll(); 软件维护缓存一致性 CACHE_invAllL1p (CACHE_Wait wait); CACHE_invL1p (void* blockPtr, Uint32 byteCnt, CACHE_Wait wait); CACHE_invAllL2 (CACHE_Wait wait); CACHE_wbAllL2 (CACHE_Wait wait); CACHE_wbInvAllL2 (CACHE_Wait wait); CACHE_invL2 (void* blockPtr, Uint32 byteCnt, CACHE_Wait wait); CACHE_wbL2 (void* blockPtr, Uint32 byteCnt, CACHE_Wait wait); CACHE_wbInvL2 (void* blockPtr, Uint32 byteCnt, CACHE_Wait wait);
预取缓冲可以减少缓存读缺失(miss),从而减少阻塞周期,提高存储器的读性能。 数据预取缓冲:8个槽(slot),每个槽包含128字节。还具有12个候选缓冲槽。 数据预取过程: 检测到有效的预取请求 根据L1D或者L2的数据请求,在流检测过滤器(候选缓冲)中进行比较 当检测到匹配条目时,过滤器为流在预取缓冲中分配一个新的槽,同时为这个槽进行数据预取 当检测不匹配时,将会放弃当前候选缓冲的槽,对下一个候选缓冲槽操作。 程序预取缓冲:4个槽(slot),每个槽包含32字节。程序预取缓冲是一个简单的预取引擎,可以直接对L1P和L2的程序读请求进行预取。 C66x ISA 比 C674x ISA 增强了复数操作指令和 SIMD 指令
DSP1从“ping”中读取1024字节,这将会触发预取。 DSP0写1024字节到“pong” DSP1从“pong”读取1024字节 预取一致性问题(例子) 与缓冲一致性问题类似,当DSP与另一个主设备同时操作可预取的内存空间时,就可能会导致一致性问题,例如在MSMC中的一个ping-pong缓冲,两个DSP同时操作的情况: DSP0 DSP1 DSP0写1024字节到“ping” DSP0中断DSP1 DSP1从“ping”中读取1024字节,这将会触发预取。 DSP0写1024字节到“pong” DSP1从“pong”读取1024字节 Cache Cache 预取 预取 ping pong MSMC 步骤6中DSP1读取的数据有可能会因为预取一致性问题而存在部分错误数据。 C66x ISA 比 C674x ISA 增强了复数操作指令和 SIMD 指令
将两个共享区域分开,例如前面将“ping”和“pong”两个共享区域分开放不同位置 预取一致性问题 - 解决办法 禁用预取,设置MARn的第3位 将两个共享区域分开,例如前面将“ping”和“pong”两个共享区域分开放不同位置 读取前使用XPFCMD.INV失效预取缓冲 MARn C66x ISA 比 C674x ISA 增强了复数操作指令和 SIMD 指令
O(∩_∩)O~ KeyStone I DSP [C665x 与 C6678] 视频教程 广州创龙电子科技有限公司