DOI QR코드

DOI QR Code

Design and Simulation for Out-of-Order Execution Processor of a Fully Pipelined Scheme

완전한 파이프라인 방식의 비순차실행 프로세서의 설계 및 모의실행

  • 이종복 (한성대학교 기계전자공학부 교수)
  • Received : 2020.09.01
  • Accepted : 2020.10.09
  • Published : 2020.10.31

Abstract

Currently, a multi-core processor is mainly used as a central processing unit of a computer system, and a high-performance out-of-order processor is adopted as each core to maximize system performance. The early out-of-order execution processor with Tomasulo algorithm aimed at floating-point instructions, and it took several cycles to execute by the use of complex structures such as reorder buffer and reservation station. However, in order for the processor to properly utilize out-of-order execution and increase the throughput of instructions, it must operate in a fully pipelined manner. In this paper, a fully pipelined out-of-order processor with speculative execution is designed with VHDL and verified with GHDL. As a result of the simulation, a program composed of ARM instructions is successfully performed.

현재 컴퓨터 시스템의 중앙처리장치로 멀티코어 프로세서가 주로 이용되고 있으며, 고성능의 비순차실행 프로세서를 각 코어로 채택하여 시스템의 성능을 극대화할 수 있다. 초기의 토마술로 알고리즘을 적용한 비순차실행 프로세서는 부동소수점 명령어를 목표로 하였고, 복잡한 구조를 갖는 재배열버퍼와 예약스테이션의 사용 때문에 그 실행에 여러 싸이클이 소요되었다. 그러나, 프로세서가 비순차실행을 제대로 활용하여 명령어의 처리량을 높이기 위해서는 완전한 파이프라인 방식으로 동작해야한다. 본 논문에서는 예측실행 기능이 있는 완전한 파이프라인 방식의 비순차실행 프로세서를 VHDL로 설계하고, GHDL로 검증하였다. 모의실험 결과, ARM 명령어로 구성된 프로그램에 대한 연산을 성공적으로 수행할 수 있었다.

Keywords

Ⅰ. 서론

파이프라인은 데이터 처리단의 출력이 다음단의 입력으로 이어지는 형태로 여러 단이 연결된 구조이며, 각 단마다 데이터를 저장하기 위해 버퍼가 사용된다. 이렇게 연결된 여러 데이터 처리단은 병렬적으로 동시 수행될 수 있어 처리량을 늘릴 수 있다. 최초의 명령어 파이프라인을 이용한 컴퓨터는 1956년의 IBM Stretch로서 최초로 인출, 해독, 실행에 대한 개념을 도입하였으며, 1962년에 ILLIAC II에서도 이용되었다. 1970년도에 개발된 수퍼컴퓨터들은 대부분 파이프라인 방식을 채택하였고, 1980년도의 MIPS, SPARC, Motorolla 88000 등의 RISC 프로세서에서 그 뒤를 이어서 핵심기술로 자리를 잡아 최근까지 이어지고 있다.

1970년대와 1980년대 초에 비순차실행 (Out-of-Order Execution)은 자료흐름(Data Flow) 방식을 이용하는 컴퓨터구조의 주요 연구 분야로 출발하였다. 1964년에 스코어보드(scoreboard)를 사용한 CDC 6600가 비순차실행을 사용한 최초의 컴퓨터이다. 스코어보드는 명령어 간에 데이터 종속이 없고 연산유닛이 이용 가능할 때, 비순차실행을 가능하게 하는 것이다. 그러나, 이 방식은 명령어 간의 반종속(anti dependency)과 출력종속(output dependency) 문제를 해결하지 못하였고, 중앙 집중적 제어로 인하여 성능에 한계가 있었다. 1966년에 IBM 360/91의 설계에 토마술로 알고리즘을 도입하여 완전한 비순차실행을 구현하였다[1]. 토마술로 알고리즘은 레지스터 재명명(register renaming) 기술을 도입하여 스코어보드에서 해결하지 못했던 반종속과 출력종속까지 해결하였다. 또한, 분기의 방향을 미리 예측하고 실행함으로써 제어종속으로 인한 성능의 저하를 막을 수 있는 예측실행(speculation)으로까지 확장이 가능하다는 장점이 있다.

그러나, 비순차실행은 그로부터 30년 후인 1990년대에 이르러서야 비로소 일반화되었는데, 그 이유는 하드웨어의 높은 복잡성에 때문이다. 1990년에 IBM은 부동 소수점 명령으로 제한된 최초의 비순차 마이크로 프로세서인 POWER1을 도입하였다. 이후의 대표적 비순차실행 프로세서들은 1993년도의 IBM/Motorola PowerPC601, 1995년도의 SPARC64, Intel Pentium Pro, 1996년도의 MIPS R10000, HP PA-8000, AMD K5, DEC Alpha 21264이다[2]. 지금까지 살펴본 비순차실행 프로세서는 완전한 파이프라인 방식으로 동작을 해야 그 성능을 극대화시킬 수가 있다.

세계 최고 수준인 국내의 메모리 반도체 설계 및 공정 기술에 비하여 프로세서 설계 분야는, 매우 미흡한 형편이다. 지금까지 국내 대학, 연구소 및 기업체에서 단순한 RISC 프로세서를 설계하고 반도체칩으로 구현한 경우는 극히 일부 발견된다. KIST는 208년부터 Core-A 프로세서를 야심차게 개발했으나, 비순차실행방식이 아닌 순차실행방식에 그쳤고, 현재로서는 명맥을 잇지 못하고 있다. 삼성전자는 프로세서를 자체 개발하지 않고, 2010년부터 ARM Cortex-A8을 라이센싱하여 Exynos 칩을 직접 생산하였다. 그러나, 이 칩은 비순차실행 프로세서가 아니었고 경쟁력이 타사에 미치지 못하여, 2019년에 결국 자체 CPU 코어개발을 중단하였다.

위에서 살펴본 바와 같이, 국내에서 완전한 파이프라인 방식의 비순차실행 프로세서를 설계 및 구현한 예는 거의 찾아볼 수가 없으므로, 다소 늦었더라도 이에 대한 연구를 활발히 하고 박차를 가하여 메모리 반도체의 설계기술과 균형을 이룰 필요가 있다. 본 논문에서는 VHDL을 이용하여 파이프라인 방식을 지원하는 비순차 실행 프로세서를 설계했으며, 명령어세트로 임베디드 마이크로 프로세서로 가장 널리 쓰이는 ARM을 이용하였다[3]. 본 설계의 코딩 및 검증을 위하여 리눅스에서 실행되는 GHDL과 GTKWave를 활용하였다.

본 논문의 구성은 다음과 같다. 2 장에서 파이프라인 방식의를 이용한 비순차실행 마이크로 프로세서의 원리에 대하여 살펴보고, 3 장은 본 논문에서 설계한 비순차실행 프로세서의 구조를 VHDL의 관점에서 기술한다. 4 장에서 모의실험 환경과 모의실험 결과를 보이고, 5 장에서 결론을 맺는다.

Ⅱ. 파이프라인 방식을 이용하는 비순차실행 마이크로 프로세서의 원리

본 논문에서는 빈번한 분기어에 의한 제어종속이 성능에 큰 영향을 끼치므로, 파이프라인 방식의 비순차실행에 하드웨어 기반의 예측실행 기능을 추가하였다. 하드웨어 기반의 예측실행은 동적 분기 예측, 예측실행, 및 동적 스케줄링으로 구성된다. 비순차실행 프로세서에서 이러한 기능을 지원하기 위하여 예약스테이션 (Reservation Station)과 재정렬버퍼(Reorder Buffer) 및 레지스터상태 (Register Status) 하드웨어가 필요하다. 그림 1은 예약스테이션과 재정렬버퍼를 포함하는 비순차실행 프로세서의 블럭도이다.

OTNBBE_2020_v20n5_143_f0001.png 이미지

그림 1. 완전한 파이프라인 방식의 비순차실행 프로세서의 블럭도

Fig. 1. The fully pipelined out-of-order execution processor

예약스테이션의 기능은 피연산자가 준비된 즉시 예약 스테이션에 등록함으로써 프로세서가 레지스터로부터 피연산자를 가져오지 않고도 예약스테이션에서 공급받고, 피연산자가 아직 준비되지 않은 명령어는 그것을 공급할 예약스테이션을 가리키도록 함으로써 레지스터 재명명 기능을 간접적으로 수행하는 것이다. 예약스테이션을 이용함으로써 해저드(hazard) 감지와 실행제어가 분산되며, 연산 결과들이 레지스터를 통하지 않고 예약스테이션으로부터 연산유닛으로 직접 공급된다.

재정렬버퍼는 인출되는 모 명령어를 등록하며, 실행이 종료했으나 직 완료하지 않은 명령어들을 유지하는 하드웨어 버퍼의 기능을 수행한다. 이렇게 함으로써, 명령어들의 비순차실행을 허용하면서도 순차완료 되도록하여 정확한 예외처리 (precise interrupt)를 가능하게 한다.

레지스터상태는 레지스터화일 값의 유효 여부를 나타내고 유효하지 않은 경우, 그 값을 생산해내는 재배열버퍼의 항목을 가리키는 정보를 저장하기 위하여 필요하다.

본 연구에서 설계한 비순차실행 프로세서는 완전한 파이프라인 방식으로 동작하며, 총 6 단계로 설정하였다. 이것은 인출(fetch), 발행(issue), 실행(execute), 메모리 접근(memory), 쓰기(write Back), 완료(commit)로 구성된다. 비순차실행을 처리하기 위한 핵심 장치인 재배열 버퍼와 예약스테이션은 각 단계에서 데이터를 저장했다가, 다음 단계로 데이터를 전달하여 완전한 파이프라인 동작을 할 수 있도록 설계되었다.

1. 인출 (fetch)

프로세서는 FIFO 구조로 구성된 명령어큐의 첫 번째 항목에서 다음 명령어를 인출 받는다. 만일에 예약스테이션과 재정렬버퍼가 모두 비어있으면, 이 명령어를 예약스테이션과 재정렬버퍼에 동시에 삽입한다. 그러나 예약스테이션 또는 재정렬버퍼가 비어있지 않으면 구조적 해저드가 발생한 것으로서, 재정렬버퍼와 예약스테이션이 모두 준비될 때까지 발행 단계로의 진행을 멈춘다 (stall).

2. 발행 (issue)

예약스테이션과 연결된 연산유닛에서 명령어에 대한 연산을 실행하기 위하여 피연산자가 필요하다. 명령어의 유형에 따라 제 1 피연산자만을 이용하는 경우와, 제 1 피연산자와 제 2 피연산자를 모두 필요로 하는 경우로 나뉜다. 피연산자를 확보하는 것은 비순차실행의 핵심으로서, 명령어의 피연산자를 읽기 위하여 다음 3 가지의 경우로 구분할 수 있다.

첫 번째는 피연산자에 대한 연산이 완료되어 그 값이 레지스터에 등록된 경우이다. 이때, 예약스테이션은 그 값을 레지스터로부터 정상적으로 읽어서 연결된 연산유닛에서 연산을 수행한다. 두 번째, 피연산자를 계산하는 명령어가 실행이 되어 재정렬버퍼에는 등록이 되었으나, 아직 완료되지 않아서 레지스터에는 기록되어있지 않은 경우이다. 이때는 재정렬버퍼에 있는 피연산자를 예약스테이션으로 전송하고 해당 연산유닛에서 연산이 가능하다. 세 번째, 필요한 피연산자를 생산하는 명령어에 대한 연산이 아직 실행이 끝나지 않아서, 레지스터는 물론 재정렬버퍼에도 그 값이 존재하지 않는 경우이다. 이때는 피연산자를 생산할 명령어의 재정렬버퍼 상의 항목번호인 태그를 예약스테이션에 보낸다. 예약스테이션은 추후에 해당 피연산자가 연산이 실행되고 재정렬버퍼에 등록되면, 태그를 이용하여 그 값을 공통데이터버스를 통하여 가져올 수 있다. 위에서 살펴본 바와 같이, 예약스테이션을 이용하는 발행과정에서 재명명으로 인하여 명령어 간의 반종속과 출력종속이 해결된다.

3. 실행 (execute)

만일 발행단계에 피연산자가 준비되었으면, 그 값을 기다리는 모든 예약스테이션에 공급된다. 이와 같이 피연산자가 준비될 때까지 명령어의 연산을 유예시킴으로 인해서, 실제종속 (true dependency)을 해결할 수 있다. 모든 피연산자가 준비된 명령어는 프로그램의 순서와 상관없이 각 연산유닛에서 연산을 실행할 수 있으므로 비순차실행이 가능하다. 이 단계에서 대부분의 명령어는 한 싸이클에 실행을 마칠 수가 있으나, 여러 싸이클이 소요되는 명령어도 있다. 로드와 스토어 명령어는 실행 단계에서 유효주소를 계산한다.

4. 메모리 접근 (memory access)

메모리 접근 단계에서 로드명령어의 경우, 데이터 메모리를 접근하여 데이터를 읽어온다. 스토어 명령어인 경우에는 정밀한 인터럽트에 대비하기 위하여 메모리 접근 단계에서 데이터를 쓰는 것이 아니라, 완료 단계까지 진행을 하고 나서야 데이터를 메모리에 쓸 수가 있다.

5. 쓰기 (write)

명령어가 실행되어 연산결과가 준비되었을 때, 공통데이터버스를 통하여 레지스터에 쓰고, 그 결과를 기다리는 재정렬버퍼와 예약스테이션에 각각 기록한다. 스토어의 경우 메모리에 저장해야하는 값을 재정렬버퍼의 값 영역에 기록한다. 만일에 저장해야할 값이 아직 준비가 되지 않았다면, 공통데이터버스가 그 값이 준비가 될 때까지 모니터링을 해야 한다.

6. 완료 (commit)

이 단계는 명령어를 마무리하는 파이프라인의 마지막 단계로서, 완료하는 명령어가 일반 명령어, 스토어, 분기어 중에 어느 것인가에 따라서 처리가 각각 다르다.

일반 명령어가 재정렬버퍼의 헤드에 도달하고 그 결과가 준비되었을 때, 그 결과는 최종적으로 레지스터에 기록되며 명령어를 재정렬버퍼에서 삭제함으로써 정상적으로 완료된다. 스토어 명령어를 완료하는 것은 이것과 유사하지만, 단지 데이터가 레지스터가 아닌 메모리에 기록된다는 점이 다르다. 위에서 살펴본 바와 같이, 로드 명령어는 메모리접근 단계에서 값을 읽지만, 스토어 명령어는 완료단계에서야 값을 쓸 수 있다.

마지막으로 분기어의 경우에는 예측의 옳고 그름에 따라서 처리가 달라진다. 예측오류가 난 분기어가 재정렬버퍼의 헤드에 도달하는 경우, 분기어의 뒤를 따르는 명령어들은 잘못된 타겟에서 인출한 것이므로, 재정렬버퍼를 일소 (squash) 하고 분기를 하지 않았을 때의 후속 순차 명령어부터 올바른 인출 및 실행을 재개해야한다. 반면에, 만일 분기어가 올바르게 예측되었다면 일반 명령어와 마찬가지로 정상적으로 완료하면 된다.

Ⅲ. 파이프라인 방식의 비순차실행 프로세서의 VHDL 설계

본 연구에서 VHDL을 이용하여 파이프라인 방식을 이용하는 비순차실행 프로세서를 설계하였다. 그 이유는 VHDL이 Verilog보다 높은 수준의 추상화가 가능한 고급 프로그래밍 언어로서, 다양한 데이터 형식을표현할 수가 있기 때문이다. 특히, VHDL은 Verilog에서 포함되지 않는 레코드 자료구조 지원하고 있어서 하드웨어를 설계할 때 복잡도를 줄이고 효율성을 높일 수 있다.

다양한 데이터형을 갖는 원소들을 묶어서 하나의 단위로 표현할 수 있는 VHDL의 레코드형 배열의 자료구조가 단순배열보다 높은 추상도를 가짐과 동시에 합성이 가능하기 때문에, 재정렬버퍼나 예약스테이션을 갖는 완전한 파이프라인의 비순차실행 프로세서의 설계에 적합하다. 레코드 자료구조를 이용할 수 없는 Verilog의 경우 재정렬버퍼나 예약스테이션을 표현하기 위하여 레코드의 각 필드 대신에 1 차원 배열을 잘라서 구분을 하고, 또한 이것에 대한 2 차원 배열로 만들어야 하므로 복잡하고 불편하다.

VHDL에서 레코드를 자료구조로 갖는 신호를 모든 모듈에서 이용하기 위하여, 레코드 자료구조를 패키지문에 선언하고, 모든 VHDL 모듈에서 use문을 이용하여 참조가 가능하게 할 수 있다. 이것 또한 Verilog에서는 찾아 볼 수 없는, VHDL에서 자료구조를 선언하고 활용할 수 있는 방법이다.

재정렬버퍼 레코드형은 Busy, Opcode, Ready, Dest, Values, Addrs 등으로 구성된다. Busy는 재정렬 버퍼의 항목이 현재 비어있는지의 여부를 나타내는데 쓰이고, Opcode는 해당 명령어의 유형을 기록한다. Ready는 명령어가 완료되었는지의 여부를 나타내며, Dest는 목적 레지스터의 번호를 기록한다. Values는 명령어의 연산결과를 수록하며, Addrs는 로드와 스토어의 데이터메모리 유효주소 계산 결과를 저장하는데 쓰인다. 재정렬버퍼는 이러한 레코드형 배열 16개로 설계하였다.

예약스테이션 레코드형의 주요 구성은 Busy, Opcode, V1, V2, Q1, Q2, Tag, Addrs, Value 등으로 구성된다. V1, V2는 명령어의 준비된 제 1 피연산자와 제 2 피연산자를 각각 나타내며, 이때 Q1, Q2의 값은 모두 0이다. 만일 피연산자들이 아직 준비되지 않았을 경우에는, Q1과 Q2는 각각 첫 번째와 두 번째 피연산자를 공급 해줄 명령어의 재정렬버퍼 항목번호를 나타낸다. Tag는 현 명령어의 목적 레지스터 값을 계산하여 공급하는 명령어의 재정렬버퍼 상의 항목번호이고, 그 외에는 재정렬 버퍼와 같다. 예약스테이션은 이러한 레코드형 배열 10개의 크기를 갖는다.

레지스터상태 레코드형은 Busy와 Tag로 구성된다. 레지스터화일의 대응하는 레지스터 값이 유효한 경우 Busy가 0이지만, 그렇지 않은 경우에 Busy가 1로 설정되며, 그 값을 생산해내는 재배열버퍼의 번호를 Tag에 저장한다. 레지스터상태 하드웨어의 크기는 레지스터화일의 크기와 같게 32로 설계하였다.

각VHDL 모듈에서 엔티티문의 포트로 레코드형 배열을 입력 또는 출력으로 선언하여, 레코드형 배열 단위로 서로 다 모듈 간에 효율적으로 정보를 주고받을 수 있다. 이때, 서로 다른 VHDL 모듈에서 재정렬버퍼나 예약 스테이션에 쓰기작업을 수행하는 것은 다중 원천 신호의 구동에 해당 되므로, 하드웨어 기술언어에서 금지된다. 따라서, 다중 원천 신호 구동을 해결하기 위한 적절한 방안의 모색이 필요하다[4-6].

재정렬버퍼와 예약스테이션을 레코드형 배열로 선언한 후에, 조건과 부합하는 레코드형을 찾을 때는 VHDL 에서 지원하는 순환 반복문인 For 또는 While 문을 이용함으로써 비순차실행 프로세서를 간편하고 효율적으로 설계할 수 있다.

그림 2는 본 연구에서 VHDL로 설계한 파이프라인의 컴포넌트 사례문을 나타낸 것이다. 인출단계의 재정렬버퍼, 예약스테이션 및 레지스터 상태 하드웨어는 각 ROB_f, RS_f, RegStat_f로, 발행단계의 각 하드웨어는 각 ROB_i, RS_i, RegStat_i로, ....완료단계의 각 하드웨어는 각 ROB_c, RS_c, RegStat_c로 표시되었다. 완전한 파이프라인 동작을 위하여 매 싸이클 마다 선행 단계의 하드웨어의 유효한 정보를 인접한 다음 단계의 하드웨어로 넘겨주고 있으며, 최종단계인 완료단계의 하드웨어 정보는 그 출력을 다시 처음단계인 인출단계의 하드웨어로 공급한다.

OTNBBE_2020_v20n5_143_f0002.png 이미지

그림 2. 파이프라인의 VHDL 컴포넌트 사례문 코드

Fig. 2. The VHDL component instantiation code of pipeline

Ⅳ. 모의실험

완전한 파이프라인으로 동작하는 비순차실행 프로세서에 대한 모의실험은 3.1 GHz로 동작하는 Intel Core i5-2400 데스크탑 컴퓨터의 운영체제 Fedora 30에서 시행하였다. VHDL 2008 버전을 컴파일하기 위한 도구로 GHDL 0.37 버전을, 모의실험 파형을 관찰하는 도구로 GTKWave 3.3.101 버전을 이용하였다. 총 25개의 독립적인 VHDL 프로그램 모듈이 완전한 파이프라인의 비순차실행 ARM 프로세서를 설계하는데 이용되었다.

모의실행에서 비순차실행 프로세서의 입력으로 이용한 ARM 어셈블리 프로그램과 기계어를 그림 3에 나란히 표현하였다. 이 프로그램은 로드, 스토어, 덧셈, 뺄셈, 곱셈, 조건분기 등으로 구성된다. 이때, 로드와 스토어는 1 싸이클, 정수형 명령어는 1 싸이클, 곱셈을 실행하는 MUL 명령어는 3 싸이클이 소요된다.

OTNBBE_2020_v20n5_143_f0004.png 이미지

그림 3. 모의실행의 입력에 이용된 ARM 프로그램과 기계어

Fig. 3. The input ARM program and machine code used for simulation

그림 4에 완전한 파이프라인방식의 비순차실행 프로세서를 GHDL로 컴파일 후에 모의실행되는 것을 GTKWave의 결과 파형으로 나타냈다. 매 싸이클마다 명령어 한 개를인출하여 재정렬버퍼와 예약스테이션에 삽입되는 것을 확인할 수 있다. 첫 번째 LDR 명령어에 의하여 계산된 주소의 데이터메모리로부터 읽은 값이 재 배열버퍼에 등록되었으나 아직 완료단계에 이르지 않아서 레지스터 R2에 저장되지 않았을 때, 두 번째 명령어 MUL의 첫 번째 피연산자인 R2가 재배열버퍼로 부터 예약스테이션에 전달되어 성공적으로 곱셈을 수행하는 것을 확인했다. 또한 순차실행 프로세서인 경우에는, 입력 프로그램의 두 번째 명령어인 MUL 연산이 완료되지 않았을 때, 그 이하의 명령어들은 발행 및 실행을 할 수가 없다. 그러나, 완전한 파이프라인 방식을 이용하는 비순차실행 프로세서에서는 두 번째와 세 번째인 MUL 명령어와 STR 명령어의 실행이 끝나지 않았더라도, 네 번째 명령어인 SUB가 발행 및 실행이 되었다. 그리고 분기여부가 결정되기 전에 BNEQ 분기어를 예측실행 하였다. 따라서, 완전한 파이프라인 방식의 비순차실행 프로세서가 예측실행을 기반으로 올바르게 실행하는 것을 확인할 수 있었다.

OTNBBE_2020_v20n5_143_f0003.png 이미지

그림 4. 완전한 파이프라인 방식의 비순차실행 프로서세서의 모의실행 결과

Fig. 4. The simulation results of the fully pipelined out-of-order execution processor

Ⅴ. 결론

본 논문에서는 ARM 명령어를 기반으로 하는 완전한 파이프라인 방식의 비순차실행 프로세서를 Fedora 운영 체제에서 VHDL을 이용하여 설계하였다. 특히, 주요 자료구조인 재정렬버퍼와 예약스테이션을 레코드형 배열을 이용하여 설계함으로써, 기존의 대다수 연구가 2차원 배열을 이용하여 비순차실행 프로세서를 설계한 것보다 프로그램 언어상으로 높은 수준의 추상도와 간결성을 확보하였다. 주어진 ARM 어셈블리 프로그램을 모의실행 시킨 결과, 완전한 파이프라인 방식에 따라 비순차실행 프로세서가 올바르게 처리되는 것을 확인할 수 있었다.

추후의 연구로, 파이프라인 방식의 비순차실행 프로세서를 한 싸이클에 2 개 이상의 명령어를 인출하여 실행하는 파이프라인 방식의 비순차실행 수퍼스칼라 프로세서로 개선시키는 것이다. 나아가 설계된 ARM 프로세서를 Xilinx사의 Vivado 또는 Altera사의 Quartus II를 이용하여 합성한 후에, 정적 시간 분석(STA)과 합성 후 모의실험 (Post synthesis simulation)을 거쳐 최종적인 동작을 검증하고 FPGA로 프로그래밍하여 동작을 검증할 예정이다.

References

  1. R. M. Tomasulo, "An Efficient Algorithm for Exploiting Multiple Arithmetic Units," IBM Journal of Research and Development, Vol. 11, Issue. 1, pp. 25-33, Jan 1967. DOI:https://doi.org/10.1147/rd.111.0025
  2. K. C. Yeager, "The Mips R10000 superscalar microprocessor," IEEE Micro, Vol. 16, No. 2, pp. 28-41, April 1996. DOI:https://doi.org/ 10.1109/40.491460.
  3. ARM Architecure Reference Manual. DOI:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.architecture.reference/index.html
  4. J. L. Hennessy, and D. A. Patterson, "Computer Architecture A Quantitative Approach", 6th Edition, 2018. DOI:https://dl.acm.org/doi/book/10.5555/3207796
  5. S. L. Harris, and D. M. Harris, "Digital Design and Computer Architecture ARM Edition", Elsevier Korea LLC, 2016. DOI:https://doi.org/10.1016/C2018-O-14352-8.
  6. J. Lee, "Design and Simulation of ARM Processor using VHDL," Journal of The Institute of Internet, Broadcasting and Communication, vol. 18, no. 5, pp. 229-235, Oct. 2018. DOI:https://doi.org/10.7236/JIIBC.2018.18.5.229.