ARM이 Bekeley대학의 Bekeley RISC를 기반으로 만들었다고는 했지만 Bekeley RISC를 그대로 복사해서 놓은 것은 아닙니다. 물론 Bekeley RISC에서 많은 개념들을 빌려왔지요. ARM 프로세서가 Bekeley에서 빌려온 중요한 개념들을 보자면


  • Load-Store 구조
  • Fixed-length 32bit instruction
  • 3-address instruction 형식

 

 정도 입니다. 가만히 보자 하면 이 세가지는 ARM과 Bekeley RISC뿐만 아니라 다른 RISC구조에서도 찾아볼 수 있는 일반적인 RISC 구조라고 할 수 있습니다. 중요한 것은 채택하지 않은 기능들인데 ARM이 아래 기술할 것들을 채택하지 않은 가장 큰 이유는 사실 Bekeley RISC라는 프로세서는 Computer의 CPU를 고려해서 설계한 Chip입니다. 따라서 '비용'의 문제점이 나타나게 되고 비용을 줄이자면 또한 '속도'의 문제점이 나타나게 됩니다.
 ARM은 Embedded에 적용하기 위한 CPU입니다. 따라서 첫번째로 비용이 크게 들면 안됩니다. 두번째로는 현대의 컴퓨터처럼 그렇게 많이 빠를 필요는 없습니다. 적당한 속도만 내주어도 괜찮다는 이야기 입니다. 세번째로는 적은 비용을 위해 구조가 간단해야 합니다.

 이런 이유로 ARM이 Bekeley에서 적용하지 않은 개념들을 보자면

 

  • Register Windows(레지스터 윈도우)
  • Delayed Branch(지연 분기)
  • Single-cycle Execution(싱글사이클 실행)

 

이 있습니다.

 우선 Register Windows란 일반적인 컴퓨터는 복잡한 멀티미디어와 프로그램들을 실행하기 위해 중첩 프로시져(Procedure : ①특정 작업을 수행하도록 이름 붙여진 컴퓨터 프로그램의 일부, 정보통신용어사전제6판,한국정보통신기술협회)(역저 : 하나의 함수라고 생각하면 편함)를 사용하게 되는데 이때 바람직하지 않은 데이터 트래픽이 발생하게 됩니다.
 그래서 Register Windows에서는 이 트래픽을 감소하기 위해 CPU에 많은 수의 레지스터를 확보한 후에 레지스터를 한번에 이동시키면 더 빠르게 처리 할 수 있습니다. 하지만 이럴 경우 설계시 레지스터를 많이 사용하게 되고 그러면 비용이 많이들어가 임베디드의 지향점인 '저렴한 비용'에서 멀어지게 됩니다. 따라서 ARM에서는 Register Windows가 아닌 Shadow Register라는 것을 사용하여 예외상황(Exception)이 발생시 한 Register에 이 전의 상태값을 저장하여 Procedure가 아닌 Exception 처리에 비중을 두게 됩니다.

 두번째로 Delayed Branch(지연분기)는 말 그대로 Branch, 분기 명령어에 대한 처리 방법입니다. CPU의 설계 기술중 Pipe LIne 이라는 기술이 도입되면서부터 CPU의 처리 속도가 비약적으로 높아 졌습니다. 따라서 ARM도 Pipeline을 도입하였습니다. 하지만 이 Pipeline에는 고질적인 문제점이 있는데 그것을 Hazard라고 합니다. 그중 이 Branch Hazard는 이 Pipeline 구조에서 해결 할 수 없는 문제점중 하나입니다.
 예를 들어 Pipeline이 돌아가고 있는 중에 분기문이 발생했습니다. Pipeline의 첫번재인 IF(instruction fetch, 명령를 읽는것)를 수행하고 ID(instruction decode)를 하게되면 다음 명령어가 들어와야 되는데 다음 명령어가 분기 명령어에 영향을 받을 경우 cpu는 처리하지 못하게 되는 현상이 발생합니다. 이것이 Branch hazard입니다. 
 Bekeley RISC에서는 이를 해결하기 위해 지연분기를 사용하였는데 이 지연분기란 분기 명령어와 이 분기명령어가 사용될 혹은 사용이 취소될 명령어 사이에 지금 실행되고 있는 분기명령어의 영향을 받지 않은 다른 명령어를 집어넣어 실행하게 됩니다. 그리고 나서 분기의 영향을 받은 명령어가 실행이 되도록 하였습니다.
 하지만 이 방법은 파이프 라인이 하나일때는 문제가 없지만 슈퍼스칼라(super-scalar)구조 에서는 분기 예측회로를 복잡하게 만드는 단점이 있고 또한 HardWare적으로 부담이 되기도 했습니다. 그리고 Embedded에서 필요로 했던 Exception처리를 복잡하게 만들기 때문에 지연분기를 사용하지 않았습니다.
 따라서 ARM에서는 BTB(Branch Target Buffer:분기예측)란 방법을 사용하는데 분기 명령어 발생시 BTB에서 True와 False를 예측하여 True로 예측되었으면 True를 Pipeline에서 실행 한 후 분기 명령어 다음 명령을 실행을 하고 만약 틀리면 True명령어를 취소하고 바로 False명령어를 실행하게 됩니다.

 마지막으로 Single-cycle execution 입니다. 이 Single-cycle execution은 말그대로 모든 명령어를 한 clock cycle동안에 수행하는 구조입니다. 이것이 가능한 이유는 pipeline을 적용하기 때문이겠지요. 따라서 첫번재부터 총 stage-1만큼의 명령어는 제외입니다.
 거의 대부분의 ARM 명령어는 한 cycle에서 처리가 가능하지만 load나 store같은 명령어는 데이터를 갖고 올때와 데이터를 읽고 쓸때 이렇게 두번의 Cycle이 필요로 하게 됩니다. 따라서 이 Single-cycle execution을 구현하려면 명령어 메모리와 데이터 메모리가 따로 있어야 하는데 이것또한 ARM 프로세서의 초반에서는 가격의 문제로 이것을 사용하지 않았습니다. 그래서 이 Single-cycle execution대신 메모리 access를 최소화하도록 auto-indexing addressing mode에서처럼 cpu내부의 유휴 자원들을 활용함으로써 전체 프로그램의 처리 시간을 줄여보려고 최선을 다했습니다.


 위에서의 세가지 적용하지 않은 구조들을 보면 대충 ARM에서 지향하는 바를 알수 있습니다. 그것은 바로 Simple입니다. ARM에서도 역시 가장 중요하게 생각했던 것은 Simple design이였습니다. 이렇게 설계해 놓음으로 인해서 ARM은 싸고 가볍고 저전력의 Chip을 개발할 수 있었습니다.

요약

 Bekeley에서 적용한 것 적용하지 않은 것  대체 수단 
Load-Store 구조  Register Windows  Shadow register 
 Fixed-length 32bit instruction Delayed Branch   Branch Target Buffer
 3-address instruction 형식  Single-cycle Execution  Multi-Cycle Execution

 Bekeley RISC에서 ARM 프로세서에 적용하지 않은 공통적인 이유.
   비싼가격. Exception처리에 중점을 두기 위해.

'ARM(Advanced RISC Machine)' 카테고리의 다른 글

1.4 - ARM의 Instructions  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.1 ARM과 RISC (RISC란 무엇인가?)  (0) 2009.10.23
1 - ARM 이란 무엇인가?  (0) 2009.10.23
0 - 들어가는 말.  (0) 2009.10.23

+ Recent posts