Github Page

레이블이 Opt-DRAM인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Opt-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/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

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

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


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는 일반적으로 저장장소를 몇개로 나누어 이를 동시에 접근하도록 하는 것이다.

Bank Interleaving
 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의 갯수는 상충관계에 있기 때문에 이는 정해놓고 이용하는 것이 옳을 것이다.

Memory 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 과 AM335x
TI의 EMIF Memory Config로 S/W Leveling 
  http://processors.wiki.ti.com/index.php/AM335x_EMIF_Configuration_tips


  • DM8148
TI의 EMIF 관련부분 확인 
  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)
Dynamic Memory Manager (DMM)/TILER
- 6.1.1 Overview
- 6.1.3 Functional Block Diagram
- 6.2.1.6 Section Mapping
  - Figure 6-7. 128B and 256B Interleaving
  - Figure 6-8. 512KB and 1KB Interleaving
- 7.2.4 DDR2/DDR3 Memory Controller Subsystem Overview
  - 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 한 것이며, 기본 개념은 아래에서 확인을 하자.

Interleved memory 
   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의 소비를 줄일 수 있다.

  • DLL(Delay-Locked Loop) 과 PLL(Phase-Locked Loop)
일단 간단히 설명정리를 하면 PLL은 VCO기반으로 Phase 겹쳐서 증폭 목적으로 사용하는데, DLL은 주로 보면, DRAM의 Timing의 보정을 목적으로 한다. 
사용되는 목적이 다른 것 같으며, 상위 글과 아래의 글을 읽어보면, DLL의 경우 위상차를 찾아 이 타이밍을 개선하는 것이다.   
쉽게말해, 지연시간이 감지하고 이를 DRAM Timing 보정하는 것이다. 
    http://blog.naver.com/force1206/220359308301
    http://blog.naver.com/circlebird/60057431287

이곳에서 자세한 PLL과 DLL에 대한 것을 다루는 것은 나도 세부적으로 잘 모르기에 더 찾아봐야 하겠지만, 
PLL은 온도 와 환경 그리고, VCO에 따라 성능이 달라진다고 한다.


DDR SDRAM은 온칩 DLL(delay-locked loop)을 이용하여 DQS와 이에 상응하는 DQS를 클럭 아웃 시킴으로써 이들이 잘 일치하도록 하며, 전압 및 온도가 변화할 경우 서로를 추적할 수 있다
  http://www.eetkorea.com/ARTICLES/2006OCT/PDF/EEKOL_2006OCT16_INTD_STOR_TA_05.PDF?SOURCES=DOWNLOAD

  • DRAM-1 Module RAM의 구성과 Type 및 각 용어 설명
아래의 DLL의 경우는, Leveling 보면 될 꺼 같다.
  https://ahyuo79.blogspot.com/2015/08/ddr-module-card.html