第四节:读写操作与突发传输
好,咱们今天聊聊DRAM读写操作里最核心的几个概念。说实话,我刚入行那会儿,总觉得读延迟、写延迟这些参数就是查查数据表的事。直到有一次调试一个DDR3控制器,发现数据总对不上,折腾了两天才意识到是CL和CWL的匹配出了问题。从那以后,我对这些参数就格外上心了。
4.1 读命令与读延迟(CL)
读延迟(CAS Latency,CL)是什么?说白了,就是你给DRAM发了一个读命令,到数据真正出现在DQ引脚上,中间要等多少个时钟周期。这个等待时间就是CL。
关键理解:CL不是延迟时间本身,而是时钟周期数。比如CL=11,在800MHz的时钟下,实际延迟是11 × 1.25ns = 13.75ns。
我个人的习惯是,在设计控制器时,先把CL值当作一个可配置参数。为什么?因为不同频率下,DRAM要求的CL值不一样。你想想看,频率高了,一个周期的时间变短,CL值就得相应增加,才能保证实际的绝对延迟时间满足DRAM内部的要求。
读操作的时序流程大致是这样的:
- 控制器发送读命令(READ)和列地址
- DRAM内部开始读取存储单元的数据
- 经过CL个时钟周期后,数据出现在DQ总线上
- 控制器在随后的每个时钟沿采样数据
避坑指南:我曾经在一个项目里,把CL设成了最小值,结果读回来的数据全是乱的。后来发现,PCB走线长了,信号完整性变差,必须增加CL来给数据足够的稳定时间。所以,CL不是越小越好,得综合考虑你的硬件环境。
4.2 写命令与写延迟(CWL)
写延迟(CAS Write Latency,CWL)和CL类似,但方向相反。它是指从写命令发出到第一个写入数据出现在DQ引脚上之间的时钟周期数。
这里有个有意思的点:CL和CWL通常不相等。在DDR3和DDR4中,CWL一般比CL小1到2个周期。为什么会这样?因为写操作时,DRAM内部不需要像读操作那样花时间把数据从存储单元搬到I/O口,数据是直接写进去的,所以延迟可以更短。
| 参数 | 典型值(DDR4-2400) | 说明 |
|---|---|---|
| CL | 17 | 读命令到数据输出 |
| CWL | 14 | 写命令到数据输入 |
| 差值 | 3 | CL - CWL |
嗯,这里要注意:写操作还有一个叫「写恢复时间」(tWR)的参数,它是指最后一个写入数据到预充电命令之间的最小间隔。这个和CWL是两码事,别搞混了。
4.3 突发长度(BL8/BL4)与突发切换
突发传输是DRAM提高带宽的利器。你想想看,如果每次读写只传一个数据,那大部分时间都花在命令和地址传输上了,效率极低。突发传输允许一次命令连续传输多个数据。
DDR3和DDR4支持两种突发长度:
- BL4(Burst Length 4):一次传输4个数据
- BL8(Burst Length 8):一次传输8个数据
我个人建议,在大多数场景下用BL8。为什么?因为DDR内部存储阵列的预取宽度是2n(DDR3是8n,DDR4是16n),BL8能充分利用这个预取宽度,达到最高效率。
突发切换的规则:
- 同一行(Row)内可以连续发多个突发命令
- 不同行之间需要先发预充电(PRE)和激活(ACT)命令
- BL8和BL4可以在模式寄存器中配置,但不能在运行中动态切换
我记得有一次做视频缓存设计,需要频繁读写小数据块。一开始用了BL8,结果每次只用到前两个数据,后面六个都浪费了。后来改成BL4,效率反而提升了30%。所以,突发长度的选择要看你的数据粒度。
4.4 数据掩码(DM)应用
数据掩码(Data Mask,DM)是个很实用的功能。它允许你在写操作时,选择性地屏蔽某些字节,不让它们写入DRAM。
在DDR3中,DM是单独的引脚。到了DDR4,DM被DMI(Data Mask Inversion)替代了,功能更强大,但基本原理一样。
DM的应用场景:
- 部分写入:比如你只想修改一个32位数据中的低8位,其他位保持不变
- 数据对齐:当数据宽度和DRAM位宽不匹配时,用DM来屏蔽无效字节
- ECC校验:某些ECC方案需要DM来标记校验位区域
注意:DM信号必须在写数据发送的同时有效。也就是说,在CWL之后,数据开始出现在DQ上时,DM就要同步生效。我曾经犯过一个错误,把DM的时序算错了半个周期,结果数据写进去全是乱的,排查了好久才发现是DM的setup time违例了。
4.5 知识体系总览
下面这张图是我自己整理的读写操作知识结构,你可以对照着理解各个概念之间的关系:
这张图把读操作、写操作、突发传输和数据掩码四个核心模块串在了一起。你仔细看就会发现,CL和CWL是时序的基础,突发长度决定了数据传输的粒度,而数据掩码则提供了更灵活的数据控制能力。这四个方面缺一不可,共同构成了DRAM控制器的读写操作框架。
我的建议:刚开始设计DRAM控制器时,先把CL和CWL的时序关系搞清楚。用Verilog写一个简单的状态机,模拟读操作和写操作的时序,跑一遍仿真看看波形。等这些基础概念熟练了,再考虑突发切换和数据掩码这些进阶功能。一步一步来,别着急。
公众号:蓝海资料掘金营,微信deep3321