多模块存储器

中优先级
本节的内容会在选择题和解答题中偶尔考察,并且考查方式经常涉及到地址和容量计算,要对多模态存储器的计算流程非常熟悉。

多模块存储器(Multi-module Memory)是指利用多个结构相同的存储模块(或存储芯片)共同构成一个主存系统。

采用多个存储模块主要有两类目的:

  1. 提高主存的访问性能
    • 单体多字存储器
    • 多体交叉存储器
      • 高位交叉编址
      • 低位交叉编址
  2. 扩大主存容量
    • 位扩展
    • 字扩展
    • 字位扩展

虽然这两类技术都使用多个存储模块,但它们的设计目标完全不同:

  • 单体多字存储器多体交叉存储器 的目的是提高主存的带宽和吞吐率
  • 位扩展、字扩展和字位扩展 的目的是扩大主存的字长或容量
多模块存储器多个结构相同的存储模块 → 主存系统若干存储模块按设计目标分为两类提升访问性能(带宽 / 吞吐率)扩大一次访问的数据量或并行处理请求扩大主存容量(字长 / 字数)连接多个芯片,突破单芯片规格限制单体多字存储器一个地址存放 n 个连续字多体交叉存储器多个存储体并行 / 交替工作高位交叉编址(串行)低位交叉编址(并行)位扩展扩展字长(低位编址)字扩展扩展字数(高位编址)字位扩展同时扩展字长与字数左侧:不增加容量,靠并行 / 宽数据通路提升访存效率右侧:不改变访存速度,靠拼接芯片扩大总容量或字长

因此,本节也将分别介绍这两类技术。

单体多字存储器

在介绍单体多字存储器之前,需要先明确一个概念。

通常情况下,一个地址只能对应一个存储字(Word)(这里假设采用 按字编址)。例如,一个字长为 32 位 的存储器:

地址数据地址数据地址数据地址数据
0Word01Word12Word23Word3

CPU 每发出一个地址,只能读出 一个字(32 位)


单体多字存储器 则是在一个地址下,同时存放多个连续的存储字。

假设每个字仍然为 m 位,但每个地址对应 n 个连续的字,则:

地址数据
0Word0、Word1、Word2、Word3
1Word4、Word5、Word6、Word7
2Word8、Word9、Word10、Word11

例如,当 n=4 时,CPU 发出一次地址访问,就能够一次读出 4 个连续的字(共 4m 位)。

CPU发出一个地址地址总线数据总线宽度 = n×m 位单体多字存储器(每行 n 个字)地址存储字(每字 m 位,共 n=4 字)0Word0Word1Word2Word31Word4Word5Word6Word72Word8Word9Word10Word113一次访问返回 n 个字特点• 每个地址存放 n 个连续存储字(图中 n=4)• 数据总线加宽为 n×m 位,一次取回 n 个字• 理论带宽提升到原来的 n 倍• 仅对顺序访问有效;随机/非连续访问无并行收益普通存储器一个地址 → 一个字(m 位)数据总线宽度 = m 位单体多字存储器一个地址 → n 个字数据总线宽度 = n×m 位带宽 ≈ ×n(仅顺序)

因此:

  • 每个地址对应 n 个连续的字
  • 一个地址访问即可返回 n 个字
  • 数据总线宽度需要扩大为 n×m 位
  • 理论上,存储器带宽可以提高 n 倍

这种方式本质上是扩大一次访问的数据宽度,而不是让多个存储模块并行处理不同的访问请求。

由于单体多字存储器一次返回的是 固定连续的 n 个字,因此它只能提高顺序访问时的数据传输效率,对于多个独立地址的访问无法提高并行性。

考试中一般只需了解其基本思想即可,真正的重点是 多体交叉存储器,它利用多个存储模块并行工作来提高主存的访问带宽。

多体交叉存储器

多体交叉存储器 的设计中,为了提高存储系统的并行性和带宽,常采用 交叉编址 的方式将主存划分为多个 存储体(memory bank)。根据地址在各存储体之间的分布方式,交叉编址又分为 高位交叉编址低位交叉编址 两种。

高位交叉编址

高位交叉编址 中,地址的高位 用于选择 存储体低位 表示在该存储体中的偏移地址。

例如:若系统有 4 个存储体,地址空间大小为 4n,则:

  • 地址 0 ~ n−1 存储在 M0
  • 地址 n ~ 2n−1 存储在 M1
  • 地址 2n ~ 3n−1 存储在 M2
  • 地址 3n ~ 4n−1 存储在 M3

也就是说,一整个存储体连续存储一段地址空间,相邻地址数据往往在同一个存储体中。如下图所示:

M0
M1
M2
M3
体号
体内地址
地址译码
地址
高位交叉编址
0
1
n-1
n
n+1
2n-1
2n
2n+1
3n-1
4n-1
3n
3n+1

由于这种方式下,相邻数据集中在一个存储体中,多个存储体无法并行工作,而是 串行工作

  • 所有存储体共用一个 地址寄存器(AR)数据寄存器(DR)
  • 每次只能访问一个存储体,其它存储体处于空闲状态。

这种串行访问的结构较为简单,适用于对并行性能要求不高的场景,但 无法提升带宽或访问效率,无法发挥出多体结构的优势。

M0M1M2M3DR地址总线单字长数据总线AR
注意

高位交叉编址 尽管名称中带有"交叉",但实际上地址在各存储体之间是按连续区间分布的,因此不少教材也称其为 高位连续编址

国内《计算机组成原理》教材(如唐朔飞、白中英、王道等)通常都是这样分类:

多体存储器

  • 高位交叉编址
  • 低位交叉编址

这里的"交叉"实际上指的是:

多体存储器的一种编址方式

而不是说数据一定是交替存放的。

低位交叉编址

低位交叉编址 中,地址的低位 用于选择 存储体高位 用于标识该存储体内的偏移地址。

以 4 个存储体为例,地址 0~3 分别对应 M0、M1、M2、M3,地址 4~7 也分别映射到 M0~M3,以此类推。这样就实现了 相邻地址分散存储在不同存储体中 的效果:

M0
0
4
4n-4
M1
1
5
4n-3
M2
2
6
4n-2
M3
3
7
4n-1
体号
体内地址
地址译码
地址
低位交叉编址

在这种方式下,多个存储体可以 并行工作,大大提高了访问效率。但为了支持并行,每个存储体 都需配备自己的地址寄存器和数据寄存器,如下图所示:

M0M1M2M3ARARARARDRDRDRDR地址总线单字长数据总线

并行性

低位交叉编址 中,相邻地址的数据分布在不同的存储体中,因此多个存储体可以交替处理连续的访存请求。这种工作方式与 指令流水线 十分相似,可以显著提高主存的访问带宽。

要理解低位交叉存储器为什么能够实现这种并行访问,首先需要了解 存储周期 的概念。

存储周期 是指某个存储体从开始一次读/写操作,到能够再次接受下一次访问请求所需要的最短时间。

例如,一个存储体的存储周期为 40 ns,意味着:

  • 0 ns 开始访问该存储体;
  • 在接下来的 40 ns 内,该存储体一直处于忙碌状态,不能再次被访问;
  • 只有到 40 ns 后,才能再次访问该存储体。
MemorybankM0...t0 ns40 ns忙碌 (Busy)该存储体正在执行当前访问,无法响应新的请求可再次访问完成后重新就绪第 1 次访问开始最早可发起第 2 次访问存储周期 T从开始一次访问到能再次接受访问所需的最短时间

如果系统只有 一个存储体,那么 CPU 连续访问相邻地址时,就必须等待该存储体完成当前访问后才能开始下一次访问,因此连续两次访存之间的最短间隔就是 存储周期

而在 低位交叉编址 中,连续地址会被轮流分配到不同的存储体。例如对于四体交叉存储器:

  • 地址 0 → M0
  • 地址 1 → M1
  • 地址 2 → M2
  • 地址 3 → M3
  • 地址 4 → M0

这样,当 M0 正在执行一次访存时,CPU 可以立即向 M1M2M3 发起新的访存请求,而无需等待 M0 完成。当再次轮到访问 M0 时,它通常已经完成了上一轮访问,因此不会发生冲突。

req 0 → M0req 1 → M1req 2 → M2req 3 → M3M0M1M2M3M0 忙 (访问地址 0)M0 忙 (访问地址 4)M1 忙 (访问地址 1)M1 忙 (地址 5) ...M2 忙 (访问地址 2)M2 (地址 6) ...M3 忙 (访问地址 3)M3 ...t0T/42T/43T/4T5T/46T/47T/42TT / n存储周期 Tn = 4 体低位交叉存储器• 单体仍需完整周期 T 才能再次接受访问• 相邻地址被分散到不同存储体,M0~M3 可交错并行• CPU 每 T/n 就能收到一次数据 → 带宽提升约 n 倍

设主存共有 个存储体,每个存储体的存储周期为 ,则在理想情况下,系统可以实现:

也就是说:

  • 为单个存储体的存储周期;
  • 为存储体数量;

因此,整个主存系统可以平均每 秒连续输出一个字的数据,主存带宽相比单体存储器提高了约

这种并行访问之所以能够实现,是因为一次访存过程实际上可以 划分为多个阶段。为了便于分析,通常将一次读取操作抽象为三个阶段:

  1. :送地址和读命令(将地址送入存储器 AR
  2. :存储体内部完成读操作(数据读入 DR,该阶段耗时最长,也是存储周期的主要组成部分)
  3. :将数据从 DR 传送给 CPU

由于不同存储体相互独立,当一个存储体仍处于 阶段时,CPU 已经可以开始向另一个存储体执行 。于是多个存储体的不同阶段便可以相互重叠执行,其执行过程与指令流水线十分相似。

假设 CPU 的时钟周期为 ,其中:

  • 耗时
  • 耗时
  • 耗时

则对于四体交叉存储器,连续读取八个字的数据时,其流水线执行过程如下图所示:

M0M1M2M3M0M1M2M3存储体号时钟周期123456789101112P1P2P3P1P2P3P1P2P3P1P2P3P1P2P3P1P2P3P1P2P3P1P2P313

可以看到,虽然每个存储体仍然需要较长的存储周期才能完成一次访问,但多个存储体的访问过程彼此交错、重叠执行,因此主存能够持续不断地向 CPU 输出数据,从而显著提高整体的吞吐率

主存容量的扩展

在设计计算机存储系统时,单个存储芯片的容量和字长往往无法直接满足系统需求。例如,CPU 可能要求主存具有更大的存储容量,或者一次能够读写更宽的数据,而单个存储芯片只能提供有限的 存储字数字长。因此,需要将多个存储芯片按照一定方式组合起来,构成满足要求的主存,这一过程称为 主存容量的扩展

设某存储芯片具有:

  • 存储字数
  • 字长

则该存储芯片可表示为:

即共有 个存储单元,每个存储单元存放 数据。

storage chip

根据扩展目标的不同,主存容量扩展主要分为三种方式:

  • 位扩展:保持存储字数不变,扩展每个存储字的位数(字长)。
  • 字扩展:保持字长不变,扩展存储字数(地址空间)。
  • 字位扩展:同时扩展字长和存储字数。
位扩展法

bit expand

字扩展法

word expand

字位扩展法

bit word expand

补充

主存扩展和多体交叉存储器有什么关系

多体交叉存储器主存扩展 都需要使用多个存储模块(或存储芯片),因此都会涉及 高位编址低位编址 的地址分配方式。但两者的设计目标完全不同:

  • 多体交叉存储器:通过将地址分布到多个存储体,提高主存的访问带宽和吞吐率
  • 主存扩展:通过连接多个存储芯片,扩大主存的容量或字长

由于地址映射方式相同,因此主存扩展中也可以借用前面介绍的 高位编址低位编址 来理解:

  • 位扩展 采用 低位编址。多个存储芯片并行工作,共同组成一个更宽的数据字。
  • 字扩展 采用 高位编址。高位地址用于选择存储芯片,低位地址作为芯片内部地址。
  • 字位扩展 同时进行位扩展和字扩展,因此同时采用高位和低位编址。

位扩展

位扩展 是指:在 存储字数不变 的前提下,增加每个存储字的 位数,也就是扩展存储器的 字长

例如,要用若干片 的存储芯片构成 的存储器:

  • 原芯片:共有 个存储单元,每个单元
  • 目标存储器:仍然有 个存储单元,但每个单元变为

因此,存储字数没有变化,只是每个存储字从 扩展到 ,这就是 位扩展

16K× 8WEACS16K× 8WEACS16K× 8WEACS16K× 8WEACSCPUR/W#A15-0D31-0D7~D0D15~D8D23~D16D31~D24

需要的芯片数量为:

也就是说,需要 4 片 的芯片并行工作,共同组成一个 的存储器。

由于是 位扩展,所以 4 片芯片在逻辑上对应同一个地址范围。CPU 每访问一个地址,4 片芯片都要同时被选中:

  • 4 片芯片的 片选信号连接在一起,并处于常有效状态;
  • 4 片芯片的 地址线连接相同的地址信号
  • 每片芯片提供 数据中的

因此,一次访问时:

  • 第 1 片芯片提供
  • 第 2 片芯片提供
  • 第 3 片芯片提供
  • 第 4 片芯片提供

这样,4 片芯片并行输出,就能共同组成一个 的存储字。

需要注意的是,如果目标存储器按 字节编址,那么 的存储器总容量为:

所以 CPU 需要 根地址线,即

但是,每片 的芯片内部只有 个存储单元,因此只需要:

根地址线。

由于目标存储器每个存储字为 ,CPU 地址中的低两位 用来表示一个 32 位字内部的 4 个字节偏移,因此不接入芯片地址端。

所以,芯片实际使用的地址线是:

也就是说:

  • :用于选择芯片内部的 个存储单元;
  • :表示字内字节偏移,不参与芯片内部寻址;
  • 4 片芯片并行工作,共同扩展数据位宽。
注意

需要注意的是,位扩展只是多个芯片共同组成同一个存储字,并不是一次返回多个连续的存储字,因此与单体多字存储器不同。CPU 一次访问仍然只读出一个 Word,只不过这个 Word 的位数变宽了。

字扩展

字扩展 是指:在 每个存储字位数不变 的前提下,增加存储器的 存储字数,也就是扩展存储器的地址范围。

例如,要用若干片 的存储芯片构成 的存储器:

  • 原芯片:共有 个存储单元,每个单元
  • 目标存储器:共有 个存储单元,每个单元仍然是

因此,存储字长没有变化,只是存储字数从 扩展到 ,这就是 字扩展

16K× 8(0)WEACS16K× 8(1)WEACS16K× 8(2)WEACS16K× 8(3)WEACSCPUR/W#A15-0D7-0D7~D0D7~D0D7~D0D7~D0ramsel 0ramsel 1ramsel 2ramsel 3MREQ#A15-14

需要的芯片数量为:

也就是说,需要 4 片 的芯片分别负责不同的地址范围。

目标存储器共有 个地址单元,因此需要:

根地址线,即

每片 芯片内部有 个存储单元,因此每片芯片内部寻址只需要:

根地址线。

所以:

  • 低 14 位地址线 接到每片芯片的地址端,用于芯片内部寻址;
  • 高 2 位地址线 接到片选译码器,用于选择当前访问哪一片芯片。

由于 4 片芯片分别对应 4 个连续的 地址空间,所以高两位地址可以区分这 4 片芯片:

高位地址 被选中的芯片地址范围
第 1 片
第 2 片
第 3 片
第 4 片

因此,在 字扩展 中:

  • 数据线位数不变,仍然是
  • 地址范围扩大;
  • 同一时刻只有一片芯片被片选信号选中;
  • 高位地址线通常用于产生片选信号。

字位扩展

字位扩展 是指:同时扩展存储器的 存储字数存储字长

也就是说,目标存储器相比原存储芯片:

  • 地址范围更大;
  • 每个存储字的位数也更宽。

例如,要用若干片 的存储芯片构成 的存储器:

  • 原芯片:共有 个存储单元,每个单元
  • 目标存储器:共有 个存储单元,每个单元

因此,这里既要把存储字数从 扩展到 ,又要把字长从 扩展到 ,所以属于 字位扩展

16K× 8(0)WEACS16K× 8(1)WEACS16K× 8(2)WEACS16K× 8(3)WEACSCPUR/W#A15-0D7~D0D7~D0D15~D8D15~D8ramsel 0ramsel 1MREQ#A15D15-0

需要的芯片数量为:

可以把这 4 片芯片分成两组:

  • 每组 2 片芯片并行工作,用来把字长从 扩展到
  • 共 2 组芯片,用来把存储字数从 扩展到

也就是说:

其中:

  • 一个 用于 位扩展
  • 一个 用于 字扩展

目标存储器容量为:

如果按 字节编址,则 CPU 需要:

根地址线,即

每片 芯片内部有 个存储单元,因此每片芯片内部寻址需要 14 根地址线。

由于目标存储器每个存储字为 ,所以最低位地址线 用来表示一个 16 位字内部的字节偏移,不接入芯片地址端。

因此,芯片内部地址线使用:

高位地址线 用来区分两组芯片,产生片选信号:

高位地址 被选中的芯片组地址范围
第 1 组 个 16 位字
第 2 组 个 16 位字

每组内部的两片芯片并行工作:

  • 一片提供
  • 一片提供

因此,在 字位扩展 中:

  • 通过并联芯片的数据线实现 位扩展
  • 通过高位地址线和片选译码实现 字扩展
  • 同一时刻只选中一个芯片组;
  • 被选中的芯片组内部,多个芯片并行工作,共同组成更宽的数据字。