1 - 전체요약 4. ARM 조직과구현
2 4.1 3 단계파이프라인 ARM 조직 레지스터뱅크 : 레지스터접근을위한 2개의입력포트, 1개의출력포트, 프로그램카운터를위한 1개의입출력포트배럴쉬프터 : ALU 입력전자리이동과회전수행 ALU : 산술연산, 논리연산실행어드레스레지스터 : 메모리주소저장어드레스증가기 : 연속적인메모리주소생성데이터레지스터 : 메모리로부터읽은데이터나저장할데이터를저장명령어디코더 : 명령어해석및분석제어로직 : 명령어실행을위해필요한제어신호생성
3-3단계파이프라인동작 ARM7까지 Fetch, Decode, Execute (Datapath) 의 3단계파이프라인사용 싱글사이클명령어의파이프라인동작 : 각명령어실행을위해 3 사이클이필요 (3-cycle latency), 처리량은 1 사이클당 1 명령어 1 사이클에메모리를한번밖에접근할수없기때문에 STR 과같이메모리 접근이필요한명령어는멀티사이클명령어가됨
4 멀티사이클명령어의 3 단계파이프라인동작 2번째 STR 명령어의어드레스계산사이클동안에제어로직은데이터전달을위한제어신호를생성하여야하므로 3번째명령어는 1 사이클지연, 2번째명령어가데이터를위해메모리접근을하므로 5번째명령어는 1 사이클지연 ( 메모리접근에비례하여소요사이클이결정 )
5 ARM 파이프라인중단이발생하는경우 -PC 동작 r15를첫번째이외의단계에서사용하게되면첫번째단계에서 r15는증가하기때문에잘못된결과를초래할수있음 r15 (PC) 을통해이동할주소를계산하는프로그래머는파이프라인의동작을정확하게파악하여야함 (STR의첫실행사이클에서 r15는 PC+8이읽혀지고두번째실행사이클에서는 PC+12이읽혀짐 ) 어셈블러나컴파일러가변위나 offset를계산하도록하는것이좋음
6 4.2 5단계파이프라인 ARM 조직 - 3단계파이프라인보다높은성능을얻기위해 5단계파이프라인으로조직변경 - 프로그램의명령어수가 N inst, 명령어당평균사이클수가 CPI, 프로세서의클럭주파수가 f clk 일때프로그램실행시간은 T prg = (N inst CPI) / f clk 임 - 프로그램실행시간을줄이는방법 프로세서의클럭주파수증가 : 파이프라인단계를간단하게하여야하고이로인해파이프라인단계가증가함 CPI 감소 : 3단계파이프라인에서멀티사이클명령어를파이프라인개선으로싱글사이클실행으로만들거나파이프라인지연을최대한줄임 - 메모리 bottleneck 3단계파이프라인은모든사이클에서메모리를접근하므로부분적인성능개선이쉽지않음 ( 메모리접근을하지않는단계를추가할필요 ) 한번에전달하는데이터량을증가하거나명령어와데이터메모리를분리 더높은성능을위해 5단계파이프라인도입과메모리를분리 (ARM9TDMI)
7-5 단계파이프라인 Fetch : 명령어메모리에서명령어를 fetch함 Decode : 명령어를해석하고레지스터오퍼랜드를읽음 Execute : 오퍼랜드가 shift되고 ALU 연산이실행, 명령어가 load, store이면 ALU에서메모리주소를계산함다중데이터이동명령어를위한주소증가하드웨어추가 Buffer/data : 데이터메모리접근하고 ALU 결과를임시로 buffer에저장 Write-back : ALU 결과와메모리데이터를레지스터에저장
8 - 데이터전방전달 (forwarding) 파이프라인이 5단계로늘어나면명령어실행이 1사이클에서 3사이클로증가하므로데이터해저드가발생 데이터해저드에의한파이프라인지연을없애기위해전방전달을위한하드웨어추가 결과가레지스터에저장되기이전에다음명령어의소스오퍼랜드를위해명령어실행흐름의반대방향으로데이터를전달 앞명령어가적재명령어이고다음명령어에서데이터해저드가발생하면 1 사이클지연이필요 ( 메모리데이터는 buffer/data 단계에서이용할수있으므로 ADD 명령어는 1 사이클지연필요 )
9 파이프라인지연을없애기위해위의형태의코드를작성하지말아야하고컴파일러도위의형태의코드를생성하지않아야함 -PC 생성 1번째단계에서 PC는 PC+4로증가하고 decode 단계의 r15에저장 Decode 단계에서레지스터 r15를읽으면다음명령어의 PC+4, 즉현재명령어의 PC+8이읽혀짐, 하드웨어추가없이 3단계파이프라인과동일 4.3 ARM 명령어실행 - 각명령어가데이터패스에서어떻게실행되는지를파악하는것이필요 데이터처리명령어는하나의실행사이클이필요하지만저장명령어 (STR) 은 2 사이클실행이필요하고적재명령어 (LDR) 은 3 사이클실행필요 Branch 명령어는 3 사이클실행이필요한데첫번째사이클에서 branch 주소를계산하고두번째사이클에서필요하면복귀주소를 r14에저장하고마지막사이클에서 r14를 PC+8에서 PC+4로조정하면서 refilling을완료
- 데이터처리명령어실행 (3 단계파이프라인 ) 10
- 데이터이동명령어 STR 실행 (3 단계파이프라인 ) 11
- 분기명령어실행 (3 단계파이프라인 ) 12
13 4.4 ARM 구현 -Adder 설계 32 비트덧셈시간은데이터패스의사이클시간, 최대클럭주파수, 프로세서성능에많은영향을줌 ARM은연속되는버전에서 adder의성능을연속적으로개선 ARM1 ripple-carry adder (RCA) : Carry 전달을위해 32 게이트지연필요
14 클럭주파수를증가시키기위해 ARM2 는 4 비트 carry look-ahead (CLA) 사용 (Carry 전달을위해 8 게이트지연필요, ARM1 보다성능개선 ) G(i) = A(i) B(i) P(i) = A(i)+B(i) C(i+1) = G(i) + P(i) C(i) ALU 는덧셈뿐만아니라논리연산, 메모리주소계산, branch 여부계산 등을수행하여야함
ARM2 ALU 로직과기능코드 15
좀더나은성능을위해 ARM6 는 carry-select adder 를사용 (carry 입력이 0 이거나 1 모두 sum 을계산한후정확한 carry 입력에의해결과를선택 ) 16 덧셈출력을위해 O[log 2 [word width]) 지연으로덧셈시간은감소하지만 실리콘면적이증가함
ARM6 carry-select adder 는산술기능과논리기능을위해하나의형태로 통합할수없어 ARM6 의 ALU 는 adder 와논리장치가분리되어있음 17
18 C와 V 플래그는 adder에서발생, N 플래그는결과의부호비트, Z 플래그는결과에 32 비트 NOR 게이트연결 ARM9TDMI는더나은성능을위해 carry arbitration adder를사용하는데매우빠른병렬논리구조를사용하여모든중간 carry값을계산 CLA의 propagate-generate 정보를 u, v의변수로인코딩하고합의모든비트에서 u, v를계산 Carry 입력이 1 이면 u 가 carry 출력이되고 carry 입력이 0 이면 v 가 carry 출력이됨
19 - Barrel Shifter ALU 동작과직렬로자리이동동작을수행하므로 barrel shifter의 shifter 시간은데이터패스사이클시간에직접적인영향을줌 Shifter 지연을최소화하기위해 ARM은 32 32의 cross-bar 스위치행렬을입력에대한출력을조정하기위해사용
20 Left shift와 right shift를위해하나의대각 wire가 On이됨 Rotate right를위해right shift를위한대각wire와complementary left shift를위한대각 wire가 On이됨 (4 4 cross-bar 스위치행렬에서 1 비트right shift는 right 1 과 left 3 (3=4-1) 대각 wire를 On) Arithmetic shift right는부호확장을위한독립적인로직을사용 - 곱셈기설계 정수형곱셈을위해하드웨어를지원 초기 ARM Core들은단지 32 비트결과를저장하는곱셈과곱셈-적재명령어를위한저비용곱셈하드웨어를제공 최근 ARM Core들은 64 비트결과를저장하는높은성능의하드웨어제공 정수형곱셈기는 barrel shifter, ALU, 승수 shifter 레지스터, 곱셈알고리즘제어로직등에의해간단하게구현가능 디지털신호처리를위해곱셈기의성능은매우중요, DSP 코어는특히곱셈기의성능을매우강화하여디지털연산시간을효율적으로줄임
21 - 제어로직구조 PLA 는명령어의 opcode 와상태에따라데이터패스의각제어신호를출력 PLA 는약 14 개입력, 40 개출력을가지고 cycle count 는 finite state 기기 최근 ARM Core 는두개의 PLA 를사용 ( 시간이중요한제어신호는작고 빠른 PLA 를사용하고다른일반제어신호는크고느린 PLA 를사용 )
22 4.5 ARM coprocessor interface - 하드웨어 coprocessor의추가로인한명령어의확장을지원 - Coprocessor 구조 16개까지의 coprocessor를지원하고각 coprocessor는합당한크기의 16 개까지의레지스터를가질수있음 Coprocessor도 load-store 구조를가짐 ( 내부레지스터사이의동작실행, 외부메모리와 load, store 명령, ARM 레지스터와의데이터이동 ) Coprocessor는높은속도실행과높은성능을위해 on-chip으로구현 - ARM7TDMI coprocessor interface ARM7TDMI coprocessor는 ARM과의명령어실행을원활하게하기위해 handshake 신호를사용 /cpi (ARM coprocessor) : ARM이 coprocessor 명령어를확인 cpa (coprocessor ARM) : 명령어를실행할수있는 coprocessor 존재유무를 ARM에알림 (CoProcessor Absent, 없으면 high)
23 cpb (coprocessor ARM) : 명령어를바로실행할수있는지의여부를 ARM에알림 ((CoProcessor Busy, 없으면 high) -Handshake 출력 조건실행 coprocessor 명령어에서조건코드실패로명령어를실행할필요가없는경우 ARM은명령어를실행하지않게되므로 /cpi를생성안함 ARM이명령어실행을결정 (/cpi=low) 했지만 coprocessor 부재인경우 (cpa= high) ARM은 undefined trap을실행하여 trapped 명령 emulation함 ARM이명령어실행을결정하고 coprocessor가명령어를받았지만명령어실행을바로할수없을때 (cpa=low, cpb=high) ARM은cpb이high 일까지기다리고그동안인터럽트가발생하면 coprocessor 명령실행을연기 ARM이명령어실행을결정하고 coprocessor가명령어실행 - 데이터이동 ARM은어드레스를생성하고 coprocessor는데이터길이, 이동종료등을결정, 데이터이동동안인터럽트는허용되지않고최대 16 워드이동가능