前言
移植ddr时读到的ddr工作原理和时序分析,来自哔哩哔哩,原视频讲的很棒现在整理为文字
https://www.bilibili.com/read/cv11825095/
ddr工作原理
每个内存的存储单元都有一个晶体管和一个电容组成,栅极就是一个阀门,只要给栅极施加电压阀门就会开启,源级和漏极之间就会通过电流,漏极连接了一个容值非常小的电容,可以吧这个电容当做电池,容量非常小冲放速度非常快,通常30fF(飞法)左右,充电时间只有几纳秒,电容有电代表是二进制的1,没有电则表示0,每个单元的充放电就是写入或者读取
控制栅极的线叫行线,控制源极的线叫列线
先看存储阵列,把这些单元按照矩阵的方式排列,就组成了存储阵列,类似矩阵键盘,想要对某个单元进行操作,首先就需要先寻址,寻址的过程就是先找到栅极的行线
然后再找到控制源极的线就是这个列
定位到行之后,每个单元就是其中的一列,每个存储单元里只有1或0的数据,这就是一个比特(所以列线也叫比特线)
把这些最小的存储单元都做到一起,就是内存颗粒,比如常见的DDR4有65536行1024列,比如四个阵列组成一个bank,四个bank组成一个bank group,两个bank group在组成一个颗粒 ,8个颗粒或者16个颗粒组成电脑的内存条,和我们嵌入式常用的ddr大同小异
芯片里还有很多外围控制电路,包括有行地址的行解码器,行列输入缓冲器,写驱动器等等,对性能和稳定性的影响非常关键,
知道了原理再开始理解时序
首先要说明时序里的数值,指的是时钟周期,比如CL等于16就是相当于这个脉冲要经过16个周期,第一时序包括CL,RCD,RP,RAS,对于这些缩写的名词,可以先参考完整工作周期的示意图,不同颜色的箭头对应第一时序里的参数
每个工作周期最开始就是要进行行地址的激活,也就是要告诉存储单元,你的栅极要打开,行地址激活后接着要激活列地址好给存储单元里写入或者读取数据,这之间需要一个行列转换的延迟,实际在DDR4内存里面行列地址的译码器是公用的,只是用一个标记说民在某个是时钟里传输的是行地址还是列地址,转换这个标记也需要延迟,列地址激活后,还有个列地址读出数据到IO接口的间隔时间,这就是CL。完整叫法是列地址脉冲延迟,经过这个延迟后才能读取或者写入数据,在存储单元中,写入数据就是给比特线施加一个电压,让电容充电,如果写入的是0就不加这个电压,充电需要延迟,所以还有个tWR写入延迟经过这个延迟,整个写入过程才算结束
读取比较复杂,由于存储单元是个电容,读取的时候也会导致放电,所以还要把数据回写进去,回写自动完成不占用单独的指令与延迟,那么从行地址激活到预充电之间这段都叫做RAS,就是完成一个行列地址激活操作到读写完成的全部时间tRAS加上tRP这段,则是时间更长的行地址周期时间,在pc上的话amd主板上会显示,intel主板会隐藏,但会有个tRFC的参数,刷新所有bank的延迟,这个数值非常大会有几百个周期之多
除了tRC合tWR,这个tWR是属于第二时序的参数,其他都是在第一时序里,也就是内存条标称值的最重要的四个参数
其实我们平时最熟悉的CL不是衡量读写性能的唯一指标
随着时钟频率的提升,CL虽然看起来最高,但是延迟反倒是最短的,计算公式为实际工作频率的倒数乘以周期数就可以算出实际时间
JEDEC组织发布的DDR4内存白皮书里的Command Table,详细记载了DDR4内存会用到的命令以及各引脚的电平信号、地址信息。其中有几个命令是内存时序会用到的基础命令。
Refresh=REF,刷新命令,内存为易失性储存器,每隔一段时间就需要对内存里的电容器进行充电,以维持电平信号的电势,这个步骤就叫刷新。
Precharge=PRE,预充电命令,当内存即将要对内存的某行进行读写时,就会对该行的cell单元进行激活和预充电,这个步骤就叫预充电。
Activate=ACT,激活命令,内存cell在未进行读写时多数处于休眠状态,当要进行读写时,就会先激活再预充电,这个步骤就叫激活。
Write=WR,写入命令,对内存的某行、某列地址进行数据写入,BLx、BCx是写入队列的长度,具体取决于处理器PHY接口对内存控制器的命令要求。
Read=RD,读取命令,对内存的某行、某列地址进行数据读取,BLx、BCx是写入队列的长度,具体取决于处理器PHY接口对内存控制器的命令要求。
以tWTR_S这个时序为例,第一行CK_c和CK_t代表了时钟信号,其中CK_t是真实时钟信号,CK_c则是一个相位差分时钟信号,用于辅助信号稳定性;第二行命令信号,记载了时钟信号传输的命令,tWTR_S意为在不同Bank中从写入切换到读取,所以命令行中有WR和RD命令,中间都是等待周期的校验信号;第三行地址信号,BG代表Bank Group,Bank代表Bank,Address代表行列信息,可以理解为这是一个从大到小的包含关系地址;第四行,DQS和DQ,DQ是数据传输信号,包含了真正的数据信息,DQS则是一个校准时钟信号,与DQ同步传输,并沿上下沿进行双倍采样。
tWTR_S是一个在不同Bank中从写入命令切换至读取命令的时序,可以看到tWTR_S经过9个时钟周期进行验证和寻址,第10个时钟周期时在不同Bank中开始进行写入切换读取命令的验证,这个过程叫tWTR-L,这个过程需要4个时钟周期,然后开始进行读取。
第一时序
CAS Latency(CL)
CL更官方的名称叫CAS Latency,可以理解为列地址延迟时间。CAS=Column Address Strobe Latency,它定义了读取命令发出后到从列地址读出数据到IO接口的间隔时间。列地址代表了内存cell的比特线,是内存cell中实际发生读写操作的接口,换句话说就是列地址连接着储存数据信息的电容,写入时电荷从列地址流向电容,读取时电荷从电容流向列地址,并输出到DQ引脚,所以CL的延迟对于内存读写性能影响最大,被JEDEC当做内存第一时序中的首位。
DRAM RAS to CAS Delay(tRCD)
tRCD更官方的名字是RAS to CAS Delay行地址到列地址延迟,也可以叫做RAS Latency,它定义了内存控制器发出“ACT”指令激活某个Bank中的某一行地址所需要的时间,在完成tRCD后,内存才会接着发送列地址以及读写指令,进行读写操作。我们刚刚说了R(Row)AS代表了行地址信息,行地址代表了字线,字线连接着栅极,是内存Cell的大门或者开关,tRCD这个操作就可以理解为找门和开门的环节,然后才能对内存Cell进行读写操作。
DRAM RAS Precharge Time(tRP)
tRP是RAS预充电时间,也就是行地址预充电时间,定义的是在同一个Bank中,前一个行地址读写操作已经完成,准备对下一个行地址操作时,对下一个行地址进行的预充电。这个时序会用到 “PRE”和“ACT”的基础命令,也就是预充电和激活地址。因为现代内存具有bank interleaving(bank交叉操作)和command scheduling(命令调配)特性,内存并不会频繁在同一个Bank中对不同行地址进行操作,也就不会频繁使用TRP,所以TRP对内存性能影响并不大,但在Memtest等内存稳定性测试中,会频繁使用到TRP,因此它有助于提高内存稳定性,但对内存性能影响不大。
在内存时序设定的第一时序中,tRP位于第三位,但在内存的实际操作中,tRP通常是第一个发生,也就是tRP-tRCD-CL,顺序与时序的排列刚好相反。tRP代表了激活和预充电,tRCD代表了激活(行地址)和行地址的发送,CL则是列地址的发送以及读写命令的发出到实际数据送出的延迟。
DRAM RAS Active Time(tRAS)
tRAS可以理解为内存完成一个行、列地址激活操作的贤者时间,内存控制器从发出“ACT”指令激活行/列地址后进行下一个指令必须等待一个完整的tRAS时钟周期,也就是tRAS包含了tRCD和CL的操作,所以tRAS通常大于等于tRCD+CL,尤其是在大容量内存上可以适当放宽tRAS时序,在tRCD+CL的基础上加多几个时钟周期有助于稳定性的提高。
DRAM Command Rate(CR)
首命令速率,平时我们看到内存的CR 1T或2T模式就是指的首命令速率。首命令速率指的是从选定bank地址之后到可以发出首个行地址激活命令所经过的时钟周期,1T需要一个时钟周期,2T需要两个时钟周期。CR模式对性能和稳定性的影响有较大变数,如果CPU需要的数据都在同一个Bank中,不需要重复寻找Bank地址,CR模式对性能和稳定性影响则不大,如果CPU需要的数据在不同Bank,需要重复寻找Bank地址、对其发出激活指令,CR的影响就会比较小。同时双面内存、内存条越多,例如四根插满甚至八根插满,CR模式的影响则越大。
第二时序
前面我们说过,内存常用的基础命令无非激活、预充电、刷新、读取、写入这五种,在第二时序中,我们会围绕这五种指令来帮助大家梳理和记忆第二时序的作用和定义。
Write-WR-写入命令
DRAM CAS Write Latency(tWCL)
tWCL是列地址写入延迟时间,它的定义与CL基本相同,都需要tRCD在前先激活行地址,然后在列地址输入或输出数据。CL与tWCL的区别是前者是在Read读取命令下运行,后者是在Write写入命令下运行。
tWCL在英特尔平台通常不可设定,与CL值直接同步,在锐龙平台,可以设定,但也建议与CL相同或顶多低一个时钟周期,在AUTO设定下,同样会与CL值直接同步。
DRAM Write Recovery Time(tWR)
tWR是写入恢复延迟,定义的是内存Bank中进行写入命令后需要等待多少个时钟周期,才能进行预充电命令和下一个操作。这个时序用于确保Bank中已激活的地址能将数据完整保存进内存cell的电容中。如果该参数收的过紧,Bank进行了提前预充电,会导致内存数据损坏,进而造成内存不稳定,所以在超频时可以适当放宽tWR,有助于稳定性的提高。
DRAM Write to Read Delay(tWTR-S/tWTR-L)
tWTR是内存写入命令与读取命令延迟,定义了控制器发出写入命令后到读取命令的间隔时间。tWTR在DDR4中还细分为tWTR-S和tWTR-L,而DDR3因为没有Bank Group这个特性,所以并不区分-S或-L。
两者的区别是tWTR-S的Bank Group地址不同,写入地址位于BGb,读取地址位于BGb。tWTR-L则是同一个Bank Group中发生的写入与读取命令延迟,写入与读取命令均位于BGa,通常发生在不同Bank Group的操作,需要的延迟时间更短,所以在DDR4的内存时序中,-S的内存延迟通常要比-L更短一些。
Read-RD-读取命令
DRAM Read to Precharge Time(tRTP)
tRTP是内存读取与预充电延迟,定义了控制器发出读取命令后到下一个预充电命令的延迟时间。tRTP与tWR类似,定义的是在读取命令后,对行地址关闭,并新激活一个行地址和预充电的延迟时间。同理,这个参数如果收得过于紧,也容易导致电容输出到列地址的电荷被提前关闭,导致数据丢失,所以tRTP收得过紧,也容易造成内存不稳定,在超频时建议适当放宽,有助于稳定性的提高。
Activate-ACT-激活命令
DRAM RAS to RAS Delay(tRRD-S/tRRD-L)
tRRD是行地址延迟时间,定义的是连续激活两行地址的最低等待时钟周期,当内存进行频繁读写时,会连续激活行地址进行读写操作,tRRD就是连续激活两行地址所需的等待时钟周期。tRRD-S和tRRD-L的区别同样是前者位于不同BG地址,后者是在同一个BG地址中,-S的内存延迟通常要比-L更短一些。
DRAM Row Cycle Time(tRC)
tRC是行地址周期时间,定义的是内存完成行地址操作所需的时钟周期。tRC包括了tRAS和tRP两个操作,tRAS激活行地址,tRP完成预充电,tRC指的是完整整个行地址操作所需时间。tRC在英特尔平台无法设置,AMD平台上tRC通常要大于tRAS+tRP。
DRAM Four Active Window(tFAW)
tFAW定义的是在一个Bank中连续激活四个行地址所需等待时钟周期,当内存处于频繁读写状态,需要连续开启大于或等于4个行地址,则需要进入tFAW等待周期。某种程度上可以理解为,在同一个Bank中连续激活4个行地址时,需要给Bank更多的等待周期(休息时间)。tFAW时序设定通常需要大于tRRD-L x 4。
Refresh-REF-刷新命令
DRAM Row Refresh Cycle Time(tRFC)
tRFC是行地址刷新周期,定义了刷新所有Bank行地址所需的周期时间。内存属于易失性储存器,内存cell里电容的电荷会逐渐丢失,所以为了维持数据的完整性,内存每隔一段时间就要对一个Bank或多个Bank的行地址进行刷新。内存有多种刷新模式,最基础的是All Bank的Refresh命令,这时ACT引脚处于高电平对所有Bank进行加压,激活Bank中的所有行地址,同时还有Self Refresh状态,对单一Bank中的行地址进行激活,如Bank中的某个行地址本身处于激活状态(正在工作),则列地址激活进行读出和回写,完成刷新任务。
更高的tRFC值能增强内存的稳定性,但更高的tRFC值会小幅度影响内存读写性能,较为明显的影响内存延迟时间,更长的刷新周期会导致读写任务向后推移,因此导致内存延迟提高。
DRAM Refresh Interval(tREFI)
tREFI是内存刷新间隔时间,即完成tRFC后到下一个刷新周期中间的间隔时间。相较tRFC,tREFI会更明显的影响读写性能,但同时tREFI会更明显的影响内存稳定性,过高或过低都容易导致内存数据的丢失,所以除非你清楚的知道自己内存tREFI的安全阈值,否则这一项建议设为自动。
第三时序
我们常规的超频包括XMP或是网上的超频攻略,大部分止步于第二时序,极少会去调校第三时序,而第三时序的重要性其实和第二时序差不多,但是第三时序如果调错更容易导致稳定性崩盘,所以在设定第三时序参数时,我们需要更加的谨慎。
第三时序从命名上看,要比第二时序复杂得多,大家可能比较容易混淆,但实际上定义更简单一些。我们先给大家解释一下第三时序的命名规则。
tRDRD:两个读取命令之间的间隔时钟周期
tRDWR:读取到写入命令之间的间隔时钟周期
tWRRD:写入到读取命令之间的间隔时钟周期
tWRWR:两个写入命令之间的间隔时钟周期
-sg:Same Bank Group,发生在一个BG地址中的时钟操作。
-dg:Different Bank Group,发生在不同BG地址中的时序操作。
-dr:Different Rank,发生在两个Rank也就是双面内存,才会有的时序操作。
-dd:Different Dimm,发生在不同插槽上的时序操作。
例如tRDRD -dg,控制器在两个不同BG地址中连续发送两个读取命令,中间需要间隔tRDRD-dg设定值的时钟周期。tWRRD-sg,控制在同一个BG地址发送写入命令后,跟着发送读取命令需要tWRRD-sg设定的时钟周期。
这四种命令和四种地址的搭配,可以变形出16个时序设定,其中tRDRD-sg、tWRWR-sg对内存效能影响最大,基本上每多往上调一个时钟周期,内存在AIDA64读写性能测试的成绩就会往下掉5%-10%左右。这是因为AIDA64读写测试基本上就是一堆读取、一堆写入命令往里砸,才能测出实际的读写带宽,所以这两个时序最影响性能。
tRDRD-sg和tWRWR-sg我们建议超频时都设置为7做起点进行尝试,不稳定时可以以1个时钟周期为间隔往上尝试。如果是三星B Die可以以6为起点做尝试。