용's

[Chap 4] ARM Organization & Implementation 본문

Computer Science/Embedded System

[Chap 4] ARM Organization & Implementation

TaeYOng's 2014. 10. 21. 01:24

4.1 3-stage pipeline ARM organization

- ARM의 초기 버전이 선택한 3단계 파이프라인

- Register Bank, Barrel shifter, ALU, Address reg and incrementer, Data reg, Instruction decoder & Control Logic 등으로 구성됨.

- Register bank의 경우 2개의 Read port와 1개의 Write port에다가 추가적으로 1개의 read port, 1개의 write port가 더 있다. 추가적인 포트들은 r15(PC)에 접근하기 위함이다.



- 3단계 파이프라인은 ARM7에서 채택되었으며 Fetch - Decode - Execute 로 3단계로 이루어짐

Fetch: 명령어를 메모리로부터 인출함.

Decode: 명령어가 해독되며, Data path 제어 신호를 발생한다.

Execute: Reg Bank가 Read되고, Operand가 시프트되거나 ALU에서의 결과 값이 발생함. 그리고 다시 목적 레지스터에 write 까지 진행.


<Single-Cycle 명령어 파이프라인>


<Muliti-Cycle 멸령어 파이프라인>

- STR이나 LRD 같은 명령어들은 fetch 때도 메모리에 접근하지만 execute 때도 메모리에 접근함(데이터를 가져오거나 저장하거나) 따라서 execute부분이 목적주소를 계산하는 부분과 데이터를 전송하는 두 부분으로 나눠짐. 여기서, 데이터가 전송될 때 B-Bus를 이용하는데 이때는 다른 명령어들이 파이프라인에 들어올 수 없음(처리 되지 않음).

=> 파이프라인의 Structure Hazard 해결 하는 부분)




4.2 5-Stage Pipeline ARM organization

- 5단계의 파이프라인은 ARM9에서 채택됨.

- 한 프로그램을 처리하는데 걸리는 시간을 T라고 할 때 이 시간을 줄이는(성능을 높이는) 방법은 두 가지가 있음

=> Clock Rate(f_clk: 프로세서의 클록 주파수)를 증가시키는 방법: 이 방법은 pipeline 명령어의 critical path를 줄임으로써 가능하다. 즉, 명령어의 stage(단계)를 늘임(주기를 줄임). 예로, 한 stage에 2sec걸리는 것을 1sec와 1sec로 나눔

=> 명령어 당 평균 클록 사이클 수를 줄이는(CPI를 줄이는) 방법: 예를 들면 STR은 4 stage인데, 이것을 다른 inst 처럼 3-stage로 바꿔 줌.

- Stored program computer에서는 단일의 명령어&데이터 메모리를 가짐으로써, 메모리 대역폭에 따라 성능이 제한된다. 이를 위해 단일 메모리로 부터 한 사이클에 32비트 이상의 값을 가져오거나 쓰게 함으로써, 또는 명령어를 읽어오는 인터페이스(명령어 캐시)와 데이터를 일고 쓰기 위한 메모리 인터페이스(데이터 캐시)를 별도록 갖도록 함으로써 성능 제한을 막을 수 있음 

=> 이를 위해 ARM9에서는 5-Stage pipleline을 채택했으며, 명령어캐시와 데이터캐시를 둠으로써 더 높은 성능을 내었음(이를 하버드 구조라고 함).


- ARM9에서의 파이프라인

=> Fetch: 명령어를 읽어(명령어 캐시에서 읽어 올 수 있음) 프로세서 내의 명령어 해석기로 전달. 이 때 PC 값 위치에서 읽혀진다.

=> Decode: 명령을 해석하고 프로그램을 실행할 준비를 함. 이때, 데이터 처리 명령(ADD, SUB, ...)의 경우에는 레지스터 뱅크에서 2개의 오퍼랜드를 읽는 동작이 이루어지며, 데이터 전송 명령(STR, LRD)의 경우에는 레지스터 뱅크에서 베이스 레지스터 값과 오프셋 값을 읽어옴. 이 때는 PC-4의 위치에 있는 명령을 디코드 하는 것.(이미 다음 명령어가 fetch되어 PC값이 증가함)

=> Execute: 데이터 처리 명령의 경우 ALU에서 적절한 논리 산술 연산을 수행하고, 데이터 전송 명령은 ALU를 이용하여 엑세스할 메모리의 유효한 주소를 게산한다. 

=> Memory: 데이터 전송 명령은 메모리(데이터 캐시)에서 실제 데이터 값을 읽어온다. 데이터 처리 명령은 별다른 동작 하지 않음

=> Write: 읽어온 데이터 또는 연산의 결과를 레지스터에 기록한다.


- 인터락(Interlock): LDR 명령에서 사용된 대상 레지스터를 다음 사이클에서 사용하여 모든 사이클이 지연되는 현상(Data Dependency로 생기는 지연 현상)

예) LDR    R4, [R5]

     ADD    R1, R4, R4

위와 같은 경우, LDR 명령에서 사용된 대상 레지스터 R4가 바로 다음 명령에서 사용되여 Execute되려고 한다. 즉, R4 레지스터를 메모리에서 데이터를 읽어오기전에 (Memory 단계 전에) 사용하여 ADD에서 잘못된 결과를 가지게 됨. 

=> 데이터 포워딩(Data Forwarding)으로 해결할 수 있다. 즉, ALU로 부터 나온 값을 B버스에 MUX로 연결하여 MUX에서 해당 레지스터 값을 선택할 수 있도록 함.

<그림1>


- 그림 1에서, RF에서 마지막 단계인 RF로 가는 최상의 길(Critical Path)는 2단계로 크게 나눠서 볼 수 있다.

1단계(Phase 1): Register Read하는 단계(ALU 전까지)

2단계(Phase 2): ALU&Register Write하는 단계

이 두 단계에서의 Critical Path를 확보하는 최소의 시간은 레지스터 읽는 시간, 시프터 지연, ALU 지연, 레지스터 쓰기 셋업 시간 등등의 합으로 나타 낼 수 있다.

특히 ALU 지연은 산술 연산(Addition, Subtraction)이 지배적이다. 그 이유는 이 연산들에는 Carry propagation(캐리 전파)이 포함되어 있기 때문.

=> 따라서 Adder와 같은 것들을 어떻게 설계하냐가 중요함.


1) Adder Design

- 1세대 ARM(ARM1): Simple ripple carry adder를 사용함. 

=> Ripple carry adder는 캐리가 물흐르듯이 계속 Full adder에 전달되는 형태의 덧셈기

- 2세대 ARM(ARM2): 4bit Carry look-ahead adder를 사용함.

=> Ripple carry adder의 단점(최악의 경우의 Carry path 길이)을 보완하기 위해 미리 캐리를 계산하는 덧셈기

- ARM6: Carry select adder를 사용함

=> 전단계에서 carry를 받아서 계산하지 않고, 캐리가 있는 경우와 없는 경우(0 혹은 1) 두 가지 경우를 모두 계산한 뒤 발생하는 carry에 따라 이를 multiplex하여 결과값을 얻는다. 


 2) Barrel Shifter

- 곱셈기를 이용할 경우 여러 개의 내부 사이클이 별도로 소요되는 반면, 데이터 처리 명령과 쉬프트 동작을 사용하여 1사이클 내에 곱셈 연산이 가능하도록 한다. 이는 성능 향상에 결정적인 부분이다. 



Comments