缓存利用软件程序的时间局部性和空间局部性,将空间巨大的存储器中的数据动态映射到容量有限的缓存空间中。这可以将访问存储器的平均延迟最小化。由于缓存的容量是有限的,因此访问缓存存在着相当大的不确定性。 一旦缓存不命中,则需要从外部存储器中存取数据,从而造成较长的延迟。 在对实时性要求高的场景中,处理器的反应速度必须有最可靠的实时性。 如果使用了缓存就无法保证这一点,大多数极低功耗处理器应用于实时性较高的场景,因此常用延迟确定的指令紧密耦合存储器ITCM或者数据紧密耦合存储器DTCM。
使用缓存,将面积和功耗大。
存储器
冯诺依曼提出的计算机体系结构模型,计算机必须具备输入设备,输出设备,存储器,运算器,控制器。运算器和控制器属于处理器核。 他们的运行指令和所需要的数据都必须来自存储器。
冯诺依曼体系结构也称普林斯顿体系结构,是一种将指令存储器和数据存储器合并在一起的计算机体系结构。程序的指令存储地址和数据存储地址指向同一个存储器的不同物理位置。
哈佛结构是一种将指令存储器和数据存储器分开的计算机体系结构。
哈佛结构的特点:
将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编码,独立访问。
与两个存储器相对应的是两条独立的指令总线和数据总线,这种分离的总线使处理器可以在一个时钟周期内同时获得指令字(来自指令存储器)和操作数(来自数据存储器),从而提高了执行速度 和数据的吞吐量。
由于指令和数据存储在两个分开的物理空间中,因此取址和执行能完全并行。
从软件的程序角度,程序的指令存储地址和数据存储地址指向地址空间的不同物理地址,符合冯诺依曼体系结构。
从硬件实现角度,现代处理器的设计会配备专用的一级指令缓存和一级数据缓存,符合哈佛结构体系。
冯诺依曼体系和哈佛体系结构,只需要明白两者的优缺点,灵活的加以运用即可。
ICTM和DTCM
保证实时性。 ITCM和DTCM被映射到不同的地址空间,处理器使用明确的地址映射方式访问ITCM和DTCM。由于ITCM和DTCM不采用缓存机制,因此其访问的延迟是明确可知的。
能够满足软件需求,使用几兆字节的ITCM/DTCM 便可以满足其需求。
面积功耗小。
RISC-V架构对于存储器访问指令的简化
无地址自增自减模式
仅支持小端格式 小端模式: 是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
无一次写多个数据和一次读多个数据的指令
RISC-V存储器指令
存储器读和写指令
RISC-V架构使用专用的存储器读load和存储器写store指令访问存储器。
推荐使用地址对齐的存储器读写指令。
fence指令和fence.i指令
RISC-V架构采用松散存储器模型。 松散存储器模型对于访问不同地址的存储器读写指令的执行顺序没有要求,除非使用明确的存储器屏障指令。
fence和fence.i两条存储器屏障指令,用于强制指定存储器访问的顺序。
在程序中,添加一条fence指令,则在fence之前的所有指令的访存结果必须比在fence之后的所有指令的访存结果先被观测到。
添加一条fence.i指令,则在fence.i之后所有指令的取指令操作一个能够观测到在fence.i之前所有指令的访存结果。
A扩展指令集
定义了一种扩展指令集-A指令集。 主要用于在多线程情形下访问存储器的原子操作或同步操作。
原子存储器操作AMO指令。
load-reserved 和store-conditional指令
存储器子系统的硬件实现
AGU: 负责读和写指令,以及为A扩展指令集生成存储器访问地址。
LSU:作为存储器访问的控制模块
DTCM:存储器子系统的数据存储部件
ITCM:作为存储器子系统的指令存储部件,能够用于存储数据以及读和写的指令访问。
AGU
地址生成模块
负责读和写指令,以及为A扩展指令集生成存储器访问地址。
AGU为ALU的一个子单元。
读写指令需要将第一个寄存器索引的源操作数和符号位扩展的立即数相加得到最终的访存地址,加法器复用ALU加法器。
RISC-V对于地址不对齐的读和写指令,可以使用硬件支持,也可以通过异常服务程序采用软件支持。蜂鸟E203采用软件判断。 AGU对生成的访存地址进行判断,过过地址没有对齐,则产生异常标志。通过ALU将异常标志传送给交付模块,交付模块则根据此产生异常。
如果没有产生异常的读和写指令,则通过AGU的ICB接口发送给LSU模块。如果产生了异常的读和写指令,则不会发送给LSU模块。
LSU
Load store unit 是存储器子系统的主要控制单元。
LSU有两组输入的BIU接口,分别来自AGU和NICE协处理器。有三组输出ICB接口,分别分发给BIU,DTCM,ITCM。另外LSU通过写回接口将结果写回。
两组输入ICB由ICB汇合模块汇合成一组ICB,采用的仲裁机制是优先级仲裁,NICE总线具有更高的优先级。
经过汇合的ICB通过命令通道的地址进行判断,通过其访问的地址区间产生分发信息,然后使用一个ICB分发模块将其分发给不同的存储器组件的ICB接口。(包括BIU ITCM DTCM)
LSU使用到的ICB汇合模块和ICB分发模块的FIFO缓存深度默认为1.这意味着LSU默认支持一个滞外交易,减少面积开销。
访问不通过存储器组件BIU ITCM DTCM可能会造成存储器访问错误。这个错误可以通过ICB反馈通道返回标志得到,如果出现此错误,则产生异常标志,通过LSU的写回接口传送给交付模块。交付模块据此产生异常。
ITCM和DTCM
配置了专用的ITCM数据宽度为64位和DTCM数据宽度为32位。
蜂鸟E203通过专用的总线访问ITCM和DTCM。
ITCM有一组输入ICB接口来自LSU。 ITCM所在的地址区间同样能够通过LSU被读和写访问,用于存储数据。 这个角度来看属于冯诺依曼体系。
ITCM存储器主体由一块数据宽度为64位的单口SRAM组成。
采用64位。首先,使用宽度为64位的SRAM在物理大小上比32位SRAM面积更加紧凑。同样容量下,644位比32位占用面积更小。
其次在程序执行时大多数情况下按顺序取指令,而64位宽的ITCM可以一次取出64位的指令流,只读一次64位宽的SRAM可以降低动态功耗。
ITCM所在地址区间同样能够通过LSU被load和store指令访问到,从而用于存储数据。
另外ITCM还有两组输入ICB接口。数据宽度为64位的IFU访问访问接口和数据宽度为32位的ITCM外部访问接口。外部访问接口是专门为ITCM配备的外部接口便于SOC的其他模块访问。
由于ITCM为64位。32位的接口需要经过位宽转换。
3组输入的ICB接口汇合成一组icb接口,采用优先级仲裁,IFU总线具有最高优先级,LSU次之,外部接口访问最低。
汇合之后的ICB命令通道简单处理可以作为ITCM的SRAM的接口,同时寄存此操作的来源信息,把寄存的信息指示SRAM把返回的数据分发给IFU、LSU、ITCM访问接口的反馈通道。
DTCM存储器数据位宽为32位的单口SRAM组成。有两组输入ICB接口,NICE协处理器接口和DTCM外部访问接口。优先级仲裁,LSU总线有更高的优先级。
A扩展指令集
load-reserved 和store-conditional指令
在LSU中设置里互斥检测器。
互斥检测器仅记录蜂鸟E203单核对于存储器空间的访问,在多核系统中,无法有效。
互斥检测器只能够在单核独自访问存储器时保证程序执行load-reserved 和store-conditional指令的结果正确性。
amo指令 原子存储器操作
如果存储器操作为所有core(线程)知道,那就称为原子性(Atomic)共享存储器访问操作。原子指令虽然不是一种同步操作,但能够使各线程可以同步的访问存储器。
1 拆分出一个存储器读操作,等待读数据返回将数据寄存
2 对寄存的数据进行相应的算术运算,将运算结果寄存在电路
3 发起一个存储器写操作,将寄存的运算结果写入存储器,等待反馈结果返回。
4 如果在此过程中,发生存储器访问错误,则将寄存的读操作返回的数据写回该指令的结果寄存器。
fence和fence.i
在流水线的派遣点,派遣fence和fence.i指令之前必须等待所有已经滞外的指令均执行完毕。
只需等待所有所有滞外指令均执行完毕,意味着所有访存操作均已完成。
BIU
BIU bus interface unit 总线接口单元。蜂鸟E203存储器可以通过BIU访问外部存储器。
ECC
使用ECC算法对SRAM进行保护。