第2章:LPDDR4基本架构与工作原理
今天我们来聊聊LPDDR4的内部架构。这东西看着复杂,其实拆开来看就清楚了。我刚开始接触DDR时,也老觉得Bank、Row、Column这些概念绕来绕去,后来亲手调了几个项目才真正明白——说白了,它就是内存的存储核心。
2.1 宏观架构:从Channel到Die
LPDDR4和我们常见的DDR4有个很大的不同——它物理上就是一个双通道的设备。什么意思?一颗LPDDR4芯片内部其实藏着两个独立的Die,每个Die都是一个完整的存储子系统。我习惯把它比喻成“一条双车道的公路”。
- Channel:每个Die对应一个独立的通道(Channel 0和Channel 1)。通道之间完全隔离,互不影响。
- Die:每颗Die内部有它自己的控制逻辑、地址总线、数据总线。你在PCB上看到的是一颗芯片,实际上它等于两颗芯片。
- Rank:每个Die可以有一个或多个Rank。Rank是片选的粒度,一个Rank共享时钟、命令和地址总线,但独立使用片选信号CS。
2.2 逻辑组织:Bank、Row、Column
好,这一层才是真正的存储核心。每个Rank内部由若干个Bank组成。LPDDR4采用了8-bank架构,同时引入了Bank Group的概念。为什么要这样?你想想看,如果只有一个Bank,每次访问都得等它激活完才能操作——太慢了。
Bank内部又是怎么组织的?每个Bank就像一个二维表格。Row是行地址,Column是列地址。一个Row对应一行存储单元,长度一般就是DDR的数据位宽。举个例子:
假设某颗LPDDR4芯片:
- Row地址宽度:16位(2^16 = 65536行)
- Column地址宽度:10位(2^10 = 1024列)
- Bank Group:4组
- 每组Bank Group包含4个Bank
所以总存储容量 = 4 × 4 × 65536 × 1024 × 16位(每列数据宽度16bit)
一句话总结:Bank Group是为了提高并发度。不同Bank Group之间的Bank可以并行操作,同一Bank Group内的Bank则受限于共享的读写总线。
2.3 关键设计概念:预取16n
LPDDR4的另一个重要特性是预取16n。什么意思呢?每次内部访问,Memory Cell会一次性读取16bit数据到SA(Sense Amplifier),然后再分多次送到IO总线上。
我举个例子就容易理解了。假设你访问一个Column地址,LPDDR4内部实际上会读取连续的16个Column,然后通过数据选择电路把你要的那个Column数据送出来。为什么这样设计?因为核心频率其实做不高,但IO频率可以很高。预取就是在核心速度和IO速度之间做平衡。
我在优化带宽时遇到过一个问题:如果地址总是不连续,预取的16个Column里只有1个有用——效率直接掉到1/16。后来我们强制改成顺序访问,带宽提升了近3倍。
注意:预取16n意味着你读一个地址,芯片内部动了16个Column。如果其他Bank正在操作同一行地址的相邻Column,可能会引发冲突。调试时遇到奇怪的数据错误,先查查地址映射有没有打乱。
2.4 控制信号与基本操作时序
LPDDR4的操作可以拆成几个基本命令:
| 命令 | 作用 | 典型时序参数 |
|---|---|---|
| ACTIVATE | 激活一行(打开Row) | tRCD:15~18ns |
| READ | 读取列数据 | tCL:16~28时钟周期 |
| WRITE | 写入列数据 | tWL:14~24时钟周期 |
| PRECHARGE | 关闭当前行 | tRP:15~18ns |
| REFRESH | 刷新所有行 | tRFC:130~350ns |
这里的时序参数单位有时是时钟周期,有时是ns,要看具体数据手册。我建议调试时先确认tRCD和tRP,这两个参数最容易出错。我曾因为tRCD配短了2ns,导致芯片在高温下唤醒后概率性死机。
2.5 内部组织与地址映射
LPDDR4的地址映射顺序也有讲究。一般是从最小的粒度开始:
- Col(列地址)
- Bank Group内的Bank(Bank Group内Bank选择)
- Row(行地址,跨Bank共享)
- Bank Group(高优先级Bank选择,用于并行操作)
- Rank(片选)
- Byte Lane(如果存在多通道,则增加Channel选择)
这种映射顺序是为了最大化Bank的利用率和预取效率。不过,具体实现每个IP vendor可能略有不同。调试时最好从Memory Controller的配置寄存器里读出来确认一遍。
这张图把LPDDR4的内部层次串在一起了。从顶层的双通道芯片,逐层拆到Die、Rank、Bank Group、Bank,最后落到Row和Column。你调试时遇到唤醒失败,按照这个层次一步步排查——先确认通道是否都起来,再看Rank片选,然后检查Bank Group有没有正确激活,最后定位到具体的Row/Column操作。
记得我有个项目,芯片在低温下唤醒失败,排查到最后发现是Rank 1的CS信号时序不满足保持时间。那问题藏得很深,要是没有这张架构图帮忙定位,估计得花好几周。