序:不得不说的话(高手进阶,终极内存技术指南——完整/进阶版)
作为电脑中必不可少的三大件之一(其余的两个是主板与 CPU),内存是决定系统性能的关键
设备之一,它就像一个临时的仓库,负责数据的中转、暂存……
不过,虽然内存对系统性能的至关重要,但长期以来,DIYer 并不重视内存,只是将它看作是
一种买主板和 CPU 时顺带买的“附件”,那时最多也就注意一下内存的速度。这种现象截止于
1998 年 440BX 主板上市后,PC66/100 的内存标准开始进入普通 DIYer 的视野,因为这与
选购有着直接的联系。一时间,有关内存时序参数的介绍文章大量出现(其中最为著名的恐怕就
是 CL 参数)。自那以后,DIYer 才发现,原来内存也有这么多的学问。接下来,始于 2000
年底/2001 年初的 VIA 芯片组 4 路交错(4-Way Interleave)内存控制和部分芯片组有关内
存容量限制的研究,则是深入了解内存的一个新开端。本刊在 2001 年第 2 期上也进行了 VIA
内存交错控制与内存与模组结构的详细介绍,并最终率先正确地解释了这一类型交错(内存交错
有多种类型)的原理与容量限制的原因。从那时起,很多关于内存方面的深入性文章接踵而至,
如果说那时因此而掀起了一股内存热并不夸张。大量的内存文章让更多的用户了解了内存,以及
更深一层的知识,这对于 DIY 当然是一件好事情。然而,令人遗憾的是这些所谓的内存高深技
术文章有不少都是错的(包括后来的 DDR 与 RDRAM 内存的介绍),有的甚至是很低级的错误。
在这近两年的时间里,国内媒体上优秀的内存技术文章可谓是寥若晨星,有些媒体还编译国外
DIY 网站的大篇内存文章,但可惜的是,外国网站也不见得都是对的(这一点,国内很多作者
与媒体似乎都忽视了)。就这样,虽然打开了一个新的知识领域,可“普及”的效果并不那么好,
很多媒体的铁杆读者高兴地被带入内存深层世界,但也因此被引向了新的误区。
不过,从这期间(2001 年初至今)各媒体读者对这类文章的反映来看,喜欢内存技术的玩家大
有人在且越来越多,这是各媒体“培养”的成果。这些用户已经不满足如何正确的使用内存,他们
更渴望深入的了解这方面原来非常贫乏的知识,这些知识可能暂时不会对他们在使用内存过程中
有什么帮助,但会大大满足他们的求知欲。在 2001 年初,我们揭开 VIA 芯片组 4 路交错内存
控制和部分芯片组有关内存容量限制之迷时,还是主要围绕着内存使用的相关话题来展开,而且
在这期间有关内存技术的话题,《电脑高手》也都是一笔带过。但在今天,在很多人希望了解内
存技术而众多媒体的文章又“力不从心”时,我们觉得有必要再次站出来以正视听,也就是说,我
们这次的专题不再以内存使用为中心,更多的是纯技术性介绍,并对目前现存的主要内存技术误
区进行重点纠正。
在最后要强调的是,本专题以技术为主,由于篇幅的原因,不可能从太浅的方面入手,所以仍需
要有一定的技术基础作保证,而对内存感兴趣的读者则绝不容错过,这也许是您最好的纠正错误
认识的机会!
在本专题里,当讲完内存的基本操作之后,我们会给大家讲一个仓库的故事,从中相信您会更了
解内存这个仓库是怎么工作的,希望您能喜欢。
SDRAM 内存模组的物理 Bank 与芯片位宽
虽然有关内存结构与时序的基础概念,在本刊 2001 年第 2 期的专题中就已有阐述,但在这里
为了保证专题的可读性,我们需要再次加强这方面的系统认识。正确并深刻理解内存的基础概念,
是阅读本专题的第一条件。因为即使是 RDRAM,在很多方面也是与 SDRAM 相似的,而至于
DDR 与 DDR-Ⅱ、QBM 等形式的内存更是与 SDRAM 有着紧密的联系。
SDRAM 内存模组与基本结构
我们平时看到的 SDRAM 都是以模组形式出现,为什么要做成这种形式呢?这首先要接触到两
个概念:物理 Bank 与芯片位宽。
PC133 时代的 168pin SDRAM DIMM
1、 物理 Bank
传统内存系统为了保证 CPU 的正常工作,必须一次传输完 CPU 在一个传输周期内所需要的数
据。而 CPU 在一个传输周期能接受的数据容量就是 CPU 数据总线的位宽,单位是 bit(位)。
当时控制内存与 CPU 之间数据交换的北桥芯片也因此将内存总线的数据位宽等同于 CPU 数据
总线的位宽,而这个位宽就称之为物理 Bank(Physical Bank,下文简称 P-Bank)的位宽。
所以,那时的内存必须要组织成 P-Bank 来与 CPU 打交道。资格稍老的玩家应该还记得 Pentium
刚上市时,需要两条 72pin 的 SIMM 才能启动,因为一条 72pin -SIMM 只能提供 32bit 的位
宽,不能满足 Pentium 的 64bit 数据总线的需要。直到 168pin-SDRAM DIMM 上市后,才可
以使用一条内存开机。下面将通过芯片位宽的讲述来进一步解释 P-Bank 的概念。
不过要强调一点,P-Bank 是 SDRAM 及以前传统内存家族的特有概念,在 RDRAM 中将以通
道(Channel)取代,而对于像 Intel E7500 那样的并发式多通道 DDR 系统,传统的 P-Bank
概念也不适用。
2、 芯片位宽
上文已经讲到 SDRAM 内存系统必须要组成一个 P-Bank 的位宽,才能使 CPU 正常工作,那么
这个 P-Bank 位宽怎么得到呢?这就涉及到了内存芯片的结构。
每个内存芯片也有自己的位宽,即每个传输周期能提供的数据量。理论上,完全可以做出一个位
宽为 64bit 的芯片来满足 P-Bank 的需要,但这对技术的要求很高,在成本和实用性方面也都
处于劣势。所以芯片的位宽一般都较小。台式机市场所用的 SDRAM 芯片位宽最高也就是 16bit,
常见的则是 8bit。这样,为了组成 P-Bank 所需的位宽,就需要多颗芯片并联工作。对于 16bit
芯片,需要 4 颗(4×16bit=64bit)。对于 8bit 芯片,则就需要 8 颗了。
以上就是芯片位宽、芯片数量与 P-Bank 的关系。P-Bank 其实就是一组内存芯片的集合,这个
集合的容量不限,但这个集合的总位宽必须与 CPU 数据位宽相符。随着计算机应用的发展,一
个系统只有一个 P-Bank 已经不能满足容量的需要。所以,芯片组开始可以支持多个 P-Bank,
一次选择一个 P- Bank 工作,这就有了芯片组支持多少(物理)Bank 的说法。而在 Intel 的定
义中,则称 P-Bank 为行(Row),比如 845G 芯片组支持 4 个行,也就是说它支持 4 个 P-Bank。
另外,在一些文档中,也把 P-Bank 称为 Rank(列)。
回到开头的话题,DIMM 是 SDRAM 集合形式的最终体现,每个 DIMM 至少包含一个 P-Bank
的芯片集合。在目前的 DIMM 标准中,每个模组最多可以包含两个 P-Bank 的内存芯片集合,
虽然理论上完全可以在一个 DIMM 上支持多个 P-Bank,比如 SDRAM DIMM 就有 4 个芯片选
择信号(Chip Select,简称片选或 CS),理论上可以控制 4 个 P-Bank 的芯片集合。只是由
于某种原因而没有这么去做。比如设计难度、制造成本、芯片组的配合等。至于 DIMM 的面数
与 P-Bank 数量的关系,在 2001 年 2 月的专题中已经明确了,面数≠P-Bank 数,只有在知道
芯片位宽的情况下,才能确定 P -Bank 的数量,大度 256MB 内存就是明显一例,而这种情况
在 Registered 模组中非常普遍。有关内存模组的设计,将在后面的相关章节中继续探讨。
SDRAM 芯片的预充电与刷新操作
预充电
由于 SDRAM 的寻址具体独占性,所以在进行完读写操作后,如果要对同一 L-Bank 的另一行
进行寻址,就要将原来有效(工作)的行关闭,重新发送行/列地址。L-Bank 关闭现有工作行,
准备打开新行的操作就是预充电(Precharge)。预充电可以通过命令控制,也可以通过辅助设
定让芯片在每次读写操作之后自动进行预充电。实际上,预充电是一种对工作行中所有存储体进
行数据重写,并对行地址进行复位,同时释放 S-AMP(重新加入比较电压,一般是电容电压的
1/2,以帮助判断读取数据的逻辑电平,因为 S-AMP 是通过一个参考电压与存储体位线电压的
比较来判断逻辑值的),以准备新行的工作。具体而言,就是将 S-AMP 中的数据回写,即使是
没有工作过的存储体也会因行选通而使存储电容受到干扰,所以也需要 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
的单位也是时钟周期数,具体值视时钟频率而定。
读取时预充电时序图(上图可点击放大):图中设定:CL=2、BL=4、tRP=2。自动预充电时
的开始时间与此图一样,只是没有了单独的预充电命令,并在发出读取命令时,A10 地址线要
设为高电平(允许自动预充电)。可见控制好预充电启动时间很重要,它可以在读取操作结束后
立刻进入新行的寻址,保证运行效率。
误区:读写情况下都要考虑写回延迟
有些文章强调由于写回操作而使读/写操作后都有一定的延迟,但从本文的介绍中写可以看出,即使是读
后立即重写的设计,由于是与数据输出同步进行,并不存在延迟。只有在写操作后进行其他的操作时,才
会有这方面的影响。写操作虽然是 0 延迟进行,但每笔数据的真正写入则需要一个足够的周期来保证,这
段时间就是写回周期(tWR)。所以预充电不能与写操作同时进行,必须要在 tWR 之后才能发出预充电
命令,以确保数据的可靠写入,否则重写的数据可能是错的,这就造成了写回延迟。
数据写入时预充电操作时序图(可点击放大):注意其中的 tWR 参数,由于它的存在,使预充电操作延后,
从而造成写回延迟
刷新
之所以称为 DRAM,就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是 DRAM
最重要的操作。
刷新操作与预充电中重写的操作一样,都是用 S-AMP 先读再写。但为什么有预充电操作还要进
行刷新呢?因为预充电是对一个或所有 L-Bank 中的工作行操作,并且是不定期的,而刷新则是
有固定的周期,依次对所有行进行操作,以保留那些久久没经历重写的存储体中的数据。但与所
有 L-Bank 预充电不同的是,这里的行是指所有 L-Bank 中地址相同的行,而预充电中各 L-Bank
中的工作行地址并不是一定是相同的。
那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是
64ms(毫秒,1/1000 秒),也就是说每一行刷新的循环周期是 64ms。这样刷新速度就是:
行数量/64ms。我们在看内存规格时,经常会看到 4096 Refresh Cycles/64ms 或 8192
Refresh Cycles/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(Suspend to
RAM,休眠挂起于内存)。在发出 AR 命令时,将 CKE 置于无效状态,就进入了 SR 模式,此
时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在 SR 期间除了 CKE 之外的所
有外部信号都是无效的(无需外部提供刷新指令),只有重新使 CKE 有效才能退出自刷新模式
并进入正常操作状态。
数据掩码
在讲述读/写操作时,我们谈到了突发长度。如果 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 与写入命令
一样是立即成效。
读取时数据掩码操作,DQM 在两个周期后生效,突发周期的第二笔数据被取消(上图可点击放
大)
写入时数据掩码操作,DQM 立即生效,突发周期的第二笔数据被取消(上图可点击放大)
有关内存内部的基本操作就到此结束,其实还有很多内存的操作没有描述,但都不是很重要了,
限于篇幅与必要性,我们不在此介绍,有兴趣的读者可以自行查看相关资料。
SDRAM 的逻辑 Bank 与芯片容量表示方法
1、逻辑 Bank 与芯片位宽
讲完 SDRAM 的外在形式,就该深入了解 SDRAM 的内部结构了。这里主要的概念就是逻辑
Bank。简单地说,SDRAM 的内部是一个存储阵列。因为如果是管道式存储(就如排队买票),
就很难做到随机访问了。
阵列就如同表格一样,将数据“填”进去,你可以把它想象成一张表格。和表格的检索原理一样,
先指定一个行(Row),再指定一个列(Column),我们就可以准确地找到所需要的单元格,
这就是内存芯片寻址的基本原理。对于内存,这个单元格可称为存储单元,那么这个表格(存储
阵列)叫什么呢?它就是逻辑 Bank(Logical Bank,下文简称 L-Bank)。
L-Bank 存储阵列示意图
由于技术、成本等原因,不可能只做一个全容量的 L-Bank,而且最重要的是,由于 SDRAM 的
工作原理限制,单一的 L-Bank 将会造成非常严重的寻址冲突,大幅降低内存效率(在后文中将
详细讲述)。所以人们在 SDRAM 内部分割成多个 L-Bank,较早以前是两个,目前基本都是 4
个,这也是 SDRAM 规范中的最高 L-Bank 数量。到了 RDRAM 则最多达到了 32 个,在最新
DDR-Ⅱ的标准中,L-Bank 的数量也提高到了 8 个。
这样,在进行寻址时就要先确定是哪个 L-Bank,然后再在这个选定的 L-Bank 中选择相应的行
与列进行寻址。可见对内存的访问,一次只能是一个 L- Bank 工作,而每次与北桥交换的数据
就是 L-Bank 存储阵列中一个“存储单元”的容量。在某些厂商的表述中,将 L-Bank 中的存储单
元称为 Word (此处代表位的集合而不是字节的集合)。