第一章 SDRAM 的原理和时序(1)

第一章SDRAM 的原理和时序


1.1 SDRAM 内存模组的物理 Bank 与芯片位宽
1.1.1 物理 Bank


    内存系统为了保证 CPU 的正常工作,必须一次传输完 CPU 在一个传输周期内所需要的数据。
    而 CPU 在一个传输周期能接受的数据容量就是 CPU 数据总线的位宽,单位是 bit (位)。当时控制内
    存与 CPU 之间数据交换的北桥芯片也因此将内存总线的数据位宽等同于CPU数据总线的位宽,而这个
    位宽就称之为物理 Bank(Physical Bank,下文简称 P-Bank)的位宽。
    内存必须要组织成 P-Bank 来与 CPU打交道.
    图一


    1.1.2 芯片位宽
    SDRAM 内存系统必须要组成一个 P-Bank 的位宽,才能使 CPU 正常工作

芯片位宽、芯片数量与 P-Bank 的关系:P-Bank 其实就是一组内存芯片的集合为了组成 P-Bank 所需的位宽,就需要多颗芯片并联工作。对于 16bit 芯片,需要4颗(4芯片数量×16bit芯片位宽=64bit物理位宽(P-Bank))。

对于 8bit 芯片,则就需要 8 颗。一个 DIMM 上支持多个 P-Bank,比如 SDRAM DIMM 就有 4 个芯片选择信号(Chip Select,简称片选或 CS),理论上可以控制 4 个 P-Bank 的芯片集合。


    1.2 SDRAM 的逻辑 Bank 与芯片容量表示方法


    1.2.1 逻辑 Bank 与芯片位宽
    SDRAM 的内部是一个存储阵列,逻辑 Bank(Logical Bank,下文简称 L-Bank)
    SDRAM 内部分割成多个 L-Bank,较早以前是两个,目前基本都是 4 个,最新 DDR-II的标准中,L-Bank 的数量也提高到了 8 个。
    进行寻址时就要先确定是哪个L-Bank,然后再在这个选定的L-Bank中选择相应的行与
    列进行寻址。可见对内存的访问,一次只能是一个L- Bank工作,而每次与北桥交换的数据就是L-Bank存储阵列中一个“存储单元”的容量。将 L-Bank 中的存储单元称为 Word (此处代表位的集合而不是字节的集合)。
    图二
    SDRAM 内存芯片一次传输率的数据量就是芯片位宽,那么这个存储单元的容量就是芯片的位宽(也是 L-Bank 的位宽)
    图3

    1.2.2 内存芯片的容量

    内存芯片的容量就是所有L-Bank中的存储单元的容量总合。


    存储单元数量=行数×列数(得到一个 L-Bank 的存储单元数量)×L-Bank 的数量

    M×W 的方式来表示芯片的容量。


    M 是该芯片中存储单元的总数,单位是兆,


    W 代表每个存储单元的容量,也就是 SDRAM 芯片的位宽(Width),单位是 bit。


    计算出来的芯片容量也是以 bit 为单位,但用户可以采用除以 8 的方法换算为字节(Byte)。


    比如 8M×8,这是一个 8bit 位宽芯片,有 8M 个存储单元,总容量是 64Mbit(8MB)
    图4


    1.2.3 与芯片位宽相关的 DIMM 设计


    上文中那个内存芯片容量标识图,容量都是 128Mbit,合 16MB。如果 DIMM 采用双 P-Bank+16bit 芯片设计,那么只能容纳 8 颗芯片,计 128MB。但如果采用 4bit 位宽芯片,则可容纳 32 颗芯片,计 512MB。DIMM 容量前后相差出 4 倍,可见芯片位宽对 DIMM 设计的重要性。


    1.3 SDRAM 的引脚与封装


    1 首先,我们知道内存控制器要先确定一个 P-Bank 的芯片集合,然后才对这集合中的芯片进行寻址操作。因此要有一个片选的信号,它一次选择一个 P-Bank 的芯片集(根据位宽的不同,数量也不同)。被选中的芯片将同时接收或读取数据,所以要有一个片选信号。


    2 接下来是对所有被选中的芯片进行统一的 L-Bank 的寻址,目前 SDRAM 中 L-Bank 的数量最高为 4 个,所以需要两个 L-Bank 地址信号。


    3 最后就是对被选中的芯片进行统一的行/列(存储单元)寻址。地址线数量要根据芯片的组织结构分别设计了。但在相同容量下,行数不变,只有列数会根据位宽的而变化,位宽越大,列数越少,


    因为所需的存储单元减少了。


    4、找到了存储单元后,被选中的芯片就要进行统一的数据传输,那么肯定要有与位宽相同数量的数据 I/O 通道才行,所以肯定要有相应数量的数据线引脚。现在我们就基本知道了内存芯片的一些信号引脚,下图就是一个简单的 SDRAM 示意图,大家可以详细看看


    图5 6

    1.4 SDRAM 芯片初始化、行有效、列读写时序
    图7 


1.4.1 芯片初始化


    在 SDRAM 芯片内部还有一个逻辑控制单元,并且有一个模式寄存器为其提供控制参数。因此,每次开机时 SDRAM 都要先对这个控制逻辑核心进行初始化。有关预充电和刷新的含义在下文有讲述,关键的阶段就在于模式寄存器(MR,ModeRegister)的设置,简称 MRS(MR Set),这一工作由北桥芯片在 BIOS 的控制下进行,寄存器的信息由地址线来提供。
    图8 
SDRAM 模式寄存器所控制的操作参数:地址线提供不同的 0/1 信号来获得不同的参数。在设置到MR 之后,就开始了进入正常的工作状态,

1.4.2 行有效
    
初始化完成后,要想对一个 L-Bank 中的阵列进行寻址,首先就要确定行(Row),使之处于活动状态(Active),然后再确定列。虽然之前要进行片选和 L-Bank 的定址,但它们与行有效可以同时进行.
从图中可以看出,在 CS#、L-Bank 定址的同时,RAS(Row Address Strobe,行地址选通脉冲)也处于有效状态。此时 An 地址线则发送具体的行地址。如图中是 A0-A11,共有 12 个地址线,由于是二进制表示法,所以共有 4096 个行(212=4096),A0-A11 的不同数值就确定了具体的行地址。由于行有效的同时也是相应L-Bank有效,所以行有效也可称为L-Bank有效。


图10    

1.4.3 列读写    


行地址确定之后,就要对列地址进行寻址了。但是,地址线仍然是行地址所用的A0-A11(本例)。没错,在SDRAM中,行地址与列地址线是共用的。不过,读/写的命令是怎么发出的呢?其实没有一个信号是发送读或写的明确命令的,而是通过芯片的可写状态的控制来达到读/写的目的。显然 WE#信号就是一个关键。WE#无效时,当然就是读取命令。
    
图11


上图是 SDRAM 基本操作命令, 通过各种控制/地址信号的组合来完成(H 代表高电平,L 代表低电平,X 表示高低电平均没有影响)。此表中,除了自刷新命令外,所有命令都是默认 CKE 有效。对于自刷新命令,下文有详解.
    

列寻址信号与读写命令是同时发出的。虽然地址线与行寻址共用,但 CAS(Column Address Strobe,列地址选通脉冲)信号则可以区分开行与列寻址的不同,配合 A0-A9,A11(本例)来确定具体的列地址。
    
图12

然而,在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为 tRCD,即 RAS to CAS Delay(RAS 至 CAS 延迟),大家也可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟。

tRCD 是 SDRAM 的一个重要时序参数,可以通过主板 BIOS 经过北桥芯片进行调整,但不能超过厂商的预定范围。广义的 tRCD 以时钟周期(tCK,Clock Time)数为单位,比如 tRCD=2,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,对于 PC100 SDRAM,tRCD=2,代表20ns 的延迟,对于 PC133 则为 15ns。

图13

1.5  SDRAM的读/写时序与突发长度

1.5.1 数据输出(读)

在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据 I/O 通道(DQ)输出到内存总线上了。
但是在 CAS 发出之后,仍要经过一定的时间才能有数据输出,从 CAS 与读取命令发出到第一笔数据输出的这段时间,被定义为 CL(CAS Latency,CAS 潜伏期)。由于 CL 只在读取时出现,所以 CL又被称为读取潜伏期(RL,Read Latency)。
CL 的单位与 tRCD 一样,为时钟周期数,具体耗时由时钟频率决定。不过,CAS并不是在经过CL周期之后才送达存储单元。实际上 CAS 与 RAS 一样是瞬间到达的,但 CAS 的响应时间要更快一些。为什么呢?假设芯片位宽为 n 个 bit,列数为 c,那么一个行地址要选通 n×c 个存储体,而一个列地址只需选通 n 个存储体。但存储体中晶体管的反应时间仍会造成数据不可能与 CAS 在同一上升沿触发,肯定要延后至少一个时钟周期。

由于芯片体积的原因,存储单元中的电容容量很小,所以信号要经过放大来保证其有效的识别性,这个放大/驱动工作由 S-AMP 负责,一个存储体对应一个 S- AMP 通道。但它要有一个准备时间才能保证信号的发送强度(事前还要进行电压比较以进行逻辑电平的判断),因此从数据 I/O 总线上有数据输出之前的一个时钟上升沿开始,数据即已传向 S-AMP,也就是说此时数据已经被触发,经过一定的驱动时间最终传向数据 I/O 总线进行输出,这段时间我们称之为 tAC (Access Time from CLK,时钟触发后的访问时间)。tAC 的单位是 ns,对于不同的频率各有不同的明确规定,但必须要小于一个时钟周期,否则会因访问时过长而使效率降低。比如 PC133 的时钟周期为 7.5ns,tAC 则是 5.4ns。需要强调的是,每个数据在读取时都有 tAC,包括在连续读取中,只是在进行第一个数据传输的同时就开始了第二个数据的 tAC。


图14

CL 周期在开机初始化过程中的 MRS 阶段进行设置,在BIOS 中一般都允许用户对其调整,然后 BIOS 控制北桥芯片在开机时通过 A4-A6 地址线对 MR 中CL 寄存器的信息进行更改。

不过,从存储体的结构图上可以看出,原本逻辑状态为 1 的电容在读取操作后,会因放电而变为逻辑 0。所以,以前的 DRAM 为了在关闭当前行时保证数据的可靠性,要对存储体中原有的信息进行重写,这个任务由数据所经过的刷新放大器来完成,它根据逻辑电平状态,将数据进行重写(逻辑 0 时就不重写),由于这个操作与数据的输出是同步进行互不冲突,所以不会产生新的重写延迟。后来通过技术的改良,刷新放大器被取消,其功能由 S-AMP 取代,因为在读取时它会保持数据的逻辑状态,起到了一个 Cache 的作用,再次读取时由它直接发送即可,不用再进行新的寻址输出,此时数据重写操作则可在预充电阶段完成。

1.5.2 数据输入(写)

数据写入的操作也是在 tRCD 之后进行,但此时没有了 CL(记住,CL 只出现在读取操作中),行寻址与列寻址的时序图和上文一样,只是在列寻址时,WE#为有效状态。

图15

从图中可见,由于数据信号由控制端发出,输入时芯片无需做任何调校,只需直接传到数据输入寄存器中,然后再由写入驱动器进行对存储电容的充电操作,因此数据可以与 CAS 同时发送,也就是说写入延迟为 0。
不过,数据并不是即时地写入存储电容,因为选通三极管(就如读取时一样)与电容的充电必须要有一段时间,所以数据的真正写入需要一定的周期。为了保证数据的可靠写入,都会留出足够的写入/校正时间(tWR,Write Recovery Time),这个操作也被称作写回(Write Back)。tWR 至少占用一个时钟周期或再多一点(时钟频率越高,tWR 占用周期越多),有关它的影响将在下文进一步讲述。


1.5.3 突发长度(非突发连续读取模式 和 突发连续读取模式)

突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称 BL)。
在目前,由于内存控制器一次读/写 P-Bank 位宽的数据,也就是 8 个字节,但是在现实中小于8 个字节的数据很少见,所以一般都要经过多个周期进行数据的传输。上文讲到的读/写操作,都是一次对一个存储单元进行寻址,如果要连续读/写就还要对当前存储单元的下一个单元进行寻址,也就是要不断的发送列地址与读/写命令(行地址不变,所以不用再对行寻址)。虽然由于读/写延迟相同可以让数据的传输在 I/O 端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低(早期的 FPE/EDO 内存就是以这种方式进行连续的数据传输)。
为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址。这样,除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般的是 tRCD+CL)外,其后每个数据只需一个周期的即可获得。在很多北桥芯片的介绍中都有类似于 X-1-1-1 的字样,就是指这个意思,其中的 X 代表就代表第一笔数据所用的周期数。

图16 

非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于 BL=1。虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大

图17

突发连续读取模式:只要指定起始列地址与突发长度,寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与 BL 相同)即可做到连续的突发传输。至于 BL 的数值,也是不能随便设或在数据进行传输前临时决定。在上文讲到的初始化过程中的MRS 阶段就要对 BL 进行设置。目前可用的选项是 1、2、4、8、全页(Full Page),常见的设定是 4 和8。

顺便说一下,BL 能否更改与北桥芯片的设计有很大关系,不是每个北桥都能像调整 CL 那样来调整 BL。某些芯片组的 BL 是定死而不可改的,比如 Intel 芯片组的 BL 基本都为 4,所以在相应的主板 BIOS 中也就不会有 BL 的设置选项。而由于目前的 SDRAM 系统的数据传输是以 64bit/周期进行,所以在一些 BIOS 也把 BL 用 QWord(4 字,即 64bit)来表示。如 4QWord 就是 BL=4。

另外,在 MRS 阶段除了要设定 BL 数值之外,还要具体确定读/写操作的模式以及突发传输的模式。突发读/突发写,表示读与写操作都是突发传输的,每次读/ 写操作持续 BL 所设定的长度,这也是常规的设定。突发读/单一写,表示读操作是突发传输,写操作则只是一个个单独进行。突发传输模式代表着突发周期内所涉及到的存储单元的传输顺序。顺序传输是指从起始单元开始顺序读取。假如 BL=4,起始单元编号是 n,顺序就是 n、n+1、n+2、n+3。交错传输就是打乱正常的顺序进行数据传输(比如第一个进行传输的单元是 n,而第二个进行传输的单元是 n+2 而不是 n+1),至于交错的规则在 SDRAM 规范中有详细的定义表,但在这此出于必要性与篇幅的考虑就不列出了。

图18

1.6 预充电

由于 SDRAM 的寻址具体独占性,所以在进行完读写操作后,如果要对同一 L-Bank 的另一行进行寻址,就要将原来有效(工作)的行关闭,重新发送行/列地址。L-Bank 关闭现有工作行,准备打开新行的操作就是预充电(Precharge)。

预充电可以通过命令控制,也可以通过辅助设定让芯片在每次读写操作之后自动进行预充电。实际上,预充电是一种对工作行中所有存储体进行数据重写,并对行地址进行复位,同时释放 S-AMP(重新加入比较电压,一般是电容电压的 1/2,以帮助判断读取数据的逻辑电平,因为 S-AMP 是通过一个参考电压与存储体位线电压的比较来判断逻辑值的),以准备新行的工作。具体而言,就是将 SAMP 中的数据回写,即使是没有工作过的存储体也会因行选通而使存储电容受到干扰,所以也需要 S-AMP 进行读后重写。此时,电容的电量(或者说其产生的电压)将是判断逻辑状态的依据(读取时也需要),为此要设定一个临界值,一般为电容电量的 1/2,超过它的为逻辑 1,进行重写,否则为逻辑 0,不进行重写(等于放电)。为此,现在基本都将电容的另一端接入一个指定的电压(即 1/2 电容电压),而不是接地,以帮助重写时的比较与判断。

现在我们再回过头看看读写操作时的命令时序图,从中可以发现地址线 A10 控制着是否进行在读写之后当前 L-Bank 自动进行预充电,这就是上文所说的“辅助设定”。而在单独的预充电命令中,A10则控制着是对指定的 L-Bank 还是所有的 L-Bank(当有多个 L-Bank 处于有效/活动状态时)进行预充电,前者需要提供 L-Bank 的地址,后者只需将 A10 信号置于高电平。在发出预充电命令之后,要经过一段时间才能允许发送 RAS 行有效命令打开新的工作行,这个间隔被称为 tRP(Precharge command Period,预充电有效周期)。和 tRCD、CL 一样,tRP 的单位也是时钟周期数,具体值视时钟频率而定。

图19

自动预充电时的开始时间与此图一样,只是没有了单独的预充电命令,并在发出读取命令时,A10地址线要设为高电平(允许自动预充电)。可见控制好预充电启动时间很重要,它可以在读取操作结束后立刻进入新行的寻址,保证运行效率。

误区:读写情况下都要考虑写回延迟有些文章强调由于写回操作而使读/写操作后都有一定的延迟,但从本文的介绍中写可以看出,即使是读后立即重写的设计,由于是与数据输出同步进行,并不存在延迟。只有在写操作后进行其他的操作时,才会有这方面的影响。写操作虽然是 0 延迟进行,但每笔数据的真正写入则需要一个足够的周期来保证,这段时间就是写回周期(tWR)。所以预充电不能与写操作同时进行,必须要在 tWR 之后才能发出预充电命令,以确保数据的可靠写入,否则重写的数据可能是错的,这就造成了写回延迟。

图20

上图为数据写入时预充电操作时序图:注意其中的 tWR 参数,由于它的存在,使预充电操作延后,从而造成写回延迟.

1.7 刷新

之所以称为 DRAM,就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是 DRAM 最重要的操作。刷新操作与预充电中重写的操作一样,都是用 S-AMP 先读再写。

但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有 L-Bank中的工作行操作,并且是不定期的,而刷新则是有固定的周期,依次对所有行进行操作,以保留那些久久没经历重写的存储体中的数据。但与所有 L-Bank 预充电不同的是,这里的行是指所有 L-Bank 中地址相同的行,而预充电中各 L-Bank 中的工作行地址并不是一定是相同的。那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000 秒),也就是说每一行刷新的循环周期是 64ms。这样刷新速度就是:行数量/64ms。我们在看内存规格时,经常会看到 4096 Refresh Cycles/64ms 或 8192 RefreshCycles/64ms 的标识,这里的4096 与 8192 就代表这个芯片中每个 L-Bank 的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化,4096 行时为 15.625μs(微秒,1/1000 毫秒),8192 行时就为 7.8125μs。

刷新操作分为两种:自动刷新(Auto Refresh,简称 AR)与自刷新(Self Refresh,简称 SR)。不论是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。对于 AR, SDRAM 内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址,或者说 CAS 在RAS之前有效。所以,AR 又称CBR(CAS Before RAS,列提前于行定位)式刷新。

由于刷新涉及到所有 L-Bank,因此在刷新过程中,所有 L-Bank 都停止工作,而每次刷新所占用的时间为 9 个时钟周期(PC133 标准),之后就可进入正常的工作状态,也就是说在这 9 个时钟期间内,所有工作指令只能等待而无法执行。64ms 之后则再次对同一行进行刷新,如此周而复始进行循环刷新。显然,刷新操作肯定会对 SDRAM 的性能造成影响,但这是没办法的事情,也是 DRAM 相对于 SRAM(静态内存,无需刷新仍能保留数据)取得成本优势的同时所付出的代价。

SR 则主要用于休眠模式低功耗状态下的数据保存,这方面最著名的应用就是 STR(SuspendtoRAM,休眠挂起于内存)。在发出 AR 命令时,将 CKE 置于无效状态,就进入了 SR 模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在 SR 期间除了 CKE 之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使 CKE 有效才能退出自刷新模式并进入正常操作状态。


1.8 数据掩码

在讲述读/写操作时,我们谈到了突发长度。如果 BL=4,那么也就是说一次就传送 4×64bit的数据。但是,如果其中的第二笔数据是不需要的,怎么办?还都传输吗?为了屏蔽不需要的数据,人们采用了数据掩码(Data I/O Mask,简称 DQM)技术。通过 DQM,内存可以控制 I/O 端口取消哪些输出或输入的数据。这里需要强调的是,在读取时,被屏蔽的数据仍然会从存储体传出,只是在“掩码逻辑单元”处被屏蔽。

DQM 由北桥控制,为了精确屏蔽一个 P-Bank 位宽中的每个字节,每个 DIMM 有 8 个 DQM 信号线,每个信号针对一个字节。这样,对于 4bit 位宽芯片,两个芯片共用一个 DQM 信号线,对于 8bit 位宽芯片,一个芯片占用一个 DQM 信号,而对于 16bit 位宽芯片,则需要两个 DQM 引脚。SDRAM 官方规定,在读取时 DQM 发出两个时钟周期后生效,而在写入时,DQM 与写入命令一样是立即成效。

图21

1.9 SDRAM 的结构、时序与性能的关系

在讲完 SDRAM 的基本工作原理和主要操作之后,我们现在要重要分析一下 SDRAM 的时序与性能之间的关系,它不在局限于芯片本身,而是从整体的内存系统去分析。这也是广大 DIYer 所关心的话题。
比如 CL 值对性能的影响有多大几乎是每个内存论坛都会有讨论,今天我们就详细探讨一下,其中的很多内容同样适用于 DDR 与 RDRAM。
这里需要强调一点,对于内存系统整体而言,一次内存访问就是对一个页的访问,这个页的定义已经在解释 FullPage 含义时讲明了。由于在 P-Bank 中,每个芯片的寻址都是一样的,所以可以将页访问“浓缩”等效为对每芯片中指定行的访问,这样可能比较好理解。但为了与官方标准统一,在下文中会经常用页来描述相关的内容,请读者注意理解。

1.9.1 影响性能的主要时序参数

以内存最主要的操作— — 读取为例。
tRCD 决定了行寻址(有效)至列寻址(读/写命令)之间的间隔,
CL 决定了列寻址到数据进行真正被读取所花费的时间
tRP 则决定了相同 L-Bank 中不同工作行转换的速度。
现在可以想象一下读取时可能遇到的几种情况(分析写入操作时不用考虑 CL 即可):
1、要寻址的行与 L-Bank 是空闲的。也就是说该 L-Bank 的所有行是关闭的,此时可直接发送行有效命令,数据读取前的总耗时为 tRCD+CL,这种情况我们称之为页命中(PH,PageHit)
2、要寻址的行正好是前一个操作的工作行,也就是说要寻址的行已经处于选通有效状态,此时可直接发送列寻址命令,数据读取前的总耗时仅为 CL,这就是所谓的背靠背(Back to Back)寻址,我们称之为页快速命中(PFH,Page Fast Hit)或页直接命中(PDH,Page DirectHit)。
3、要寻址的行所在的 L-Bank 中已经有一个行处于活动状态(未关闭),这种现象就被称作寻址冲突,此时就必须要进行预充电来关闭工作行,再对新行发送行有效命令。结果,总耗时就是tRP+tRCD+CL,这种情况我们称之为页错失(PM,Page Miss)。
显然,PFH 是最理想的寻址情况,PM 则是最糟糕的寻址情况。上述三种情况发生的机率各自简称为PHR—PH Rate、PFHR— PFH Rate、PMR— PM Rate。因此,系统设计人员(包括内存与北桥芯片)都尽量想提高 PHR 与 PFHR,同时减少 PMR,以达到提高内存工作效率的目的。

1.9.2 增加PHR的方法(VIA交错控制)

显然,这与预充电管理策略有着直接的关系,目前有两种方法来尽量提高 PHR。自动预充电技术就是其中之一,它自动的在每次行操作之后进行预充电,从而减少了日后对同一 L-Bank 不同行寻址时发生冲突的可能性。但是,如果要在当前行工作完成后马上打开同一 L-Bank 的另一行工作时,仍然存在 tRP 的延迟。怎么办? 此时就需要 L-Bank 交错预充电了。

VIA的4路交错式内存控制就是在一个L-Bank工作时,对下一个要工作的 L-Bank 进行预充电。这样,预充电与数据的传输交错执行,当访问下一个 L-Bank 时,tRP 已过,就可以直接进入行有效状态了。目前 VIA 声称可以跨 P-Bank 进行 16 路内存交错,并以 LRU 算法进行预充电管理。

图22

上图为 L-Bank 交错自动预充电/读取时序图:L-Bank 0 与 L-Bank 3 实现了无间隔交错读取,避免了tRP对性能的影响。


1.9.3 增加 PFHR 的方法

无论是自动预充电还是交错工作的方法都无法消除 tRCD 所带来的延迟。要解决这个问题,就要尽量让一个工作行在进行预充电前尽可能多的接收多个工作命令,以达到背靠背的效果,此时就只剩
下 CL 所造成的读取延迟了(写入时没有延迟)。

如何做到这一点呢?这就是北桥芯片的责任了。在上文的时序图中有一个参数 tRAS(Active to Precharge Command,行有效至预充电命令间隔周期)。它有一个范围,对于 PC133 标准,一般是预充
电命令至少要在行有效命令 5 个时钟周期之后发出,最长间隔视芯片而异(基本在 120000ns 左右),否则工作行的数据将有丢失的危险。

那么这也就意味着一个工作行从有效(选通)开始,可以有 120000ns 的持续工作时间而不用进行预充电。显然,只要北桥芯片不发出预充电(包括允许自动预充电)的命令,行打开的状态就会一直保持。在此期间的对该行的任何读写操作也就不会有 tRCD 的延迟。

可见,如果北桥芯片在能同时打开的行(页)越多,那么 PFHR 也就越大。需要强调的是,这里的同时打开不是指对多行同时寻址(那是不可能的),而是指多行同时处于选通状态。我们可以看到一些SDRAM芯片组的资料中会指出可以同时打开多少个页的指标,这可以说是决定其内存性能的一个重要因素。

图23

Intel 845 芯片组 MCH 的资料:其中表明它可以支持 24 个页面同时处于打开状态。但是,可同时打开的页数也是有限制的。

从SDRAM 的寻址原理讲,同一 L-Bank 中不可能有两个打开的行(S-AMP 只能为一行服务),这就限制了可同时打开的页面总数。以 SDRAM 有 4 个 L-Bank,北桥最多支持 8 个 P-Bank 为例,理论上最多只能有32 个页面能同时处于打开的状态。而如果只有一个 P-Bank,那么就只剩下 8 个页面,因为有几个L-Bank 才能有同时打开几个行而互不干扰。Intel 845 的 MHC 虽然可以支持 24 个打开的页面,那也是指 6 个 P-Bank 的情况下(845MCH 只支持 6 个 P-Bank)。可见 845 已经将同时打开页数发挥到了极致。

不过,同时打开页数多了,也对存取策略提出了一定的要求。理论上,要尽量多地使用已打开的页来保证最短的延迟周期,只有在数据不存在(读取时)或页存满了(写入时)再考虑打开新的指定页,这也就是变向的连续读/写。而打开新页时就必须要关闭一个打开的页,如果此时打开的页面已是北桥所支持的最大值但还不到理论极限的话,就需要一个替换策略,一般都是用 LRU 算法来进行,这与VIA的交错控制大同小异。

图24

1.9.4 内存结构对 PHR 的影响

这是结构设计上的问题,所以单独来说。在我们介绍 L-Bank 时,曾经提到单一的 L-Bank 会造成严重的寻址冲突。现在,当我们了解了内存寻址的原理后,就不难理解这句话了。如果只有一个L-Bank,那么除非是背靠背式的操作(PFH),否则 tRP、tRCD、CL(读取时)一个也少不了。

上文中,内存交错之所以能实现就是因为有多个 L-Bank,从这点就可以看出 L-Bank 数量与页命中率之间的关系了。PHR 基本上可以等于“(L-Bank 数-1)/L-Bank 数”。SDRAM 有 4 个 L-Bank,那么页命中率就是 75%,DDR-II SDRAM 最多将有 8 个 L-Bank,PHR 最高为 87.5%。而 RDRAM 则最多有32 个 L-Bank,PHR 到了惊人的 96.875%,这也是当时 RDRAM 攻击 SDRAM 的一主要方面。不过,从内存的结构图上可以看出,L-Bank 多了,相应外围辅助的元件也要增加,比如 S-AMP,L-Bank 地址线等等。在 RDRAM 的介绍中,我会讲到 L-Bank 数量增多后所带来的一些新问题。

1.9.5 读/写延迟不同对性能所造成的影响

SDRAM 在读取操作时会有 CL 造成的延迟,而在写入时则是 0 延迟。这样,在读操作之后马上进行写操作的话,由于没有写延迟,数据线不会出现空闲的时候,保证了数据总线的利用率。但是,若在写操作之后马上进行读操作的话,即使是背靠背式进行,仍然会由于 tWR 与 CL 的存在而造成间隔,这期间数据总线将是空闲的,利用率受到了影响。

图25

在先写后读的操作中,由于保证写入的可靠性,读取命令在 tWR 之后发出,并再经过 CL 才能输出数据,本例中 CL=3,造成了两个时钟周期的总线空闲,这里需要着重说明一下,在突发读取过程中,想立刻中断并进行新的读操作,和读后读模式(见“突发连续读取模式图” )一样,只是新的读命令根据需要提前若干个周期发出,经过 CL 后就会自动传输新的数据。

但是,若想中断读后立即进行写操作,就需要数据掩码(DQM)来屏蔽写入命令发出时的数据输出,避免总线冲突。根据芯片设计的不同,有时可能会浪费一个周期进行总线 I/O 的调转,此时一个周期的总线空闲也是不可避免的。

图26

突发读后写时的操作,以上图为例:
1、在最后一个所需数据(本例为第一笔数据)输出前一个周期使 DQM 有效,屏蔽第二笔数据的输出;
2、发出写入命令,此时所读取的第二笔数据被屏蔽。
3、继续 DQM 以屏蔽第三笔数据的输出。
其中 tHZ 表示输出数据与外部电路的连接周期,tDS 表示数据输入准备时间,如果 tHZ+tDS>tCK,那么写入操作就要延后一个周期,这要视芯片的具体设计而定

图27

1.9.6 BL对性能的影响

从读/写之间的中断操作我们又引出了 BL(突发长度)对性能影响的话题。首先,BL 的长短与其应用的领域有着很大关系,下表就是目前三个主要的内存应用领域所使用的 BL,这是厂商们经过多年的实践总结出来的。

图28

BL 越长,对于连续的大数据量传输很有好处,但是对零散的数据,BL 太长反而会造成总线周期的浪费。以 P-Bank 位宽 64bit 为例,BL=4 时,一个突发操作能传输 32 字节的数据,但如果只需要前 16 个字节,后两个周期是无效的。如果需要 40 字节,需要再多进行一次突发传输,但实际只需要多进行一个传输周期就够了,从而浪费了三个传输周期。而对于 2KB 的数据,BL=4 的设置意味着要每隔 4 个周期发送新的列地址,并重复 63 次。而对于 BL=256,一次突发就可完成,并且不需要中途再进行控制。不少人都因此表示了 BL 设定对性能影响的担心。

但设计人员也不是傻瓜,通过上文的介绍,可以看出他们在这方面的考虑。通过写命令、DQM、读命令的配合/操作,完全可以任意地中断突发周期开始新的操作,而且 DQM 还可以帮我们在 BL 中选择有用的数据,从而最大限度降低突发传输对性能带来的影响。另外,预充电命令与专用的突发传输终止命令都可以用来中断 BL,前者在中断后进行预充电,后者在中断后不进行其他读/写操作。

图29

用预充电命令来中断突发读取,生效潜伏期与 CL 相同,要小于或等于 tRP。写入时预充电在最后一个有效写入周期完成,并经过 tWR 之后发出,同时立即中断突发传输。所以,突发周期的中断并不难,但用短 BL 应付大数据量存取需要不断的指令与列寻址配合,而为了取消不需要的传输周期,由于需要运用额外的控制,也将占用不少的控制资源。所以 BL 针对不同应用领域有不同设计的主要目的,就是在保证性能的同时,系统控制资源也能得到合理的运用。


 

猜你喜欢

转载自blog.csdn.net/sinat_37817094/article/details/81257368