마이크로 프로세서에 관심 있으신 분을 위한 글.

이 글은 예전에 쓴 “프로세서/비메모리 반도체 설계를 희망하시는 분들께“라는 글과 연관성이 있습니다. 단지 프로세서 설계를 희망하시는 분들께 유용할 수도(?) 있는 내용 위주로 쓰여졌다는 것만 다르겠습니다.

일단 마이크로 프로세서라는 분야에 대해서 설명이 필요할 것으로 봅니다. 학교에서 마이크로 프로세서 구현에 대한 연구는 EE(전자공학)에서 이루어지는 것이 대부분이며, 기업체의 경우 embedded microprocessor는 상당히 많은 업체에서 상용화에 도전하고 있습니다.

하지만, 마이크로 프로세서라는 분야는 그 특성상 몇몇 ISA(명령어 셋 아키텍쳐) 들이 그 점유율을 크게 가져가는 경우가 많기 때문에, 독자적인 ISA를 지닌 마이크로 프로세서를 만들어서 성공한다는 것은 매우 어렵습니다. 이는 사용할 수 있는 프로그램의 수가 많고, 개발자 pool이 튼튼한 프로세서가 계속하여 성장한다는 당연한 이야기(eco-system이라고 보통 표현되는..) 때문입니다.

일례로 PC/서버 계통에서는 x86 ISA가 완전하게 시장을 장악했다고 해도 과언이 아니며, 그 이외의 ISA가 들어오기는 매우 어려울 것으로 봅니다. (그런 측면에서 저는 ARM이 PC 마켓 – netbook이라 불리는 부분에 있어서도..-에서 점유율을 가져 오기는 매우 어려울 것으로 생각하고 있습니다.)

국내에서는 자체 ISA를 가진 프로세서를 설계하는 회사도 거의 없을 뿐 아니라, 이를 지원해 줄 수 있는 컴파일러와 OS를 만드는 회사도 거의 없습니다. 여러가지 여건 상 마이크로 프로세서를 하시는 분들께는 좋지 않은 여건이지요

그럼에도 기업체에서는 학교에서 마이크로 프로세서를 선택하신 분들에 대한 요구가 적지 않은 데요.. 그 이유는 마이크로 프로세서를 만들기 위함이라기보다, 마이크로 프로세서를 이루고 있는 여러 가지 기술을 기반으로 다른 기술에 적응이 빠르다는 장점 때문입니다. 마이크로 프로세서를 만드시는 분들은 소프트웨어와 하드웨어, 모델링 등에 어느 정도 넓은 지식을 갖추어야 하며, 하드웨어에 있어서도 연산기, 제어 유닛, 버스, 캐시 등에도 어느 정도 이상의 지식을 갖추어야 하는데 이런 폭넓은 지식들이 다양한 설계를 하는데 좋은 밑바탕이 되기 때문입니다.

특히 마이크로 프로세서를 공부한다는 건 제어와 연산, 메모리 접근을 최적화 시키는 데 있어서 상당히 깊은 지식을 얻게 되는데, 이러한 지식은 여러 종류의 프로세서 – video, multimedia, audio, network processor등-에 아주 유용하게 사용할 수 있는 기반을 갖추게 된다는 걸 의미합니다.

대충 마이크로 프로세서를 공부한다는 것이 어떤 의미인지는 설명 드렸으니, 그럼 프로세서를 하려면 뭐를 봐야 하느냐 하는 문제에 대해서 설명하겠습니다.

프로세서를 만드는 건 1) 상위 레벨 모델을 기반으로 작업하는 것, 2) RTL 수준까지의 설계, 3) gate 수준에서의 설계 정도로 나누어 생각해 볼 수 있겠습니다. 세 가지 모두 어느 정도 갖추어야 하겠습니다만, 학교에서 논문을 쓰기 위해서는 1)번을 잘해야 하고, 칩을 보고 싶으면 2)번을 잘해야 하고, 우리나라 회사에서 적응하기 쉬우시려면 3)번도 잘해야 합니다.

일단, 프로세서에는 다양한 스펙트럼이 존재합니다. 일례로 프로세서의 구조, 분기 예측, pipeline의 형태, 새로운 연산기나 명령어 적용, 값의 예측 등에 따른 performance변화나 전력 소모의 변화를 연구하게 되는데, 이런 것을 할 때 마다 실제 칩을 설계를 하게 되면 졸업할 수 있는 분이 없으실 테니 일반적으로 C 수준의 simulator를 이용하게 됩니다.

이러한 연구에 들어가기 위해서는 앞에서 이야기 된 S/W가 어떻게 컴파일 되어서 프로세서에게 인식되는지에 대한 이해(ISA)와 더불어 프로세서를 구성하는 여러 가지 요소 – pipeline, cache, virtual memory –에 대한 이해가 있어야지 연구가 진행될 수 있겠습니다. 생각보다 기본적인 데이터 통신이나 데이터 구조에 대한 이해는 아이디어를 얻어내는데 아주 많은 도움을 줍니다. 또한, 많은 경우에 수학적 모델을 세워야 할 필요가 있으므로, 수학적 모델에 대해서도 알아두실 필요가 있습니다.전력 측정 등을 하게 되면 당연히 기본적인 전자회로에 대한 이해는 필수적일테구요

이러한 상위 수준의 모델을 이용한 연구에 가장 널리 사용되는 것은 simplescalar라는 시뮬레이터지요. 이 시뮬레이터는 alpha 아키텍쳐에 기반을 두고 처음에 만들어졌는데 구조가 유연해서 ARM 버전도 있고, (EISC 버전도 있고..) 전력 측정을 위한 simplepower라던지 여러 variation들이 있습니다. 여러분들이 연구를 진행할 때도 마찬가지로 해당 시뮬레이터에 자기의 아이디어를 적용시켜 modify하고 성능을 보는 형태로 연구를 진행하고, 논문을 쓰는 거죠. 이런 일을 위해서는 기본적으로 “C/C++ 와 기본적인 데이터 구조 및 알고리즘에 대해서는 어느 정도 이상 할 줄 알아야 합니다.” 몇 번 말씀 드렸습니다만, 이쪽 분야 엔지니어에게 있어서 C/C++은 그냥 언어나 다름 없습니다.

두 번째로 자신의 idea가 어느 정도 확정되었으면, 이것을 RTL(register transfer level)로 설계(보통 verilogHDL이나 VHDL을 사용합니다.)해서, 논리 합성이라는 과정을 거쳐야 합니다. 이때 아이디어가 좋았고, 아키텍쳐가 좋았어도 논리 회로에 대한 기본적인 이해가 없다면 좋은 회로를 만들어내기 어렵습니다. 따라서, “논리 회로에 대한 이해“와 “RTL 설계를 위한 언어 – verilog든 VHDL이던“는 기본적으로 필요합니다.

세 번째로 gate 수준의 설계는 국내 대기업에서 프로세서 작업을 할 때 많이 사용되는데요..(gate 수준의 최적화를 많이 하시니..) 저는 이 분야에 교양적인 지식 밖에 없어서 조언을 드릴 부분이 매우 작습니다. J

아.. 책 이야기를 빼 놓았군요.

저는 Architecture에 있어서는 처음 시작하신다면 Hennessy & Patterson의 computer organization & design이라는 책이나 M.Mano의 책으로 시작하시는 것이 무난하다고 봅니다. 이후에 Hennessy & Patterson의 책(CAQA라 불리는)과 Flynn의 책을 추천해 드리고 싶습니다. 쉽게 읽힐 분량도 아니고, 쉽게 읽히는 내용도 아닙니다만 꼭 한번은 완독 하시길 바랍니다. 깊이 있게 보다는 넓게 보시고 싶으시다면 Sima의 책(advanced computer architecture)도 추천해 드릴만 합니다.

설계의 교양이라는 점에 있어서는 ASIC이라는 책을 보시고 난 이후에 Chinnery의 Closing the Gap Between ASIC and Custom이라는 책도 괜찮습니다. 상당히 괜찮은 관점을 보여줍니다.

RTL Design에 있어서는 (VerilogHDL이나 VHDL과 같은 HDL을 아신다는 가정하에 – verilog에 관련된 책은 예전에 제가 추천한 적이 있습니다. ) Reuse Methodology Manual을 “반드시” 읽어보시길 권하고 싶습니다. 학교에서 짜여진 코드가 생각보다 구닥다리 코딩 스타일을 가지고 있는 경우가 많습니다. Software engineering과 마찬가지로 하드웨어에서도 요즘 중요한 문제는 HDL코드의 readability와 reusability 입니다. 아주 critical 한 부분이 아니라면 약간 타이밍과 면적에 손해를 보더라도 요즘 코딩 스타일을 따르시는 것이 지속적으로 코드를 갱신 할 수 있습니다.

Verification에 있어서는 Comprehensive functional verification이라는 책을 권해 드리고 싶습니다. SoC 시리즈 입문서이기도 하고 잘 쓰여진 책입니다.

마지막으로 마이크로 프로세서를 만드시려는 분들께 한가지만 더..

마이크로 프로세서를 만들 때 가장 중요한 것이며, 가장 간과하기 쉬운 것이 ISA 입니다. 사실 ISA의 설계가 마이크로 프로세서에 있어서 절반 이상이라고 봅니다. 마이크로 프로세서에 있어서 ISA는 이 프로세서가 지향하고 있는 점(철학이라고 하면 좀 거창하고…)을 가장 잘 표현합니다. 학교에 계신 많은 분들은 “어떻게 하면 쉽게 프로세서가 설계 될 것인가?”라는 관점에서 ISA를 설계하시는 경우도 많지요 ^^; 또한, 어떤 프로세서의 경우는 표면적으로 지향하는 바와 ISA가 전혀 매칭이 안되는 경우도 있구요.

EISC의 경우는 ISA를 설계할 때 다양한 실험을 통해서 “프로그램의 크기와 메모리 접근이 가장 줄어들도록 하려면 어떻게 해야 하는가?” 라는 관점에서 모든 명령어 셋이 설계 되었습니다. 이는 임베디드에서는 프로그램의 크기 = cost라는 공식이 성립하기 때문이기도 하고, processor와 memory간의 속도 차가 점점 벌어질 것이라는 관점, memory접근으로 인하여 발생하는 전력 소모의 문제 등을 고려하여 잡은 목표입니다(EISC의 요즘 마케팅 포인트 중의 하나가 energy efficient microprocessor 이지요). 이를 위하여 다양한 실험이 수행되었고, 이중에 가장 적합하다고 생각하는 명령어 형태가 결정된 것이지요. 한 비트 한 비트 설계가 쉽게 이루어진 것은 아니고, 모두 의미가 있지요. 이후에 추가된 DSP 확장 명령어들도 각기 다양한 DSP 커널을 분석하고 이를 기반으로 ISA가 정해졌고, 구현할 때도 이런 부분이 고려되었습니다. 이런 목표 하에 설계되어 명령어의 형태가 일반적인 compressed code RISC들 보다는 약간 더 복잡하고, 이는 디코더 복잡도를 높이는 단점으로 바뀝니다. 달리 이야기하면, ISA를 설계할 때 어떤 결정은 어떤 면에서는 장점이 되지만, 다른 측면에서는 단점이 되는 부분이 있으니 조심해서 결정해야 할 부분이 많은 거죠.

마이크로 프로세서를 공부하고자 하시는 분들께 마지막으로 말씀 드리자면, 최소한 1년 정도는 넓게 공부하시고, 되도록 책을 많이 읽으시라는 “아주 지극히 일반적인” 말씀만을 드릴 수밖에 없네요. ^^; 또 한가지는 프로세서를 하실 분들은 DSP, 데이터 통신에 대해서는 어느 정도 알고 계신 것이 여러모로 도움이 됩니다.

결론 없는 “공부하세요”라는 글이 되었군요. 아.. 요즘 나 왜 이래.. orz

13 thoughts on “마이크로 프로세서에 관심 있으신 분을 위한 글.

  1. 와.. 정말 커다란 도움이 되었습니다.
    마이크로프로세서 설계에 대한 전체적인 리뷰가 한번에 되네요!!
    항상 블로그에 올려주시는 글들을 감사히 읽고 있습니다.
    앞으로도 쭈~욱 좋은 글들 부탁 드립니다.

  2. 감사합니다 ^^ 이번에 근 1년이라는 시간이 주어졌는데
    위에서 말씀하신데로 열심히 공부해야겠습니다 ^^

    1. 제가 소프트웨어 부분의 서적을 소개하지 못했는데.. 소프트웨어 부분도 많이 보세요. 특히 OS에 대해서는 잘 봐두시는 것이 MMU를 만드실때 필수적입니다. 🙂

  3. 오교수님 수업 받으면서 instruction 7개, 당연히 cache 비슷한 것도 없고, pipeline도 없는 초간단 프로세서를 만들었었습니다. 프로그램 코드를 먼저 만들어 놓고 프로세서를 만들었었는데, 프로세서가 만들어 지는 과정에 따라 프로그램도 같이 변하더군요. 하하하 ^^;

    어쩌다 보니 석사과정 지도교수님도 ARC 프로세서를 디자인하셨던 분이셨는데, 그 때 코드를 보면서 옛날에 열심히 공부했으면 이거 보면서 많은 것을 배울 수 있었을텐데 하고 후회가 되더군요. 아는게 없으니 갖다줘도 도무지 먹을 수가 없어서…^^;

  4. 원래 어디서 글보고 리플을 달아본적이없는데요.
    정말 주옥같은 말씀 감사합니다ㅎ
    최근에 대학원에 진학해서 공부를 하고 있는데요.
    어떤책을 볼까 많이 고민했거든요ㅎ

    1. 네.. 감사합니다. 🙂
      도움이 되셨으면 좋겠네요.
      참고적으로 Compiler관련 책도 생각보다(?) 도움이 많이 될 거에요.

  5. 많은 도움 되었습니다!! 마이크로프로세스를 설계하고 싶어서 VHDL도 배워보고 여러가지 해보고 있는데, 이 글 덕분에 어느정도 순서가 머리에 정리가 되었습니다.

    다음학기부터 시작되는 졸업프로젝트를 systemC를 이용해 설계할까 아님 VHDL[Verilog]를 이용, FPGA를 설계하는걸로 할까 고민입니다. (무엇을 설계해볼까 하는걸 정하지도 않았지만요;;) systemC는 솔직히 처음 보는거 라는 두려움 + 취업을 생각했을 때 상대적으로 요구하는 회사가 많지 않은거 같아서 조금 꺼려지긴 한데.. babyworm님의 생각은 어떤지 궁금하네요.

    1. Processor를 만들어보실 생각이라면, 처음부터 SystemC를 사용하시는 것 보다는 C 언어로 대략의 processor의 동작 모델을 만드셔서 동작(정확히는 각각의 명령어)에 대한 이해도를 높이시는 것이 좋습니다.
      실제적으로 동작 모델은 테스트를 위해서 살짝 시뮬레이터 비슷한 형태를 가지게 되는데, 프로세서와 그 구성요소들을 이해하는데 아주 큰 도움이 됩니다.

      그리고 나서 verilog를 이용해서 간단한 프로세서를 만들어 보시면 되겠죠.
      물론, 구조적인 측면에서는 많은 부분이 달라지지만, 기능 자체에 있어서는 C model을 작성할 때 알았던 부분이 많은 도움을 줄 것입니다.

      SystemC를 안쓰는 회사들도 “많아서” 도움이 될지는 잘 모르겠습니다만.. 할 줄 알시면 대부분 가산점은 받을 수 있을 것이라 생각합니다.

      물론, C와 verilog(혹은 VHDL)을 잘 쓰시는 것이 더 중요하겠죠. 좀 더 범용적으로 많이 사용되니까요.

  6. EISC에 대해서 검색하다 무심코 들어와봤습니다. 아키텍쳐 관련 공부를 하고자 대학원에 진학하기로 결심했는데 이 블로그를 지금 발견한 것이 아쉽네요. 감사합니다.

Leave a Reply