CCM是Closely coupled memories的缩写,中文名称是紧耦合存储器,哈佛架构下,一般有两种CCM,分别是ICCM和DCCM, ICCM主要用来存储指令和数据,DCCM仅用来存储数据。一般中低端MCU没有提供多级Cache,兼之指令和数据规模较小,会配备CCM存储器,多用于高可靠,高世实时场合。而高性能AP级处理器一般提供了多级CACHE减少存储访问的Latency,不采用CCM的方式。
比如ARM的TCM(Tightly Coupled Memory)就是一种CCM,它加速了核心对指令和数据的访问速度,通常一拍就可以拿到数据:
CCM和Cache的区别
CCM和CACHE在物理上都是一个片上RAM,由SRAM实现,可以实现在一个时钟周期读取其中存储内容(指令,数据)。但是不能将CCM和Cache之间画等号,Cache是影子内存,是不可以寻址的,Cacheline没有一个固定的地址,而CCM不同,CCM本质上是一个可寻址的片上存储器,每个存储单元有一个独立无二的地址,而且CCM也没有Cache中的替换问题。
打一个不太恰当的比喻,CCM是商品房,70年产权,有产权证,可以落户,而CACHE则是公租房,没有产权,不能继承,只能作为临时委身之所。
OR1200验证CCM
OR1200是一款成熟的32位RSIC软核处理器,其上的QMEM(Quick memory)就是一种CCM(CCM有很多马甲,比如ARM中的TCM,GPU中的 Scraptch Pad, 某些RISCV处理器中的ILM/DLM(Instruction/Data Local Memory,指令/数据本地存储器).OR1200是开源的,可以对它的RTL代码进行仿真分析CCM的实现细节。
QMEM在OR1200中的位置:
顺便多嘴提一句,根据上面OR1200的设计框图可以看出,I/D Cache是PIPT类型的,使用物理地址作为TAG和INDEX的索引。
TLB访问和CACHE访问孰先孰后
抛开具体的OR1200不谈,通用CPU架构设计中,两种顺序都有可能,如果CACHE位于TLB和CPU中间,比如核内的L1 CACHE,是先访问CACHE,CACHE不命中,才访问TLB,此时访问CACHE使用的是虚拟地址,被称为逻辑CACHE,L1 CACHE一般是VIVT的实现。反之,如果TLB位于Cache和CPU中间,如上图,这个时候先访问TLB,得到物理地址,然后用物理地址访问CACHE,这种情况被叫做物理CACHE,一般是PIPT或者VIPT。
Logic Cache && Physical Cache:
Cache分级
依据和CPU距离的不同,Cache可以有多级结构,可以类比与人的短期记忆和长期记忆,L1相当于人类大脑的短期记忆,查找速度快,但是容量小,很容易被新记忆覆盖。而L_N代表长期记忆,减速速度慢,但是容量大,可以记住很多很多的事情。
QMEM内部的实现细节
RTL仿真
对应指令文件,可以看到处理器从0x100地址启动,之后每拍都会返回一条指令。
QMEM本身作为指令存储使用,每条指令都有一个固定的地址, 通过一个RAM子模块实现:
QMEM内部SRAM的仿真:
CPU送到总线上的地址0x100为字节地址,QMEM SRAM识别的是DWORD地址,所以从SRAM上看到的地址为0x40,也是每拍打出一个数据(addr信号和doq信号).
读出来的6条指令和汇编指令吻合:
参考资料
https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24593.pdf
L1 Cache architecture in ARM-CSDN博客
http://aturing.umcs.maine.edu/~meadow/courses/cos335/COA04.pdf
https://www3.yildiz.edu.tr/~naydin/CAr/LECTURES/PDF/CAr-13.pdf
TCM(Tightly Coupled Memory)紧耦合存储器前身 - 知乎