3、地址映射原理:CPU视角的线性地址
好,咱们今天聊聊地址映射。说实话,这是DDR设计里最容易让人头晕的部分,但也是最有意思的。
你想想看,CPU是个很“单纯”的家伙。它只知道线性地址——从0x00000000到0xFFFFFFFF,一路排过去。但DDR颗粒内部呢?是个三维结构:Bank、Row、Column。这就像你要把一条直线上的门牌号,映射到一个立体停车场的车位编号上。怎么映射?这就是地址映射要干的事。
CPU视角:线性地址空间
CPU看内存,就是一大块连续的地址空间。比如一个32位CPU,能访问4GB空间。它发出一个地址,比如0x12345678,就希望从内存里拿到这个地址对应的数据。
但DDR控制器拿到这个地址后,不会直接去“0x12345678”这个位置找数据——因为DDR颗粒里根本没有这个地址。控制器需要把这个线性地址,拆解成Bank号、Row地址、Column地址。
核心概念:线性地址 → 控制器拆解 → Bank/Row/Column
DDR控制器:地址翻译官
DDR控制器就像个翻译官。它拿到CPU的线性地址,然后按照一定的规则,把地址的某些位分配给Bank,某些位给Row,某些位给Column。
我个人习惯把地址映射想象成“切蛋糕”。比如一个32位地址,我可能会这样切:
- Bit[31:28]:保留或用于片选(多个DDR颗粒时)
- Bit[27:20]:Bank地址(8位,支持256个Bank?不,实际没那么多,这里只是举例)
- Bit[19:10]:Row地址(10位,1024行)
- Bit[9:2]:Column地址(8位,256列)
- Bit[1:0]:字节使能(用于访问粒度)
嗯,这里要注意:实际项目中,Bank地址通常只有2~3位(支持4~8个Bank),Row地址和Column地址的位数取决于DDR颗粒的规格。
地址映射的数学公式
说白了,地址映射就是个位宽分配的问题。假设总地址位宽为N位,那么:
Bank位宽 = log2( Bank数量 )
Row位宽 = log2( Row数量 )
Column位宽 = log2( Column数量 )
字节偏移位宽 = log2( 数据总线宽度 / 8 )
总位宽 = Bank位宽 + Row位宽 + Column位宽 + 字节偏移位宽
举个例子。一个DDR3-1600颗粒,规格是8个Bank,每个Bank有8192行,每行有1024列,数据总线宽度16位。那么:
| 参数 | 数值 | 位宽 |
|---|---|---|
| Bank数量 | 8 | 3位 |
| Row数量 | 8192 | 13位 |
| Column数量 | 1024 | 10位 |
| 字节偏移 | 2字节(16位总线) | 1位 |
| 总计 | 27位 |
所以,CPU发出的27位地址,会被DDR控制器这样解析:
地址[26:24] → Bank地址(3位)
地址[23:11] → Row地址(13位)
地址[10:1] → Column地址(10位)
地址[0] → 字节偏移(1位)
避坑指南:我曾经在一个项目里,把Bank地址和Row地址的位宽分配反了。结果系统跑起来后,访问某些地址时性能奇差。后来才发现,因为Bank切换太频繁,导致预充电和激活操作过多。嗯,从那以后,我每次做地址映射都会先画个位宽分配表。
地址映射的SVG结构图
下面这张图,展示了线性地址到DDR内部结构的映射关系。我建议你仔细看看,尤其是位宽分配的部分。
重要提醒:地址映射的位宽分配不是固定的。不同的DDR控制器、不同的颗粒规格、甚至不同的系统设计,都会影响位宽分配。我见过一些新手直接照搬参考设计,结果在自家板子上跑不起来。记住:一定要根据你的DDR颗粒数据手册来配置。
实际项目中的地址映射策略
在真实项目中,地址映射还有个关键点:Bank地址的位置。你想想看,如果把Bank地址放在高位,那么连续访问时就会频繁切换Bank。如果把Bank地址放在低位,连续访问时就会在同一个Bank里跳来跳去。
这两种策略各有优劣:
- Bank地址在高位:适合随机访问场景,因为每次访问都可能切换到不同Bank,可以利用Bank并行性
- Bank地址在低位:适合顺序访问场景,因为连续地址落在同一个Bank里,可以减少Bank切换开销
我个人习惯的做法是:先看应用场景。如果是视频处理这种顺序访问多的,就把Bank地址放低位。如果是数据库这种随机访问多的,就把Bank地址放高位。没有绝对的对错,只有合不合适。
小技巧:很多DDR控制器允许你通过寄存器配置地址映射方式。我建议你在设计初期就留出这个配置接口,方便后期调优。我曾经在一个项目里,就因为没留这个接口,后期改版多花了两周时间。
好了,地址映射的原理就聊到这儿。说白了,就是CPU的线性地址和DDR的三维结构之间的一个“翻译”过程。理解了这个,后面讲时序、讲带宽优化,你就能更容易跟上。
公众号:蓝海资料掘金营,微信deep3321