龙芯内存基础知识

来源:互联网 发布:qq抽奖软件 编辑:程序博客网 时间:2024/04/29 11:13

内存基础知识

内存颗粒: 组成内存设备的基本单元,也就是我们在内存条上看到的规格相同的一个个小黑块。目前主流的类型为SDRAM(Synchronized Dynamic RAM)。SDRAM根据技术发展又分为DDR、DDR2、DDR3等几代产品。目前主流的是DDR2和DDR3。内存颗粒的技术规范见JEDEC标准(JESD79-2和JESD79-3)。该文档可到jedec官网免费下载(www.jedec.org)。下面对关于颗粒的一些重要、易混的概念做一个简单介绍。
1. 地址线。SDRAM使用行列地址线复用技术。即行地址和列地址共用同一组地址线,因此要分两次发送,先发行地址,再发列地址。
2. 颗粒容量:一个颗粒包含的bit位数。比如:512Mb、1Gb等。
3. 位宽。位宽是颗粒中可寻址的最小单元的bit位数,也是一个颗粒的数据线的个数。目前常见的位宽有x4,x8,x16。
4. Bank。Bank是颗粒内部的概念,一个颗粒内有多个bank(目前主要是4和8),一组行列地址寻址的是一个bank内的一个存储单元,因此一次完整的寻址还需要提供bank地址。Bank地址是和行地址同时发送的。
5. CS(Chip Select)片选信号。每个颗粒都有一个CS信号引脚,只有当该信号为低时,颗粒才会接收命令。内存条:目前的主流内存条为DIMM(Dual In-line Memory Module,双列直插内存模块)。内存条分为SO-DIMM(笔记本用的)、Unbuffered DIMM(台式机用的、市面上常见的内存条)、Registered DIMM(多用于服务器)等很多种。内存条其实就是将多个SDRAM颗粒拼装在一起,这些颗粒的地址、控制线连接在一起,而数据线并在一起形成DIMM的数据线。目前的DIMM条数据线个数一般为64位。因此对于x8的颗粒,需要8个才能形成一组存储单元,对DIMM条寻址时,这8个颗粒都会被命中,因此一次寻址会命中8个字节,这8个字节根据所在的数据线来区分。因此,程序地址转换成的物理地址的低3位是不会发给内存条的。 1. Rank。Rank是DIMM条的概念。一个rank相当于DIMM条的一组SDRAM颗粒,一般也就是DIMM条的一个面。一个DIMM条可以包含2个Rank,也就是双面的DIMM条。一个Rank对应一个CS信号,该CS信号用来控制该组的所有SDRAM颗粒。因此,任何时候只能有一个CS信号有效。

Loongson芯片的访存流程

Image:龙芯2G及龙芯3号芯片的访存流程.jpg
图1 龙芯2G及龙芯3号芯片的访存流程

Pmon内存初始化代码介绍

Pmon中内存相关部分的代码在loongson3_ddr2_config.S中,该文件应包含在start.S中。Loongson3_ddr2_config.S主要完成两部分工作:1.内存控制器的初始化。2.二级Cross Bar的窗口配置。

内存控制器参数配置

内存控制器参数主要包含2部分内容:

内存设备(SDRAM颗粒)相关参数

1. 寻址相关参数
Reg_05:column_size=14-列地址数,addr_pins=15-行地址数。 Reg_01:eight_bank_mode=1(8个bank), 0(4个bank)
2. 颗粒MR(Mode Registers)设置对于DDR2: MR: 0a62 EMR1: 0046 EMR2: 0000 EMR3: 0000 其中,MR的CAS Latency和EMR1的ODT、Output Driver Impedance Control位可以修改为其他值,其他的配置一般不用改动。 DDR3也类似,主要是CL、WL和ODT的设置可以设为不同的值进行试验。
3. 时间参数 Jedec标准规定了不同类型SDRAM的各种时间参数,参照标准,然后根据内存时钟频率进行设置即可。目前主要使用的SDRAM类型为DDR2-800E-6-6-6(相当于DDR2-667D-5-5-5)和DDR31333H-9-9-9,他们对应的时间参数已经配置好了,我会给出一个参考配置,参照里面的相应配置即可。说明一下,控制器的这些参数值是以时钟数为单位来配置的。SDRAM的这些时间参数要求大部分规定的是最小时间值,因此这些最小时间值参数按照系统的最高时钟频率(DDR2 400M,DDR3 667M)来配置,这样在低频时同样可以符合要求。而tREF和tRAS_MAX这两个参数规定的是最大时间值,因此当系统时钟频率降低时,时钟周期变长,对应的最大时钟数相应也要减小。给出的参考配置参数中会有相应注释。

内存控制器相关参数

内存控制器中需要修改的主要是时钟、写DQS、写DQ、读DQS、读DQSn的DLL延时设置。

调试步骤

内存条相关

1. 检查内存条颗粒类型。Reg_78:dram_class: 4(DDR2),6(DDR3)。

2. 内存条类型。Reg_03: reg_dimm_enable: 0(UDIMM), 1(RDIMM)。

3. 检查行列地址线、bank数、cs_map设置。特别注意cs_map设置。Reg_07: cs_map: 0000_????. 龙芯使用的内存控制器有4条cs信号线,因此一个控制器最多有2个内存插槽,每个插槽上使用的内存条最多有2个Rank。cs_map[3:0]对应于slot1-bank1、0、slot0-bank1、0. 举例说明,如果只有一个单面的内存条插在slot 0上,则cs_map应设为0x01;如果只有一个双面的内存条插在slot 1上,则c s_map应设为0x0c。

4. SDRAM颗粒的page size。对于Page size为2KB的内存,tFAW、tRRD参数应参照标准适当增大。

5. SDRAM颗粒的容量。SDRAM的容量影响tRFC以及tXSNR。参考配置中的值是根据容量为1Gb的颗粒设置的,当SDRAM容量变大时,应注意修改。

6. CL修改。参考配置给出的CL=6,当DDR2的频率低于333M时,CL可以设置为5(也可以使用6)。CL涉及的参数有:reg_05的caslat,reg_06的wrlat,reg_07的caslat_lin_gate、caslat_lin(设为2*CL即可),mr寄存器,reg_96的rdlat_adj、wrlat_adj.

控制器相关

Reg_8f[31:8]:控制CLK延时。 Bit[31:24],bit[23:16],bit[15:8]分别对应cpu DDR CLK5(4)、CLK3(2)、CLK1(0)。最大值0x7f. 一般使用范围0x0~0x40, RDIMM一般使用0x10;UDIMM一般使用0x30、0x28。 Reg_1f~28:
1. WR_DQS延时:0x0~0x7f,一般使用范围0x8~0x20,常用值0x12左右。
2.RD_DQS延时: 0x0~0x7f,一般使用范围0x10~0x20,常用值0x18左右。
3.RD_DQSn延时:0x0~0x7f,一般使用范围0x0~0x20, 常用值0x0e,0x10,0x18等。
Reg_08:ODT map

测试工具

Pmon启动中,内存初始化之后,Test_Mem.S Pmon启动后,shell界面,mt、newmt(需要set VGA=0)命令内核启动后,memtester、stressapptest。测试强度:stressapptest > memtester > Test_Mem.S >? newmt > mt.

原创粉丝点击