DDR工作原理和行为特性

Posted by 程建军 on Tuesday, April 23, 2024

DDR工作原理和行为特性

DDR工作原理和行为特性

第1章 ddr行为介绍

DDR的全称为Double Data Rate SDRAM(双倍速率的SDRAM),就是我们平时说的内存颗粒,也就是内存芯片。 时钟的上升沿和下降沿都可以传输数据。

1.1 ddr的内部结构

一个典型的ddr内部结构如图 图 1.1 所示。

图 1.1

ddr内部包含多个bank,每个bank通过解析row和column确定存储单元格。 ddr地址中可以解析出以上信息。

一个bank中一次只允许激活一个row。激活新的row,需要使用PRECHARGE命令关闭旧的row, 再使用ACTIVE命令选中bank,激活新的row。

bank和bank之间是互相独立的,允许多个bank被打开。

1.2 ddr的基本命令

图 1.2 包含了ddr的基本命令。

图 1.2

ddr refresh的原因:ddr的存储器件是电容,由于漏电流的存在,长时间不操作,电容里的电荷会逐渐流失。 所以需要每隔一段时间进行刷新,也就是充电。

1.3 ddr的突发

ddr存在突发行为,图 1.3 展示了ddr的突发长度。

图 1.3

ddr的读写操作通常都是burst操作,长度一般为4或者8。

突发长度为4时,存在两种模式:

  • sequential顺序模式:
    以0、1、2、3为起点,顺序递增,4为wrap边界。
  • interleave交错模式:
    以0、1、2、3为起点,顺序递减,4为wrap边界。

突发长度为8时,存在两种模式:

  • sequential顺序模式:
    以0、1、2、3、4、5、6、7为起点,顺序递增,每4个地址为一组突发,4为wrap边界。
  • interleave交错模式:
    以0、1、2、3、4、5、6、7为起点,顺序递增和递减交替进行,每4个地址为一组突发,4为wrap边界。

Note: 每4个地址的初始地址为4,则不进行wrap处理。 后一部分地址的初始地址可以按前一部分未wrap的地址确定,且总是递增的。

burst不可以跨row和bank。

1.4 ddr读

ddr单bank读事务

图 1.4 展示了ddr的一个读事务。

图 1.4

ddr读事务描述:

  • 先发送一个act指令;
  • 过几个周期之后,发送一个read指令;
  • 再过一个周期之后,会输出一些数据,
    • 如果突发长度为4,则2个周期中dq输出4个数据。
    • 如果突发长度为8,则4个周期中dq输出8个数据。
  • 如果需要更换row,需要先发送precharge指令关掉先前的row。

Note:
指令之间的空闲周期可以从ddr的datasheet中得知。

随着时钟频率的上升,read latency是增加的。

ddr单bank事务

图 1.5 展示了ddr的一个写事务。

图 1.5

ddr写事务流程和ddr读事务流程类似。

ddr多bank交错访问

Bank Interleave

ddr单个bank row读写效率是很低的,可以通过同时多bank交错读写提升访问效率。如图 图 1.5 所示。

图 1.5

图 2.1

2.1 cache的读行为

存在3种读行为:

  • hit:
    CPU想要读取的数据在cache中,可以直接从cache中读取。
  • miss:
    CPU想要读取的数据不在cache中,需要从内存中读取,读取之后的行为有两种:
    • Read Through:
      从内存中读取的数据,不缓存到cache。
    • Read allocate:
      从内存中读取的数据,同时缓存到cache。

2.2 cache写事务

@startuml
group 读 
    group hit
        CPU <- Cache:Read
    end

    group miss 
        group Read Through
            CPU <- mem: Read
        end
        group Read Allocate
            CPU <- mem: Read
            Cache <- mem: Read
        end
    end
end


group 写
    group hit 
        group Write through
            CPU -> Cache:Write
            CPU -> mem:Write
        end
        group Write Allocate
            CPU -> Cache :Write
            Cache -> mem : Flush
        end
    end

    group miss 
        group Write back
            CPU -> Cache: load
            Cache --> mem : Write Through
            Cache --> mem : Write Back
        end
        group Write no Allocate
            CPU -> mem: Write
        end
    end
end
@enduml

2.3 cache的flush和invalidate

每个cache line都有两个flag:

  • valid:
    cache line 是否有有效数据。
  • dirty:
    cache line 的数据是否与内存中的数据一致。

cache数据一致性操作:

  • clean:
    • 操作:
      检查 dirty flag,如果是dirty,则把cache line 的数据写到内存中,并清除 dirty, cache line仍然是valid状态。
    • 应用场景:
      cache数据被cpu更新;
      某个模块需要读取这条数据,需要先clean,与其他数据保持一致。再让需求模块读取。
  • invalid:
    • 操作:
      清除 valid flag,cache line中的数据直接丢掉,不写入mem。
    • 应用场景:
      某个模块修改了终端的地址,cpu需要invalid缓存中该地址的数据,强制下次读取从内存获取数据。
  • flush:
    • 操作:
      对cache line先clean,再invalid。
    • 应用场景: 应用数据的大幅度切换。

2.4 cache硬件原理

Cache line:Cache的最小操作单元。