레이블이 RAM-DRAM인 게시물을 표시합니다. 모든 게시물 표시
레이블이 RAM-DRAM인 게시물을 표시합니다. 모든 게시물 표시

9/06/2016

TI-Sitara (AM437x) Benchmark Program (참조용)

TI에서 아래와 같이 ARM의 기본성능 TEST 할수 있는 방법제공을 해주어서,
본인도 새로 알게되었으며, 각각의 SOC의 성능을 측정을 할수 있는 App을 간단히 소개한다.

만약 존재하지 않는다면, 아래에 같이 Github에서 Download에서 다운로드에서 사용을해보자.

   https://en.wikipedia.org/wiki/NBench

1. Benchmark Test

1.1 CPU 기본성능 TEST

  • proc/cpuinfo : 가장기본적인 정보 
  • Dhrystone : CPU의 성능을 측정하는 방법으로, 별도의 프로그램이 필요.  
  • Whetstone : 유사하지만, 둘 사이의 차이점은 아직 발견을 못하겠음.
  • Linkpack: FPU 성능측정을 위해서 사용하면 되겠다.

Proc에서 제공해주는 기본적인 BogoMIPS가 있다.

# cat /proc/cpuinfo 
processor : 0
model name : ARMv7 Processor rev 10 (v7l)
BogoMIPS : 598.17
Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x2
CPU part : 0xc09
CPU revision : 10

Hardware : Generic AM43 (Flattened Device Tree)
Revision : 0000
Serial  : 0000000000000000 
CPU를 기본적으로 측정하는 프로그램으로, MIPS로 나오며,

1.2 Dhrystone

사용법은 Benchmark할 횟수를 적어줘야한다.
단위는 DMIPS (Dhrystone MIPS) 이며, RISC와 CISC에 따라 알고리즘이 약간식 다르게 동작이 되는 것 같다.


# /usr/bin/dhrystone

Dhrystone Benchmark, Version 2.1 (Language: C)

Program compiled without 'register' attribute

Please give the number of runs through the benchmark: 40000000  // 이 값이 너무 작으면 측정이 제대로 안됨 

Execution starts, 40000000 runs through Dhrystone
Execution ends

Final values of the variables used in the benchmark:

Int_Glob:            5
        should be:   5
Bool_Glob:           1
        should be:   1
Ch_1_Glob:           A
        should be:   A
Ch_2_Glob:           B
        should be:   B
Arr_1_Glob[8]:       7
        should be:   7
Arr_2_Glob[8][7]:    40000010
        should be:   Number_Of_Runs + 10
Ptr_Glob->
  Ptr_Comp:          151560
        should be:   (implementation-dependent)
  Discr:             0
        should be:   0
  Enum_Comp:         2
        should be:   2
  Int_Comp:          17
        should be:   17
  Str_Comp:          DHRYSTONE PROGRAM, SOME STRING
        should be:   DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->
  Ptr_Comp:          151560
        should be:   (implementation-dependent), same as above
  Discr:             0
        should be:   0
  Enum_Comp:         1
        should be:   1
  Int_Comp:          18
        should be:   18
  Str_Comp:          DHRYSTONE PROGRAM, SOME STRING
        should be:   DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc:           5
        should be:   5
Int_2_Loc:           13
        should be:   13
Int_3_Loc:           7
        should be:   7
Enum_Loc:            1
        should be:   1
Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRING
        should be:   DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRING
        should be:   DHRYSTONE PROGRAM, 2'ND STRING

Microseconds for one run through Dhrystone:    0.2 
Dhrystones per Second:                      5000000.0 


위의 나온 결과로 아래와 같이 본인이 계산을 해야한다.

5000000.0 / 1757  = 2845.7598178713716562322140011383   // 1757로 나눈다.
2845.7598178713716562322140011383  / 1000MHz (CPU CLOCK) = 2.84 


CPU Clock     =  1000MHz
DMIPS / MHz =  2.84 DMIPS

   아래에서 Dhryston 관련사이트에서 확인 반드시 확인.
   https://en.wikipedia.org/wiki/Dhrystone

   ARM 관련 Chip들 DMIPS 정보를 보고 비교해보자.
   https://en.wikipedia.org/wiki/List_of_ARM_microarchitectures

   DMIPS 계산방법
   http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0273a/ar01s05.html


1.3 Whetstone

사용법은 Loop 횟수를 적어줘야한다.
나온결과는 Millions of Whetstone Instructions Per Second (MWIPS)


/usr/bin/whetstone 100000   // loop count를 입력해야한다. 

Loops: 100000, Iterations: 1, Duration: 6 sec.
C Converted Double Precision Whetstones: 1666.7 MIPS



   Whetstone 관련내용
   https://en.wikipedia.org/wiki/Whetstone_(benchmark)

1.4 Linpack

Floating Point Operation을 TEST하기 위한 Benchmark Program이라고 하며, output은 KFLOPS


# /usr/bin/linpack
Unrolled Single Precision Linpack

Unrolled Single Precision Linpack

     norm. resid      resid           machep         x[0]-1        x[n-1]-1
       1.6        3.80277634e-05  1.19209290e-07 -1.38282776e-05 -7.51018524e-06
    times are reported for matrices of order   100
      dgefa      dgesl      total       kflops     unit      ratio
 times for array with leading dimension of  201
       0.02       0.00       0.02      34333       0.06       0.36
       0.02       0.00       0.02      34333       0.06       0.36
       0.01       0.00       0.01      68667       0.03       0.18
       0.01       0.00       0.01      68667       0.03       0.18
 times for array with leading dimension of 200
       0.00       0.00       0.00        inf       0.00       0.00
       0.02       0.00       0.02      34333       0.06       0.36
       0.00       0.00       0.00        inf       0.00       0.00
       0.01       0.00       0.01     114444       0.02       0.11
Unrolled Single  Precision 68667 Kflops ; 10 Reps 

Linpack에 관련내용
   https://en.wikipedia.org/wiki/LINPACK_benchmarks


1.5 lmbench로 Memory 성능측정

lmbench의 한 bin 파일로 기본 사용법 lmbench package를 넣어 TEST 해보자.

//AM487x EVM TEST 

# bw_mem 1M rd
1.00 359.91

# bw_mem 1M wr
1.00 305.75

# bw_mem 1M rdwr
1.00 281.14

# bw_mem 1M cp
1.00 181.46

# bw_mem 1M fwr
1.00 676.59

# bw_mem 1M frd
1.00 269.40

# bw_mem 1M fcp
1.00 214.76

# bw_mem 1M bzero
1.00 675.68

# bw_mem 1M bcopy
1.00 252.87

  http://lmbench.sourceforge.net/cgi-bin/man?section=8&keyword=bw_mem



  • 시스템 관련 성능 측정

위에서 언급한 lmbench package이며, 다양한 TEST가 가능하다.
  1. RAM 관련 TEST 
  2. File 관련 TEST
  3. Network TEST
  4. TLB 및 Cache TEST
  5. UNIX Function Memory Map TEST 

각각의 지연시간(Latency)를 확인이 가능하며, 성능개선을 위해 알아 둬야 할 것 같다.
더불어 Hardware or Software 적으로 최적화를 진행을 하고 TEST를 해보면 추후
좋을 것 같다.

  http://lmbench.sourceforge.net/cgi-bin/man?keyword=lmbench&section=8


  • lmbench 소스와 관련사용법 TI에서 제공

아래의 사이트에서 자세한 기본사용법과 소스를 다운받아 사용해보자.

   http://processors.wiki.ti.com/index.php/Lmbench
   https://sourceforge.net/projects/lmbench/


2. BenchMark 관련소스 및 Bin Download

상위 CPU 관련 성능 측정관련 Source 및 Bin 파일

   https://github.com/tonyho/ARM_BenchMark

8/31/2016

AM437x 와 AM335x RAM Interface 비교

1. AM43xx 와 AM335x RAM Interface 비교 

AM335x는 RAM Bus가 16bit이며, AM437x는 32bit이다 RAM Interface에 있어 Memory Bandwidth 에서 많은 성능차이를 보인다.
물론 상위 16bit 와 32bit는 SoC 내부에서 연결된 Interface이고 외부는 동일하게 32bit로 구성이 되어있다.
이는 이전에 Davinci Series로 출시된  DM6467 와 DM355 와 거의 동일하다.

만약 Memory Bandwidth의 최대성능을 사용하고 싶다면, 다른 SoC와 같이 AM335x는 RAM을 16bit bus로 2개로 사용하여 32bit로 연결하면 될것이고,
AM437x일 경우 RAM을 8bit bus로 4개로 사용하여 32bit를 연결하면 될 것이다.

Sitara series와 Davinci Series의 ARM의 Version과 GPU의 기능 추가이며, 큰 차이는
기존에 OMAP 일부기능들을 많이 그대로 가져오고 있다.

Power Management부터 시작하여 Graphic Interface, 거의 OMAP과 유사하지만,
Davinci Series에서 사용했던 *DeepSleep모든 존재, 물론 ARM version 차이도 존재하지만
요즘들어 Davinci와 OMAP Series가 모호해지고, Sitara가 나오며, 기능을 섞어서
나오니 좀 애매할 뿐이다.

일단 두 SOC의 RAM Interface에 있어 성능에 있어서도 차이가 있겠지만, 일단 여기서는 두개의 RAM Interface인 EMIF를 비교해보자.

*DeepSleep 모드
DeppSleep모드를 사용해본 경혐이 있어, 이를 사용할 경우, Self Refresh Mode와 TCM(SRAM)사용은 필수였다.
추후 시간이 있다면 이부분도 조사.


  • AM335x
   http://www.ti.com/lit/ds/symlink/am3358.pdf
   http://www.ti.com/lit/ds/symlink/am3359.pdf


  • AM437x
   http://www.ti.com/lit/ds/symlink/am4372.pdf


1.1 AM335x(AM3358)
위에서 설명했듯이 일단 CPU는 32bit 이지만, 32bit를 Data를 저장하기 위해서 EMIF Interface가 16bit이기 때문에 Data를 두번에 나누어서 보내야 할 것이다,
때문에 성능이 거의 반이라고 생각을 하고 있다. 혹시 Thumb Mode를 사용하면 모를까

Errata를 보면, DDR3일 경우 Self refresh mode가 문제가 있다.
이부분은 Power Management와 직접연관이 있으므로 주의해야 겠다.

External Memory Interfaces (EMIF)
  • mDDR(LPDDR), DDR2, DDR3, DDR3L Controller:
    • mDDR: 200-MHz Clock (400-MHz Data Rate)
    • DDR2: 266-MHz Clock (532-MHz Data Rate)
    • DDR3: 400-MHz Clock (800-MHz Data Rate)
    • DDR3L: 400-MHz Clock (800-MHz Data Rate)
    • 16-Bit Data Bus
    • 1GB of Total Addressable Space
    • Supports One x16 or Two x8 Memory Device Configurations
  • General-Purpose Memory Controller (GPMC)
    • Flexible 8-Bit and 16-Bit Asynchronous Memory Interface With up to Seven Chip Selects (NAND, NOR, Muxed-NOR, SRAM)
    • Uses BCH Code to Support 4-, 8-, or 16-Bit ECC
    • Uses Hamming Code to Support 1-Bit ECC
  • Error Locator Module (ELM)
    • Used in Conjunction With the GPMC to Locate Addresses of Data Errors from Syndrome Polynomials Generated Using a BCH Algorithm
    • Supports 4-, 8-, and 16-Bit per 512-Byte Block Error Location Based on BCH Algorithms

   http://www.ti.com/lit/ug/spruh73o/spruh73o.pdf
 

1.2 AM437x(AM4372)  
AM335x와 다르게, 전형적인 일반적인 RAM Interface (EMIF) 를 가지고 있어, 크게 걱정없다.

  • External Memory Interfaces (EMIFs)
    • DDR Controllers:
      • LPDDR2: 266-MHz Clock (LPDDR2-533 Data Rate)
      • DDR3 and DDR3L: 400-MHz Clock (DDR-800 Data Rate)
      • 32-Bit Data Bus
      • 2GB of Total Addressable Space
      • Supports One x32, Two x16, or Four x8 Memory Device Configurations
  • General-Purpose Memory Controller (GPMC)
    • Flexible 8- and 16-Bit Asynchronous Memory Interface With up to Seven Chip Selects (NAND, NOR, Muxed-NOR, and SRAM)
    • Uses BCH Code to Support 4-, 8-, or 16-Bit ECC
    • Uses Hamming Code to Support 1-Bit ECC
  • Error Locator Module (ELM)
    • Used With the GPMC to Locate Addresses of Data Errors From Syndrome Polynomials Generated Using a BCH Algorithm
    • Supports 4-, 8-, and 16-Bit Per 512-Byte Block Error Location Based on BCH Algorithms

   http://www.ti.com/lit/ug/spruhl7f/spruhl7f.pdf

8/17/2015

Uboot DRAM 설정 (DM812x)

1. DM8128 의 EVM의 구성 

  • EVM Board 구성
  1. BOARD-NAME: DM8128-IPNC
  2. BOARD-VER   :
  3. RAM Type     : K4B1G1646E
  4. RAM Size      :  2 x (16x 64M, 1Gb) = 2Gb = 256MB 

이 오래된 모델을 대학원 교육용으로 팔기위해서 간단히 설정정리한다.

2. RAM의 기본이해 및 다른 SOC Setting 

TI의 Sitara 기준으로 간단히 설명
  https://ahyuo79.blogspot.com/search/label/RAM-DRAM

2.1 Uboot 설정 및 CCS TEST

아래사이트의 두 항목을 보고 쉽게 수정이 가능하며, CCS TEST 가능하다

  1. Modifying U-Boot
  2. Register to U-Boot Macro Definition Mapping Table
  http://processors.wiki.ti.com/index.php/TI814x-DDR3-Init-U-Boot

2.2 DRAM의 SW Leveling 

만약, DDR의 선로의 길이 확장으로 인해 SW-Leveling 사용해야한다면, 아래부분 참조
Leveling은 대해 좀더 알고 싶다면 상위 RAM부분을 읽어보고 파악하자

  http://processors.wiki.ti.com/index.php/TI814x-DDR3-Init-U-Boot_Wordwise_SWleveling

2.3 DDR Power Optimization

  Docs/Application_Notes/IPNC_RDK_Power_Optimization.pdf

  • DM8127 전체 Power 조절에 관한 내용이 있음
       1. Interleaving 문제로 16bit로 두개연결이 성능이 가장 뛰어남.
       2. DeepSleep과 IO Power optimization 부분 및 VTP 조절

 
3. DDR 관련 설정 


$ cd ~/dm8127/work/Source/ti_tools/ipnc_psp_04_04_00_01/u-boot 
  • DM8127 CONFIG 

$ vi include/config.h
$ vi include/configs/ti8148_ipnc.h

  • DDR관련소스 

$ vi ./board/ti/ti8148_ipnc/evm.c


3.1 Uboot의 DRAM SOURCE


  • DDR 설정 관련소스
$ vi board/ti/ti8148_ipnc/evm.c
                dram_init                  // 확장시 확인 필요
                is_ddr3()                  // ddr3 동작 , return 1
                config_ti814x_ddr()        // 이 부분 설정
                ddr_pll_config()           // CLOCK 변경 ,DDR_PLL_533

  • 설정부분 
arch/arm/include/asm/arch-ti81xx/ddr_defs_ti814x.h      // 설정값 변경
arch/arm/include/asm/arch-ti81xx/clocks_ti814x.h        // DDR_M


3.2 Uboot DDR Timing 설정 및 Clock 설정

  • DDR TIMING 및 CONFIG 부분

$ vi arch/arm/include/asm/arch-ti81xx/ddr_defs_ti814x.h 
....
#else //CONFIG_DM385_DDR3_533

/* TI814X DDR3 EMIF CFG Registers values 400MHz */
#define DDR3_EMIF_READ_LATENCY          0x00170208   //RD_ODT=0x2, IDLE_ODT=0x0, Dynamic power_down enabled
#define DDR3_EMIF_TIM1                  0x0AAAD4DB
#define DDR3_EMIF_TIM2                  0x682F7FDA
#define DDR3_EMIF_TIM3                  0x501F82BF
#define DDR3_EMIF_REF_CTRL              0x00000C30
#define DDR3_EMIF_SDRAM_CONFIG          0x61C011B2
#define DDR3_EMIF_SDRAM_ZQCR            0x50074BE1

#endif

        아래는 U-BOOT Name과 Reg-Name 및 OFFSet을 간단히 Mapping 하였습니다.

#define EMIF4_0_CFG_BASE                0x4C000000
#define EMIF4_1_CFG_BASE                0x4D000000
          U-BOOT Name                   Reg-Name     OFFSET
#define DDR3_EMIF_READ_LATENCY          DDRPHYCR      (E4h)
#define DDR3_EMIF_TIM1                  SDRTIM1       (18h)
#define DDR3_EMIF_TIM2                  SDRTIM2       (20h)
#define DDR3_EMIF_TIM3                  SDRTIM3       (28h) 
#define DDR3_EMIF_REF_CTRL              SDRRCR        (10h)
#define DDR3_EMIF_SDRAM_CONFIG          SDRCR         (08h) 
#define DDR3_EMIF_SDRAM_ZQCR            ZQCR          (C8h)

  • DDR CLOCK 설정 
현재 DDR_PLL_533 정의되어있으나, 400MHz 동작됨 


$ vi arch/arm/include/asm/arch-ti81xx/clocks_ti814x.h

#define DDR_PLL_533     /* Values supported 400,533 */
.....
#define DDR_N           19
#ifdef CONFIG_DM385
/* DDR PLL */
/* For 400 MHz */
#if defined(DDR_PLL_400)
#define DDR_M           (opp_val_dm385(800, 800))
#endif

/* For 533 MHz */
#if defined(DDR_PLL_533)
#define DDR_M       (opp_val_dm385(1066, 1066))
#endif
#else
#define DDR_M           (pg_val_ti814x(666, 800))
#endif
#define DDR_M2          2
#define DDR_CLKCTRL     0x801
$ vi ./board/ti/ti8148_ipnc/evm.c

static void ddr_pll_config()
{
        pll_config(DDR_PLL_BASE,
                        DDR_N, DDR_M,
                        DDR_M2, DDR_CLKCTRL);
}


 AM437x 와 유사하며, maxium frequecies를 확인을 반드시 확인하자.
 일반적은 Maximum Clock 400MHz이며, overclock해서 533MHz를 사용가능

  • 확인사항들 
         위 부분은 TI DM814x의 SPRUGZ8F와 회로도를 참고하여, 위 설정값을 변경하자.
         DDR_M: CPU의 Version에 따라 666 or 800 되지만, PG2_1 이기에,  800 사용
         1. DEVOSC_MX0 : APPRO 회로도에서 20MHz 확인 (DEVOSC_MX0=CLKINP)
         2. CLKOUT    : [M /(N+1)] * CLKINP * [1/M2]
                            **    800/20 * 20*1/2 = 400 MHz   최종 CLOCK
         3. CLKOUT: DDR0_PHY Clock, DDR1_PHYClock, DMM clock and EMIFmclk.

  • 관련내용 (SPRUGZ8F.pdf)

             2.3.5 DDR PLL Clock
             2.5.3 DPLLS Clock Function 참조
             8.4.10 Module Clock (Maximum Clock 확인)
             8.2.2.1 DVFS ( Maximum Clock 확인)
           

3.3 DDR3 Datasheet Timing 


  • K4B1G1646E 의 TIMING 

  • DDR3로 16bit로 연결시 




TI에서는 손쉽게 Timing 설정이 가능하도록 Tool을 제공을 한다.

  • DM8127 관련 설정 
AM43xx 용을 고쳐서 DM8127용으로 내가 새로 만들었다.
  https://docs.google.com/spreadsheets/d/1ZXFmWqTe1SLkZ-KmxYmUkfUR1GQwOV-Pms0-Fj7J1xA/edit?usp=sharing


  • AM43xx용 
  https://drive.google.com/open?id=0B_ehveuLi8MVV1lXaW0zLTZ1ZVE


4. DDR설정 및 확인

DM8127는 EMIF에 현재 16bit 모드로 연결되어 있기때문에 아래와 같이 EMIF를 개별로 각각 설정을 해줘야 한다. (EMIF0, EMIF1)

$ vi arch/arm/include/asm/arch-ti81xx/cpu.h

#define EMIF4_0_CFG_BASE                0x4C000000
#define EMIF4_1_CFG_BASE                0x4D000000

.....

#define EMIF4_0_SDRAM_ZQCR              (EMIF4_0_CFG_BASE + 0xC8)
#define EMIF4_0_SDRAM_CONFIG            (EMIF4_0_CFG_BASE + 0x08)
#define EMIF4_0_SDRAM_CONFIG2           (EMIF4_0_CFG_BASE + 0x0C)
#define EMIF4_0_SDRAM_REF_CTRL          (EMIF4_0_CFG_BASE + 0x10)
#define EMIF4_0_SDRAM_REF_CTRL_SHADOW   (EMIF4_0_CFG_BASE + 0x14)
#define EMIF4_0_SDRAM_TIM_1             (EMIF4_0_CFG_BASE + 0x18)
#define EMIF4_0_SDRAM_TIM_1_SHADOW      (EMIF4_0_CFG_BASE + 0x1C)
#define EMIF4_0_SDRAM_TIM_2             (EMIF4_0_CFG_BASE + 0x20)
#define EMIF4_0_SDRAM_TIM_2_SHADOW      (EMIF4_0_CFG_BASE + 0x24)
#define EMIF4_0_SDRAM_TIM_3             (EMIF4_0_CFG_BASE + 0x28)
#define EMIF4_0_SDRAM_TIM_3_SHADOW      (EMIF4_0_CFG_BASE + 0x2C)
#define EMIF4_0_DDR_PHY_CTRL_1          (EMIF4_0_CFG_BASE + 0xE4)
#define EMIF4_0_DDR_PHY_CTRL_1_SHADOW   (EMIF4_0_CFG_BASE + 0xE8)
#define EMIF4_0_IODFT_TLGC              (EMIF4_0_CFG_BASE + 0x60)

#ifndef CONFIG_DM385
#define EMIF4_1_SDRAM_ZQCR              (EMIF4_1_CFG_BASE + 0xC8)
#define EMIF4_1_SDRAM_CONFIG            (EMIF4_1_CFG_BASE + 0x08)
#define EMIF4_1_SDRAM_CONFIG2           (EMIF4_1_CFG_BASE + 0x0C)
#define EMIF4_1_SDRAM_REF_CTRL          (EMIF4_1_CFG_BASE + 0x10)
#define EMIF4_1_SDRAM_REF_CTRL_SHADOW   (EMIF4_1_CFG_BASE + 0x14)
#define EMIF4_1_SDRAM_TIM_1             (EMIF4_1_CFG_BASE + 0x18)
#define EMIF4_1_SDRAM_TIM_1_SHADOW      (EMIF4_1_CFG_BASE + 0x1C)
#define EMIF4_1_SDRAM_TIM_2             (EMIF4_1_CFG_BASE + 0x20)
#define EMIF4_1_SDRAM_TIM_2_SHADOW      (EMIF4_1_CFG_BASE + 0x24)
#define EMIF4_1_SDRAM_TIM_3             (EMIF4_1_CFG_BASE + 0x28)
#define EMIF4_1_SDRAM_TIM_3_SHADOW      (EMIF4_1_CFG_BASE + 0x2C)
#define EMIF4_1_DDR_PHY_CTRL_1          (EMIF4_1_CFG_BASE + 0xE4)
#define EMIF4_1_DDR_PHY_CTRL_1_SHADOW   (EMIF4_1_CFG_BASE + 0xE8)
#define EMIF4_1_IODFT_TLGC              (EMIF4_1_CFG_BASE + 0x60)
#endif
$ vi board/ti/ti8148_ipnc/evm.c

static void config_ti814x_ddr(void)
{
....

 /*Program EMIF0 CFG Registers*/
                __raw_writel(DDR3_EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1);
                __raw_writel(DDR3_EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1_SHADOW);
                __raw_writel(DDR3_EMIF_TIM1, EMIF4_0_SDRAM_TIM_1);
                __raw_writel(DDR3_EMIF_TIM1, EMIF4_0_SDRAM_TIM_1_SHADOW);
                __raw_writel(DDR3_EMIF_TIM2, EMIF4_0_SDRAM_TIM_2);
                __raw_writel(DDR3_EMIF_TIM2, EMIF4_0_SDRAM_TIM_2_SHADOW);
                __raw_writel(DDR3_EMIF_TIM3, EMIF4_0_SDRAM_TIM_3);
                __raw_writel(DDR3_EMIF_TIM3, EMIF4_0_SDRAM_TIM_3_SHADOW);
                __raw_writel(DDR3_EMIF_SDRAM_CONFIG, EMIF4_0_SDRAM_CONFIG);

....

/*Program EMIF1 CFG Registers*/
                __raw_writel(DDR3_EMIF_READ_LATENCY, EMIF4_1_DDR_PHY_CTRL_1);
                __raw_writel(DDR3_EMIF_READ_LATENCY, EMIF4_1_DDR_PHY_CTRL_1_SHADOW);
                __raw_writel(DDR3_EMIF_TIM1, EMIF4_1_SDRAM_TIM_1);
                __raw_writel(DDR3_EMIF_TIM1, EMIF4_1_SDRAM_TIM_1_SHADOW);
                __raw_writel(DDR3_EMIF_TIM2, EMIF4_1_SDRAM_TIM_2);
                __raw_writel(DDR3_EMIF_TIM2, EMIF4_1_SDRAM_TIM_2_SHADOW);
                __raw_writel(DDR3_EMIF_TIM3, EMIF4_1_SDRAM_TIM_3);
                __raw_writel(DDR3_EMIF_TIM3, EMIF4_1_SDRAM_TIM_3_SHADOW);
                __raw_writel(DDR3_EMIF_SDRAM_CONFIG, EMIF4_1_SDRAM_CONFIG);

....

}

위와 같이 변경후, DDR 설정은 SPL에서 진행이 되므로, SPL 변경 후, TEST를 진행하자.

SPL 파일:  u-boot.min.sd을 MLO 변경후 SDIMAGE 생성후 TEST   각 REGISTER 확인은 아래와 같이, md 명령으로 확인 (boot가 될 경우)

* SPL도 기본 U-BOOT 명령은 동작한다.
TI-MIN# md 0x4C000018
TI8148_IPNC# md 0x4C000018 


AM437x DDR 의 AC Timing 설정 TOOL을 DM8127에 맞게 수정하고 SDBOOT로 변경하고 이값으로 기본적으로 TEST를 함.

8/05/2015

AM437x Uboot DRAM 설정 및 확인사항

1. AM437x EVM의 구성

  • BOARD-NAME: AM43__GP 
  • BOARD-VER   : 1.4   
  • RAM TYPE : MT41K512M8RH-125 (CS0 PIN ONLY)   
  • RAM SIZE :  4 x (64 Meg x 8 x 8 banks, 4Gb) = 16Gb = 2 GB   
       http://processors.wiki.ti.com/index.php/AM437X_EVM_Boards


2. AM437x DDR3 CONFIG TI-GUIDE 

http://processors.wiki.ti.com/index.php/AM437x_DDR_Configuration_and_Programming_Guide

상위 사이트에서 다 주위깊게 봐야겠지만, U-BOOT에서 기본적으로 자동으로 설정을
하기에, 아래 부분을 주의깊게 봐야겠다.

  • EMIF General Configuration Registers
  • DDR PHY Control Register   ---> 
  • AC Timing Registers (TI에서 Excel을 제공) 
  • Setting Refresh rate 

Power Consumption (옵션)
  • Internal DDR Clocks ( DLL Clock을 사용한다면, 현재 미사용)

3. Uboot DDR CLOCK 설정

DDR 설정은 현재 400MHz 나오며, 이는 외부 오실레이터에 의해 결정된다. (24MHz)
CLOCK부분과 POWER쪽에 전체적인 완벽한 이해는 추후 다시한번해야함.

  • SoC PLL 설정 전체구조

  • PLL의 DDR PLL 구조 


PLL의 INPUT CLOCK은 우선 PRCM.CM_CLKSEL_DPLL_DDR.DPLL_BYP_CLKSEL의 의해  CLKINP or CLKINPULOW 결정되고 (CLKINPULOW는 PM사용시 사용),
            ALT_CLK0,1 TEST 목적으로 사용
            Master OSC : 19.2/24/25/26 MHz  ( 회로도 확인: OSC0 24MHz )

  • EMIF-CLOCK (EMIF Maximum Frequency)

위와 같이 400MHz 동작하지만, Micron DDR3는 이보다 더 지원이 가능함.


3.1 Uboot DDR Clock  


* board/ti/am43xx/board.c
       gp_evm_dpll_ddr
* arch/arm/cpu/armv7/am33xx/clock.c
       setup_dplls->get_dpll_ddr_params()

struct dpll_params {
        u32 m;  //PRCM_CM_CLKSEL_DPLL_DDR->DPLL_MULT 
        u32 n;  //PRCM_CM_CLKSEL_DPLL_DDR->DPLL_DIV  
        s8 m2;  
        s8 m3;  
        s8 m4;    
        s8 m5;  
        s8 m6;
};  

Power Management에 의해 아래와 같이 4가지 모드로 설정이 가능하지만,
GP EVM은 한가지모드로 설정로 설정하여 사용.

const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
                {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
                {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
                {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
                {133, 12, 1, -1, 4, -1, -1}  /* 26 MHz */
};
// 회로도에서 Input 24MHz 확인 
const struct dpll_params gp_evm_dpll_ddr = {
                50, 2, 1, -1, 2, -1, -1};      // 상위 dpll_params 참조 


3.2 DDR PLL의 계산방법
    TI의 Reference Manual 와 상위 소스 기반으로 설정을 하면된다.

    1. CLKOUT       :  [M / (N+1)] * CLKINP * [1/M2]  = 266MHz
    2. CLKDCOLDO :  2 * [M / (N+1)] * CLKINP         = 532MHz

    GP_BOARD의 경우 다음과 같이 설정
      상위 gp_evm_dpll_ddr기반으로 계산
                  50 / (2+1) * 24 /(1) = 400MHz (OSC: 회로도 확인 24MHz)


    • TI Manual 참고
    1. 6.6.3.1 Clock Functions
    2. 6.6.11 DDR PLL Description ( 666MHz 로 되나, M2 1이면 반으로 됨)
    3. PRCM_CM_CLKSEL_DPLL_DDR

          m2= DFI_CLK (차분CLK),
          m4= DLL CLK 지원


    4. DDR Timing 및 Config 설정

    • DDR3 EMIF PINMAP 
    현재 8bit로 4개로 DDR3 4개가 연결이 되어있으며, 최대 16 bank를 interleaving 가능하므로, 4개는 의미가 없다. (2개가 최적,  2x16bit 가 최적)

    위와 보다시피 , Embeded는 ODT는 사용하지 않는다.

    4.1 Uboot DDR Timing source 
    • Main 관련설정 source 
                   board/ti/am43xx/board.c
                   sdram_init() ->  config_ddr -> set_sdram_timings() // DDR Timing

    • 기타 관련설정 source       
                  arch/arm/include/asm/arch-am33xx/ddr_defs.h
                  arch/arm/cpu/armv7/am33xx/ddr.c
                  arch/arm/cpu/armv7/am33xx/emif4.c


    4.2 Uboot EMIF Config 및 Timing 
    쉽게 설정이 변경이 가능하며, 아래의 Register로 쉽게 Timing 과 Config를 변경하자.

    GP_EVM은 3가지 Version이 존재함 (현재 1.4용)
     
    const struct emif_regs ddr3_emif_regs_400Mhz_production = {
     .sdram_config   = 0x638413B2,
     .ref_ctrl   = 0x00000C30,
     .sdram_tim1   = 0xEAAAD4DB,
     .sdram_tim2   = 0x266B7FDA,
     .sdram_tim3   = 0x107F8678,
     .read_idle_ctrl   = 0x00050000,
     .zq_config   = 0x50074BE4,
     .temp_alert_config  = 0x0,
     .emif_ddr_phy_ctlr_1  = 0x0E004008,
     .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
     .emif_ddr_ext_phy_ctrl_2 = 0x00000066,//
     .emif_ddr_ext_phy_ctrl_3 = 0x00000091,//
     .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,//
     .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,//
     .emif_rd_wr_exec_thresh  = 0x80000405,//
     .emif_prio_class_serv_map = 0x80000001,
     .emif_connect_id_serv_1_map = 0x80000094,
     .emif_connect_id_serv_2_map = 0x00000000,
     .emif_cos_config  = 0x000FFFFF
    };
    


    각 설정을 MT41K512M8RH-125 데이타 시트와 비교하고,DDR3 SDRAM Initialization을 확인하자

    • EMIF의 관련 설정 
    EMIF의 Config 및 Timing, Refresh Register 기반으로 DDR register를 설정을 하기에 설정을 확인을하자.


     
    EMIF4D_SDRAM_CONFIG 0x638413B2  
            SDRAM_TYPE      3 (DDR3)                          SDRAM Type selection.
            IBANK_POS       0 (Decimal)                       Internal bank position. 
            DDR_TERM        3 (RZQ/6)                         DDR3 termination resistor value.  
            LPDDR2_DDQS     1 (differential DQS)              LPDDR2 differential DQS enable.
            DYN_ODT         0 (Turn off DYN_ODT)              DDR3 Dynamic ODT. 
            DDR_DISABLE_DLL 0 (Disable DLL)                   Disable DLL select. 
            SDRAM_DRIVE     1 (Decimal)                       SDRAM drive strength.  0 for RZQ/6 , 1 for RZQ/7   
            CWL             0 (Decimal)                       DDR3 CAS Write latency.  
            NARROW_MODE     0 (32bit)                         SDRAM data bus width. 
            CL              4 (Decimal)                       CAS Latency. 
            ROWSIZE         7 (Decimal)                       Row Size. 
            IBANK           3 (Decimal)                       Internal Bank setup. 
            EBANK           0 (use pad_cs_o_n[0] only)        External chip select setup. 
            PAGESIZE        2 ((9 colum bits))                Page Size. 
    

    관련설정은 AC-TIMING 참고하여 설정하자

    AM437x에는 DDR에 많은기능이 추가되었지만, 사용하지 않으면 필요없다.
    * HW-LEVELING, DLL, 기타 등등

    8/01/2015

    DRAM-3 AC-Timing AM437x 적용 (TI-TOOL사용)

    1. AM437x GPEVM 


    EVM RAM관련 정보
    • RAM:   DDR3L SDRAM  (MT41K512M8RH-125) 
    • SIZE :   4-Gb (512Mb × 8)  - 64 Meg x 8 x 8 banks

    2. OCP( Open Core Protocol)


    OCP는 DRAM의 기능이 아니며, AM437x에서 사용하는 Core 나 Device 간에 통신을 하기위한 Interface이다.
    현재 AM437x는 EMIF를 OCP로 연결하여 사용하고 있기에 이부분을 이해를 해야한다.

    기본구조는 Master 와 Slave 구조를 가지고 있으며, AM437x도 OMAP과 동일하게 OCP Interface를 제공하며, 기존 다빈치시리즈는 제공하지 않음, (특히 ARM9 시리즈)

      https://en.wikipedia.org/wiki/Open_Core_Protocol
      https://en.wikipedia.org/wiki/Open_Core_Protocol_International_Partnership_Association
      http://read.pudn.com/downloads95/doc/388103/OCPSpecification%202.2.pdf


    이에 관련된 Register 설정을 확인을 해주고, 기본 OCP_CONFIG의 BUS WIDTH 및 기타 설정확인한다.

    AM437x
    • EMIF- One 128-bit OCPIP 2.2 interface

    3.  EMIF Register 설정


    아래의 사이트에서 AC Timing에서 Tool을 제공해주고 있다.
    쉽게 설정이 가능하며, 아래절차는 주의사항과 관련내용을 정리해본다.

      http://processors.wiki.ti.com/index.php/AM437x_DDR_Configuration_and_Programming_Guide

    • MT41K512M8RH-TIMING

    DDR-3 (Table-1)

    DDR3 (Table-2)


           SDCONFIG와 SDTIMER TI에서 제공하는 엑셀을 이용하여 쉽게 설정가능하다.




    A.  EMIF->EMIF4D_SDRAM_CONFIG,2설정

    •  Table-2에서 CK에 의해 자동결정 CL(CAS Latency)과 CWL(CAS Write Latency) 결정 
    •  CK=1.25ns 값 CL =11 CK와 CWL=8 CK 결정 
    •  Reserved는 허용이 안됨
    •  SDCONFIG->CL=14(E), CWL=3 (주의: 엑셀이 HEX2BIN사용하므로, 10진수불가)
    •  나머지값은 각각 데이타 시트 참고 
    Table-3


    Electrical Characteristics and AC Operating Conditions(Table-4)

    B. EMIF->EMIF4D_SDRAM_TIMING_1,2,3설정 
    1. 현재 모델은 DDR3-1600임 확인한다.  (Table-1 확인)
    2. CK=1.25ns 값 ( CL =11 CK와 CWL=8 CK -> SDRAM_CONFIG에서 설정 )
    3. RCD=13.75ns, RP=13.75ns, RC=48.75ns 공통이며 최소 값으로 설정 (Table-2확인)
    4. RAS=35ns  최소설정 이는 RCD보다 반드시 커야한다. (Table-2)
    5. 세부 Timing 설정은 Table-4을 확인 
    6. RRD(x8)=4CK , WR=15ns  ,WTR= 4CK , RTP=4CK 으로 설정 
    7. CCD=4CK, RFC-4Gb=260ns (Table-4)
    8. XS= 5CK , 되지만,RFC+10ns 설정으로 270ns 설정 , XSDLL=512CK
    9. REFI=7.8us 로 설정 (***** 85C 이하 일 경우에만) 
    10. ZQCS=64CK ,XP=3CK 
    11. ODTLon = CWL(8) +AL(10)-2CK = 16CK(에러발생)  (3CK 설정 )
    12. RASmax=REFIx9 
    13. DQSCK=10ns (DLL을 Disable 사용)  
    14. RASMAX,RTW는자동설정됨 
    • AL(Additive Latency) = CL(11) -1CK = RCD - 1CK  설정 
    • RL(Read Latency)=AL(10)+CL(11)
    • WL(Write Latency)=AL(10)+CWL(8)
                            Ref. POSTED CAS ADDITVIE LATENCY


    C. EMIF->EMIF4D_SDRAM_REFRESH_CTRL 
         

         REFRESH_RATE=  800MHz / (1/tREFI)

        ex) 400MHz 일경우,  400/ (1/7.8) = 3120
        ex) 400MHz 일경우,  800/ (1/7.8) = 6240




    7/31/2015

    DRAM-2 Memory의 성능향상 방법 Bank Interleaving 과 Burst Mode 및 DLL

    1. Memory 성능 향상 방법  

    Bank Interleaving 찾다가 아래의 사이트를 발견하고 이를 정리한다.
    메모리 대역폭을 높이는 방법 중 Bank Interleaving 만 잘 모르것 같다.

    1. 메모리의 버스 폭(width)를 늘리는 방법.           ( 이미 정해져 있을 거라고 본다)
    2. 메모리의 operating_clock을 높이는 방법          ( 한계가 있으며, DDR의 Chip 확인)
    3. 메모리에 interleaving을 적용하여 대역폭을 높이는 방법.

    Interleave는 일반적으로 저장장소를 몇개로 나누어 이를 동시에 접근하도록 하는 것이다.

     http://blog.naver.com/signal97/197538037

    1.1. Memory Data Bus Bandwidth 조절 

    가장쉬운 방법이며, 사실 회로도를 봐도 성능이 더 나을 것이라는 것을 쉽게 파악이 가능하다.
    하지만 주의사항이 있다. 왜냐하면 본인의 SOC가 정확히 어디까지 Bandwidth 까지 지원이 되는지를 정확히 파악을 하고 사용해야 하기때문이다.

    우선 기본적인 SOC의 경우 외부 32Bit RAM Data Bus 아래와 같이 지원을 한다면, 1번이 가장 좋을 것이다.
    TI의 경우 1번을 미지원하는 저렴한 SoC를 보면 외부는 32bit이지만, 내부 Memory Interface는 16bit를 사용하기 때문에 별소용이 없다.
    그리고, 더불어 DRAM의 사용으로 인한 Power 소비와 가격 문제 및 부피 등을 고려해야 할때가 있으므로, SoC Memory Interface부분을 잘보자.


    1. 8bit DataBus DRAM  x 4 
    2. 16bit DataBus DRAM x 2
    3. 32bit DataBus DRAM x 1 
    4. 16bit DataBus DRAM x 1  (TI는 지원)

    상위에서 설명한 DLL을 Clock을 Overclock을 해서 사용하는 방법인데, 별로 권장할 사항은 아닌 것 같다.

    1.2. Bank Interleaving로 성능향상 

    최근에 알게된 정보이며, 가장 관심을 가지고 있는 기능이다.

    • DRAM의 기본동작  
    DRAM은 Physical Address를 사용하지 않기 때문에 처음 Bank 단위로 선택하고 CAS 와  RAS를 사용한다.
    예를 들면, 0x11001100 Bank 선택과 함께 Column Address 와 Row Address Read/Write Command와 Refresh Time 으로 동작한다.
    그래서 SoC는 이를 Physical Address를 DRAM Address로 변경하는 작업이 필요하다.
    (SRAM에 Refresh Time이 필요없다)


    • Bank Interleaving 의 기본이해 
    1개의 DRAM 안에는 8개 정도의 Bank가 있고, 이는 DRAM에 따라 다를 수 있으니 확인하자.
    Embedded에서는 1~4개 정도의 DRAM을 주로 사용하며,  각각의 Bank 수를 따지면 상당수의 Bank가 존재한다,
    이 Bank들을 각각 개별로 접근하고 지속적으로 순차적으로 읽고 쓴다면 성능이 향상이 된다는 개념이 바로 Bank Interleaving 이다.
    물론 여기에도 한계는 존재하며, 그 이상의 Interleave는 필요가 없을 것이다.


    • Bank Interleaving의 동작 및 사용방법 
    일반적으로 Physical 주소를 접근한다고 하면 동일한 1개의 Bank를 선택하고 순차적으로 저장하겠지만, Bank interleaving을 사용하면,
    SoC는 CS(Chip Select)선택이 된 후 , 각 개별 Bank를 선택하여 Read/Write를 진행을 한다.
    한마디로 데이타를 분할하고 개별 Bank에 빠르게 거의동시에 접근이 가능하는 것이다. 
    이는 Memory Controller에서 설정을 변경으로 순차적으로, 각 Bank를 이용한다면 아래와 같이 1개의 DRAM에서 약간의 성능의 향상 볼수 있겠지만, 많은 성능 향상은 기대하기 힘들다.
    DRAM의 Latency( Precharge time 등)을 줄이기 용도일 뿐 , Bank Interleaving 이용을 해도 많은 성능향상은 기대하기가 힘들다.

    왜냐하면, DRAM의 Bank의 Latency(즉 precharge Time 등) 과 Bank Interleaving의 갯수는 상충관계에 있기 때문에 이는 정해놓고 이용하는 것이 옳을 것이다.

      https://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC_%EC%9D%B8%ED%84%B0%EB%A6%AC%EB%B9%99

    • Bank Interleaving 개념 
    이글을 읽어보면, Bank Interleaving 통하여, Precharge Time도 줄일수 있다고 한다.
      http://www.kbench.com/?q=node/8417

    2. TI의 Memory 설정방법 

    관련내용은 AM437x


      http://processors.wiki.ti.com/index.php/AM335x_EMIF_Configuration_tips


    • DM8148

      http://processors.wiki.ti.com/index.php/DM814x_Overview
      http://www.ti.com/lit/ds/sprs647e/sprs647e.pdf

    TMS320DM8127 and TMS320DM814x DaVinci™ Digital Media Processors TRM (Rev. G)

      http://www.ti.com/lit/ug/sprugz8g/sprugz8g.pdf

    Dynamic Memory Manager (DMM)
    - 1162
    - Figure 7-3. DDR2/DDR3 Subsystem Block Diagram

    2.1 TI의 Bank Interleaving 

    TI 경우 Address mapping을 어떻게 하느냐에 따라 결정이 Bank Interleaving이 동작이 된다.
    DRAM 인 경우 Cols , Bank , Row Addr 을  Command 처럼 사용하지만 내부는 logical로 사용)
    CPU에 따라 다르지만, bus width 변경이 되는 것이 있지만, 안되는 것도 많은
    특히 예전 AP들  AM437x는 OCP Interface를 사용하여 변경이 가능하지만, 변경을 하여도 속도가 2배로 증가되지는 않음.
    (오히려, 관련 Threshold 설정이나, 다른 설정변경)






    상위의 Bank당 8개식 Bank Interleaving 한 것이며, 기본 개념은 아래에서 확인을 하자.

       https://en.wikipedia.org/wiki/Interleaved_memory
       https://en.wikipedia.org/wiki/Interleaved_memory#/media/File:Interleaving.gif

    위 그림은 개념만을 익히는 것으로 하고, 실제 AM487x 시리즈의 예를 보겠다.

    • Address Mapping (Bank Interleaving)

    Bank interleaving을 제대로 사용하기 위해서는 Logical address을 RAM 주소로 Mapping을 제대로 이해해야한다.

    정확히 말해서 OCP Address -> RAM 주소 변환이다. (OCP TI의 Device)

    Address Mapping은 DRAM의 Read or Write Operation 순서가 Read or Write Command 다음에 Cols 과 Bank가 바로 필요하기에 우측에 항상 먼저 Cols과 필요한 Bank수를 기록하는 방식으로 Mapping을 한다.

    그리고 이는 결정적으로 Bank interleaving의 갯수를 결정을 짓는다.

    • AM473x EX-1
    REG_IBANK_POS(칩내부 뱅크)와 REG_EBANK_POS(외부 칩)는 위치를 결정하며,
    Column Address 항상 맨 우측간다. 그리고, 그 다음 Bank Address Mapping과 CS(EBANK)
    가 Mapping되어 총 4bit의 Address가 Mapping되어 16개의 Bank interleaving 가능

    (CS(EBANK): 1bit  IBANK:3bit))

    • AM473x EX-2

    위와 동일하지만, IBANK: 2bit 와 CS:1bit  Mapping이 Column Address 다음 Mapping되어
    Bank Interleaving은 8개 밖에 지원을 못한다.
    자세한 내용은 데이타시트


    • DM385
    1. RSIZE:  Row Address's size
    2. PAGESIZE: Column Address's size
    3. IBANK: DRAM의 실제 BANK
    4. EBANK: DRAM의 갯수 






    3. Burst Mode (prefetch buffer)

    Burst Mode는 기본적으로 read or write command  한번에 몇번의 data를 보내는 방식이다. 이 기능은 오래전부터 존재했지만, 아래와 같이 buffer의 크기에 따라 진화해 가고 있으며, 변화해 가고 있다.

    • DDR의 prefetch buffer system의 변화
      1. DDR  :   2bit prefetch buffer system  (2 words)
      2. DDR2 :  4bit prefetch buffer system  (4 words) 
      3. DDR3 :  8bit prefetch buffer system  (8 words)

    Prefetch의 buffer size는 각각의 Data를 보낼 수 있는 능력을 말하며,
    DDR3일 경우 연속으로 8번까지 보낼수 있다.

          https://en.wikipedia.org/wiki/Prefetch_buffer
     

    • BC4 (burst chop)
    DDR3의 새기능이지만, 내용을 보면 별다른기능이 아니다, 위에서 봤듯이 DDR2->DDR3로 변화하면서, 8bit buffer system에 맞게 BL4를 BL8 포맷에 변화한 기능이다.
    BC4는 처음 4번은 전송하고 나머지 4번은 Mask 처리하는 방식인것이다.

              *DDR3에서는 BL4 대신 BC4를 사용 
     
         http://www.rampedia.com/index.php/define-burst_chop


    • AM437x 인 경우 

    EMIF는 기본적으로 Burst Mode로 동작을 하는 것 같다. .
    AM437x 인 경우,
                EMIF4D_READ_WRITE_EXECUTION_THR
                 write or read를 사용하는 burst 수?                    

    DDR3의 새기능 : burst chop은 8 burst 하는 아키텍처에서, BL4은 맞지 않기에, BL4를 새롭게 구현한 기능으로 , 4번을 동작하고, 나머지 4번을 Mask 처리하는 기능으로 BL4 대신 BC4을 사용한다.

                 



     MT41K512M8RH의 Datasheet 로 DDR3에서는 BL4 대신 BC4 or BL8사용 



    추가로, odering을 맘대로 변경이 가능

    http://forum.falinux.com/zbxe/index.php?document_srl=530529&mid=hardware
    http://forum.falinux.com/zbxe/index.php?document_srl=530859&mid=hardware


    * DDR3L SDRAM (MT41K512M8)  4Gb_DDR3L_2133.pdf
    * New Features of DDR3 SDRAM : E1503E10.pdf                                          
    * AM437x ARM® Cortex™-A9 Processors Technical Reference Manual: spruhl7c.pdf


    4. DLL(Delay -Locked Loop) 

    100MHz -> 133MHz 변경 166MHz 변경
              (이것은 DRAM의 Marking을 확인하고, 시도 )
       현재 DDR인 경우 거의 기본 CLOCK을 133MHz로 사용하는 걸로 기억

    PLL에 과 유사하며, DRAM에 제공되는 내부 CLOCK이다,
    현재 AM437x인 경우, CLOCK을 두 가지 모드로 동시에 제공을 하며 이는 Power Consumption 을 줄이기 위해서 사용을 한다. 예를 들면 한 CLOCK은 133 사용 , 또 다른 CLOCK은 266사용으로 동시에 사용하므로써, 내부 PLL을 재 설정이 필요 없이 RAM의 CLOCK을 변경하고 Power Comsumption의 소비를 줄일 수 있다.

          https://en.wikipedia.org/wiki/Delay-locked_loop
          http://blog.naver.com/force1206/220359308301
          http://blog.naver.com/circlebird/60057431287


    DDR SDRAM은 온칩 DLL(delay-locked loop)을 이용하여 DQS와 이에 상응하는 DQS를 클럭 아웃 시킴으로써 이들이 잘 일치하도록 하며, 전압 및 온도가 변화할 경우 서로를 추적할 수 있다

    http://www.eetkorea.com/ARTICLES/2006OCT/PDF/EEKOL_2006OCT16_INTD_STOR_TA_05.PDF?SOURCES=DOWNLOAD



    7/30/2015

    DRAM-1 Module RAM의 구성과 Type 및 각 용어 설명

    1. DRAM on the Module

    E0593E20의 문서를 보면, Mother Board의 Termination은  signal refrection을 줄이기 위해서 추가한 저항이라고 나와 있다.

    하지만  Embedded 쪽에서는 이 Termination이 필요성이 있는지 부터가 의문이 들었으며,
    Embedded에서는 사용설정이 필요없을 것 같지만, 왜 사용하는지 정확히 파악하기 위해서
    사용되어지는 용어와 구성요소들을 이해하기 위해서 비교하면서 적어본다.
    일단 간단히 용어와 구성을 이해하고 넘어가자.


    기본설명은 Module RAM 기반으로 하며, Embedded 의 구성과는 다소다르다.

    1.1 Module RAM의 Topology 

    Module RAM과 Embedded의 Topology 구성은 다르며,  각각의 구성되는 부분을 알아보자.
    • Module RAM의 기본구성 방법 
    1. T-Branch : Bus의 길이가 같으며, Latency가 동일하다 
    2. fly-by Topology : Bus의 길이가 뒤로 갈수록 길어지기에, Latency가 달라진다. 


    Module RAM의 구성은 위와 같이 T-Branch와 fly-by Topology 방식이다.


    • Embedded 의 구성 (AM437x의 8bit 모드)

    일반적인 Embedded SOC 32bit Bus를 가진 경우는 Memory Controller부분에 관한 회로설계를 각각  확인해봐야겠지만,

    AM437x인 경우에는 fly-by Topology 방식으로 연결이 아래와 같이 되고 있으며,
    EMIF에서는 32bit 이고 각 개별 RAM 마다 8bit의 모드로 연결이 되어 구성이 된다.
    Data Bus로 4개의 DRAM개까지 다는 것이다.
    물론 SOC에 따라 Memory의 8bit 모드도 지원이 되지 않을 수도 있어 16bit 모드로 2개 or 32bit로 단일로 구성할수도 있다.




    DM8127인 경우  fly-by Topology 방식과 동일하지만 아래의 EMIF가 2개까지 확장이 가능



    1.2 Leveling 이란 


    fly-by topology로 구성할 경우 CMD/ADD/CLK과  DQ/DM/QS사이 생기는 Timing 오차로 생기는 문제를 없애고자 함이다.
    이런 신호전달지연과 같이 이 Timing 을 보정하여 극복하려는 문제이다. 



    Read Leveling 은 System calibration 작업에 사용이되며, 즉 DDR3이 predefined data pattern, micron일 경우, 0,1,0,1 or 0,1,0,1,0,1,0,1,0,1를 연속적으로 보내면, Controller는 DQ/DQS Capture Timing을 MPR을 사용하여 조절한다.


    Writing Leveling은 DDR3는 변형된 CLK-DQS 보내고, Contoller는 CMD,ADD,CLK신호가 DDR3에 동시에 DQ, DM,DQS 신호 함께 도착하도록 이 Timing을 정보를 이용하여 조절한다.







    • DM8127 or DM8148 
    TI는 SOFT Leveling로 구현을 하며, trace length delay, 즉 선로 길이 지연을 보상한다.

      http://processors.wiki.ti.com/index.php/TI814x-DDR3-Init-U-Boot
      http://electronics.stackexchange.com/questions/86287/what-is-ddr-software-leveling

    관련 Register DDRPHYCR (DDR PHY Control Register)

    1. RDEYE_LVL_DIS
    2. GATE_LVL_DIS
    3. WR_LVL_DIS


    • AM437x 의 설정 
    HW Leveling 지원 및 PVT( Process, Voltage, Temperature)를 추측하는 기능이존재


    1.  EMIF4D_READ_WRITE_LEVELING_RAMP_WINDOW
    2.  EMIF4D_READ_WRITE_LEVELING_RAMP_CTRL
    3.  EMIF4D_READ_WRITE_LEVELING_CTRL
    4.  EMIF4D_STS Register


    *HW Leveling 과 SW Leveling 의 차이는 SOC의 지원여부 및 설정되는 것이겠다.


    1.3 MBT와 ODT (On Die Termination)

    SOC는 각각의 DRAM과 통신하는 동안 신호의 반향 (Signal Reflection)을 막아주기 위해 Termination이 필요하다.
    DRAM의 Termination의 방법은 아래와 같이 두가지 방법이 존재하다.

    1. MBT : 외부에 Ground 함께 저항 (pull-down)을 두고 연결하여 Termination  
    2. ODT : 내부에서 Hi-Z로 Termination으로 종료하는 것 같다



    • ODT의 기본구성 
    다른 Device가 통신하는 동안 신호의 반향 (Signal Reflection)을 막는 것이 말 그대로, Termination 을 하는 것 같다.
    하지만 DDR2와 DDR3는 구조가 다르지만 구현되는 구조는 동일한 것 같다.

      https://en.wikipedia.org/wiki/On-die_termination#References.4F  (Samsung)



    • ODT Resistor 
    외부의 RZQ라는 Termination 저항 240R을 GND에 묶어 사용하고, 위에서 처럼 RTT는 내부에서, 2, 4, 6, 8, or 12을 나누어 저항변경하여 사용하는 것 같다. 이는 위에서 언급한 signal refrection을 줄이는 기능이다.
    동작방식은 최신기술인 Dynamic ODT인 경우 MRS Command 없이, ODT pin 값이 변경이 이 설정된 값으로 자동으로 변경이 된다. (ex. 240R/4 이는 MR Register 설정 가능 )

         RTT= RZQ / 2,4,6,8 or 12

    그리고 참고로, 이 RTT가 DQ,DM,DQS,DQS#, and TDQS,TDQS 영향이 끼친다고 한다고
    하지만, 현재봐서는 Embeded에서 크게 사용되지 않을 것 같다.

    • Output Driver Impedance (Ron)
    Ron 이라는 output driver 저항이 있는데, 이 부분이 Rtt와 동일한 것 같으며.
    Rtt는 Writing 시에만,이용이 되지만, Ron만 사용하는 것이 아닌지? 지금 혼동이 됨. 
    Ron은 PVT (Process , Voltage, Temperature) 증가시킨다고 함.
    1. DQ : (Data bus: Data I/O) 4bit or 8bit 조정가능 
    2. DM,  (Input data mask: I ) : Write data를 위한 input mask 
    3. DQS, DQS# :(Data strobe: I/O): Data 신호 (Edge-aligned with read data,Center-aligned to write data) 
    4. TDQS, TDQS# (Termination data strobe: O ) : 현재 EVM에서 역시 사용안함.


    • DDR3 구조 





    2. Embeded 설정 필요성 


    Micron User Manual 문서와 Samsung 관련 및 엘피다 문서를 읽다보면 ODT 기능 및
    Termination 저항 그리고, Writing 및 Reading Leveling 모두 Module RAM에만 종속이 되어있는 기술 같이 설명 되어있다.

    그리고, 생각을 해보면, 그럴 것 같다. Embedded 쪽에서는 DDR을 8bit로 버스로 4개 혹은 16bit로 2개 사용하여, Waiting for access 및 대기 모드 상태 일때가 없고, 위와 같은 Termination 저항의 필요성 및 ODT가 필요할지 모르겠다. fly-by topology 문제도 없으니,
    구지 Leveling 까지로 Timing 조절을 할 필요가 없을 것 같다.

    아직 정확한 설정필요성의 여부를 판단하지 못하겠다. EVM에서도 역시 사용하지 않는 것 같다. TI의 DDR 관련 문서가 없고, 회로도에서 Rtt & Ron 저항을 발견을 못했다.
    다만 설정에 Dynmic ODT사용을 하지 않으며 고정으로 저항값을 변경하여 설정했다 (Rtt)


      http://www.micron.com/parts/dram/ddr3-sdram/mt41k512m8rh-125

    * New Features of DDR3 SDRAM :E1503E10.pdf
    * New Features of DDR3 SDRAM :E1503E10.pdf
    New Function of DDR2 SDRAM On Die Termination (ODT) : E0593E20.pdf
    * MT41K512M8RH Datasheet  (ODT Characteristics)


      https://en.wikipedia.org/wiki/On-die_termination#Why_is_on-die_termination_needed.3F
    참조문서



    기타 참조사이트

      http://www.easytv.co.kr/93     (DDR3  ODT)
      http://www.easytv.co.kr/114   (DDR3 ZQ Calcaulation)
      http://www.easytv.co.kr/115   (DDR3 DYN ODT)
      http://www.easytv.co.kr/120   (DDR3 Prefetch
      https://en.wikipedia.org/wiki/On-die_termination
      https://en.wikipedia.org/wiki/On-die_termination#Why_is_on-die_termination_needed.3F
                               

    1/12/2014

    DRAM - SDRAM 과 DDR 비교

    1. DRAM의 변화  



    Micron에서 제공하는 그림을 보면 SDRAM->DDR->DDR2->DDR3 쉽게 이해를 할수가 있다
    내부 Memory Core는 동일하지만, I/O Buffer 가 있어 동시 접근하여 Data를 얻어오는 방식으로 외부 Clock을 증가(Prefetch의 증가)하는 형태로 변해가고 있으며,
    외부 Edge Timing에 Data를 전송한다.


    SDRAM 과 DDR 차이점
      http://blog.naver.com/signal97/199835744

    DDR2/DDR3 관련사항 
      https://en.wikipedia.org/wiki/DDR3_SDRAM
      https://en.wikipedia.org/wiki/DDR2_SDRAM

    CAS latency (ns) = 1000 × CL (cycles) ÷ clock frequency (MHz)
    CAS latency (ns) = 2000 × CL (cycles) ÷ transfer rate (MT/s)

    2. DDR의 기본 데이타 전송방식


     DQS는 판독시에 DDR SDRAM에 의해 에지 정렬되어 전송되며, 메모리에 대 한 기록시에는 컨트롤러에 의해 중앙정렬 되어 전송된다.

    http://www.eetkorea.com/ARTICLES/2006OCT/PDF/EEKOL_2006OCT16_INTD_STOR_TA_05.PDF?SOURCES=DOWNLOAD


    3. DDR의 변화



         https://en.wikipedia.org/wiki/DDR_SDRAM










    • 그림출처

      New Features of DDR3 SDRAM : E1503E10.pdf
      https://www.micron.com/~/media/documents/products/technical-note/dram/e1503e10.pdf

    12/08/2013

    DRAM 기본이해

    1. DRAM의 기본구성 

    DRAM(Dynamic RAM)으로 1bit를 저장하기위해서 SRAM과는 달리 캐패시터를 사용한다.
    캐패시터에 데이터를 저장하다보니, 매번 충전( Recharge) 해야하는 번거러운 작업이 생기고, 이로 인하여 속도역시 SRAM에 비해 떨어진다.
    하지만 SRAM에 비해 기본으로 사용하는 TR의 수가 줄어들어 제조원가가 줄어든다.

    1.1 DRAM의 Cell 구성 (1bit 저장)
    DRAM에서의 TR은 스위치 역할로 생각하면 되겠으며, 캐패시터의 방전과 회로를 연결하는 역할한다.
    Word Line (Row Line) 와 Digit Line(Column Line) 교차하여 캐패시터를 연결하여, 1 bit Data를 잠시 저장할 수 있는 셀을 만들어 준다.

    Vcc/2를 GND로 생각하면 이해가 쉬운그림이며, 실제로는 GND가 아니라고 하니, Vcc 즉 전압의 반으로 연결이 되었다고 한다.

    Ccell이 아래의 캐퍼시터의 용량이라면 다음과 같이 저장이 된다고 한다.
    1. Data가 1일 경우는 전하량은   Q = +Vcc/2 * Ccell 
    2. Data가 0일 경우는 전하량은   Q = -Vcc/2 * Ccell  

    예를들면, Vcc가 3.3V이면 Vcc/2는 1.65V이며, Ccell은 50fF 이고, Cline은 300fF이라고 한다.



    좀더 세부적으로 알고 싶다면 아래의 출처에서 관련정보를 얻자.

    1.2 DRAM의 ARRAY 구성 


    상위 DRAM의 Cell을 ARRAY로 구성을 하면 아래와 같아지는데, 이곳에서 약간의 문제가 있다고 한다.
    Cline의 전하량이 증가하면,  Signal의 신호가 제약이 된다고 한다.
    (이 부분은 아래의 참조의 Vsignal 부분을 보면 될것이다.)
    그래서 중간에 SenseAmps를 두어 양쪽 Digit Line을 맞춰준다고 한다.

    모델-1

    모델-2

    2. DRAM의 전체 및 동작사항  

    DRAM의 기본구조를 알았으니, 실제 동작되는 것에 대해 알아보자.
    위에서 Row Line과 Column Line을 조정하는 것이 아래의 신호이며, Address이기 때문에 주소가 존재한다.

    1. CAS(Column Address Strobe) 
    2. RAS(Row Address Strobe)

    DRAM은 상위 두 개의 주소로 해당 DATA들을 분석을 해서 읽는다.



    출처 및 참고사항
      http://www.cse.scu.edu/~tschwarz/coen180/LN/DRAM.html
      https://en.wikipedia.org/wiki/Dynamic_random-access_memory
      https://en.wikipedia.org/wiki/Orders_of_magnitude_(capacitance)  (fF 단위)


    3. DRAM의 종류 및 기능


    • 기타 DRAM
    1. DRAM (Page Mode DRAM)
    2. FPM DRAM (Fast Page Mode DRAM)
    3. EDO DRAM (Extended Data Output DRAM)
    4. BEDO DRAM (Burst EDO DRAM)


    • 최신 DRAM 
    1. SDRAM (Synchronous DRAM)
    2. DDR
    3. DDR2
    4. DDR3
    5. mDDR(LPDDR)
    6. LPDDR2

    • LPDDR
      http://ko.wikipedia.org/wiki/%EB%AA%A8%EB%B0%94%EC%9D%BC_DDR


    3.1 DRAM의 Timing 약어 

    SoC에서 DRAM을 설정을 해야 할 경우가 발생하는데, 이와 관련된 Timing 관련 약어를 정리한다.
    SoC와 DRAM사이의 용어가 약간씩은 다를 수가 있다. 하지만 쉽게 유추해서 알수 있다.


    • 일반적인 Timing
    1. tCL – CAS latency
    2. tCR – Command rate
    3. tPTP – precharge to precharge delay
    4. tRAS – RAS active time
    5. tRCD – RAS to CAS delay
    6. tREF – Refresh period
    7. tRFC – Row refresh cycle time
    8. tRP – RAS precharge
    9. tRRD – RAS to RAS delay
    10. tRTP – Read to precharge delay
    11. tRTR – Read to read delay
    12. tRTW – Read to write delay
    13. tWR – Write recovery time
    14. tWTP – Write to precharge delay
    15. tWTR – Write to read delay
    16. tWTW – Write to write delay


    • 기타 관련 Timing
    1. tXP
    2. tODT
    3. tXSNR
    4. tXSRD
    5. tCKE
    6. tPDLL_UL
    7. tCSTA
    8. tCKESR
    9. tRAS_MAX
    10. tTDQSCKMAX


    • 타이밍 읽는법 

      http://egloos.zum.com/recipes/v/4974281

    참조문서:
    임베디드 메모리 최적화 기법
      http://en.wikipedia.org/wiki/Dynamic_random-access_memory
      https://en.wikipedia.org/wiki/DDR_SDRAM
      https://en.wikipedia.org/wiki/DDR2_SDRAM
      https://en.wikipedia.org/wiki/DDR3_SDRAM


    3.2 SDRAM의 기본구조 

    일반적인 DRAM을 보면 아래와 비슷한 구조를 가지고 있다.
    CS(Chip Select) 선택이 된 후 아래와 비슷한 순서로 접근 했던 것 같다.
    기억이 가물가물해서 Bank Select도 있었던 것 같은데, 그것을 나중에 Datasheet를 보고 수정해야 정확하겠다.

    CSRASCASWEBAnA10AnCommand
    HxxxxxxCommand inhibit (No operation)
    LHHHxxxNo operation
    LHHLxxxBurst Terminate: stop a burst read or burst write in progress.
    LHLHbankLcolumnRead: Read a burst of data from the currently active row.
    LHLHbankHcolumnRead with auto precharge: As above, and precharge (close row) when done.
    LHLLbankLcolumnWrite: Write a burst of data to the currently active row.
    LHLLbankHcolumnWrite with auto precharge: As above, and precharge (close row) when done.
    LLHHbankrowActive (activate): open a row for Read and Write commands.
    LLHLbankLxPrecharge: Deactivate (close) the current row of selected bank.
    LLHLxHxPrecharge all: Deactivate (close) the current row of all banks.
    LLLHxxxAuto refresh: Refresh one row of each bank, using an internal counter. All banks must be precharged.
    LLLL0 0modeLoad mode register: A0 through A9 are loaded to configure the DRAM chip.
    The most significant settings are CAS latency (2 or 3 cycles) and burst length (1, 2, 4 or 8 cycles)


    • Read or Write Command 순서 
    1. Active 
    2. Read or Write (burst data Read or Write)
    3. Read or Write with Auto precharge or Precharge or Precharge all 



    • Read or Write 순서예제  
    1. RAS#와 함께 Bank와 Row Address 입력  
    2. CAS#, WE#, A10 함께 Read or Write  Bank와 Column Address 입력 DQS 동작 
    3. CAS#, WE# 함께 Read or Write Auto precharge 



    • CS: Chip Select
    • RAS: Row Address Strobe 
    • CAS: Column Address Strobe
    • WE: Write Enable
    • BAn: Bank Address 1,2,3,4
    • A10/AP: A10 이며, Auto precharge 의미
    • A12: Bust Chop  
    • An: Address Input 0~13 
    • DQS: Data Strobe
    • TDQS: Termination Data Strobe 


    • 참조 Datasheet
    1. k4b1g1646e-hch9.pdf
    2. MT41K512M8RH

      http://en.wikipedia.org/wiki/Synchronous_dynamic_random-access_memory
      https://en.wikipedia.org/wiki/Synchronous_dynamic_random-access_memory#Generations_of_SDRAM

      https://ko.wikipedia.org/wiki/JEDEC
      https://en.wikipedia.org/wiki/JEDEC


    3.3 Power Down 모드 ( Self Refresh Mode)

    Power Management 입장에서 DRAM을 바라보면, 항상 SoC/CPU가 항상 DRAM을 제어 및 Refresh를 해줘야한다.
    하지만 SoC가 전력소모를 줄이기 위해서 DRAM의 정보 사용을 하지 않을때에는 이 기능이 필요하다.
    DRAM 자체적으로 Self Refresh Mode로 동작을 하면 SoC에 의존적일 필요가 없다.
    대신 SoC(ARM)의 경우 거의 전력을 소비하지 않지만, 간혹 이런것을 구현해야 할필요가 있다.

      MT41K512M8RH
      State Diagram (Command 순서 및 Self Refresh Mode)
      Commands – Truth Tables  ( Command)
      Table 69: Truth Table – CKE ( Command)
      DLL Enable/DLL Disable  (Self Refresh)
      Table 74: Burst Order (Interleave)
      Figure 5: 256 Meg x 16 Functional Block Diagram (MUX는 Prefetch)

      https://en.wikipedia.org/wiki/Synchronous_dynamic_random-access_memory#Low_power_modes

    • Power Down
      http://www.jedec.org/sites/default/files/docs/JESD209-2B.pdf