앞으로는 Processor 를 구성하는데 사용되는 logic design의 주요 내용을 다시 살펴보고, 이를 기반으로 단일 clock cycle에 단일 instruction을 수행하는 single-cycle processor 를 구현해볼것이다.
순서는 다음과 같다.
1. 설계할 Processor Architecture 선정
2. datapath 설계
3. control 설계
Single cycle processor 에서는 instruction per cycle (CPI) 은 1이며,
Cycle time 은 동작이 가장 긴 instruction에 의해 결정된다. (성능은 낮다)
Logic Element Review
1) Processor의 logic element 들은 크게 2가지로 구분할 수 있다
- Combinational elements
- State elements
Combinational elements 에서는
output은 current inputs 에 의해서만 결정되고, ALU, mux, decoder, encoder 등이 있다.
또한 일반적으로 feedback path가 존재하지 않는다.
State elements 에서는
state를 저장하는데 사용하고, 일반적으로 clock이 input으로써 사용되고, 특정 조건이 만족할 경우에만 state
element로 사용되는 control signal 이 존재한다
이러한 Sequential Circuit 은 state element 와 conbinational element 들로 구성되는데,
일반적으로 combinational logic 의 입력은 state element 로부터 오며, output은 current inputs 와 current state에 의해 결정된다. 또한 Feedback path가 허용된다.
2) Clock
clock 은 state elements 가 언제 update 되는지를 결정한다.
따라서 state elements 가 존재하는 sequential logic circuit에서는 반드시 존재하게 된다.
이러한 clock 과 관련해 state element 가 언제 valid 하고 stable 해야하는지를 결정하는것을 clocking methodology 라 하는데, 이에는 Level-sensitive 와 Edge-triggered 두가지 방법이 존재한다.
- Level-sensitive : state change 가 clock 의 특정 level 에서 이루어지고, Latches 또는 Latch로 이루어진 register들이 state elements 로 사용된다.
- Edge-triggered : state change 가 clock edge 에서 이루어지고 Rising edge 또는 Falling edge 를 사용하게 된다.
Flip-flops 또는 flip-flop 로 이루어진 register들이 state-elements 로 사용된다.
3)
위는 Edge-Trigged Clocking 을 사용한 Sequential Circuit 에서 Setup time 과 Hold time 에 관련된 delay constraints 에 대해 설명한것이다.
먼저 여기나오는 용어에 대해 조금 알아보자면,
Clock-to-Q : 클락의 엣지가 되서 플립플롭 내에서 D값이 Q로 전달되는 delay 이다.
Setup time : state elements 로의 입력은 클락 엣지에서 setup time 전부터는 valid 해야한다는 것을 의미한다.
Hold time : state elements 로의 입력 클락엣지 이후에도 hold time 동안 valid 해야한다.
Longest path delay : state elements 사이의 최대 delay
4)Feedback Path
Sequential circuit 에서는 위와같이 feedback 이 허용된다. 또한 위와 같은 회로에서는 reset 또는 preset logic 이 필요하다. Feedback path 가 있더라도 clock을 사용해 feedback을 일정시간 막아줌으로써, 동일시간의 즉각적인 feedback 이 없으므로 circuit의 안정성이 유지된다.
반대로 combinational circuit에서는 즉각적인 feedback 으로 값이 안정되지 않는다.
5) Signal 관련 용어
- Control signal : Multiplexer 에서 입력을 선택하거나 functional unit 의 동작을 지시하는데 사용되는 signal
- Data signal : Functional unit 에 의해 처리되는 정보를 담고있는 signal
- Bus : 단일 logic signal로 취급되는 signal line 들의 묶음
- Asserted : Signal 이 logically high(active) 인 상태 또는 그 상태로 변하는것
- Deasserted : Signal 이 logically low(inactive) 인 상태 또는 그 상태로 변하는것
6) Mux
여러 input들 중 Control signal 에 따라 1개를 output 으로 내보냄, Selector 라고도 함.
32bit wide multiplexer 는 실제로는 32 개의 1-bit multiplexer 들로 이루어진 array이다.
이와같은 logic element 의 array는 다양한 logic element 들에 적용되 수 있다.
ex) latch 또는 flip flop 등의 array 가 register를 구성한다.
7) Latch
Latch 는 Clock 이 asserted 되어있는 동안 input이 변할때마다 state 가 변경된다. (Level sensitive, Active high 또는 Active low)
D-latch : Clock 이 asserted 되어있는 동안에 input signal의 값을 내부 state 에 저장하는 latch. ( 특정조건이 만족할경우에만 state change 가 일어난다면, write enable 로 사용되는 control signals 가 존재한다.)
8) Flip - Flop
내부 저장된 state 를 output 으로 내보내는 state element
Clock edge 에서만 state change가 이루어진다. (Edge - sensitive)
9) Register
Edge triggered clocking methodology 를 사용하기위해 D flip flop으로 만들어진 register들을 사용한다.
n - bit register란 n bit의 input 과 n bit의 output를 가지게 된다.
clock signal 은 input value 가 register에 언제 write되는지를 결정한다.
여기서 clock 위의 삼각형 표시는 flip flop 의 사용 의미를, 동그라미 표시는 falling edge 사용 표시이다.
10) Register File
Register 가 flip flop들의 array라고 한다면, Register file은 register의 array이다.
MIPS 의 경우 32개의 register 를 가지고있고, register number 를 지정하여 특정 register 값을 read 하거나 write 를 할 수 있다.
여기서 사용할 register file 은 두개의 read port 와 하나의 write port를 사용할 것이다.
가령 R-format instruction 의 경우, 각 instruction 에 대해 2개의 register operand 를 read 하고 1개의 data 를 register file 에 write 해야한다. 따라서 Input 과 Output의 관점에서는, one data input 과 two data ooutput을 갖는다.
이때 write enable 값이 존재하는데, 가령 add 연산의 경우 register write를 하지만, sw 혹은 beq 연산의 경우 write 과정은 따로 필요없기 때문이다.
이 때, Read operation 은 enable 또는 clock signal 과 관련없이 read 되고 Ra Rb 에 의해 지정된 register 값을 BusA 와 BusB 를통해 출력하게 된다. Write operation 은 RegWrite 의 값( 0 or 1) 에 따라 BusW를 통해 write 한다.
11) Memory
위는 단순화를 위해 사용한 ideal 한 memory 의 형태이다.
메모리에서도 마찬가지로 memwrite 와 memread 의 값에따라 read write 를 수행하게 된다.
여기서 read enable 을 굳이해야하는것에 관해선 메모리의 값을 건드리는것 아니기때문에 항상 read 해도 되지만,
Invalid address 의 경우 read 하더라도 문제를 발생하기때문에 필요하다..!
Computer라는 기계는 결과적으로 0 과 1, 즉 트랜지스터를통한 전기신호만을 읽어 들일수 있다.
그렇다면 우리가 작성하는 c언어, python 등과같은 언어도 결국 최하단 low level language인
0 or 1로 번역되어 전기신호로 입력된다는 것인데, 이렇듯 하드웨어가 인식하는 기계어들로 된 명령어들의 집합을 ISA라고 한다. 가장 중요점은 마이크로프로세서, 즉 CPU마다 기계어 코드의 길이와 숫자 코드가 다르다는 것인데,
마치 임베디드단말의 ARM 과 컴퓨터칩의 Intel CPU에 들어가는 Instruction이 다른 것처럼 프로세서마다 명령어 해석구조가 다르다. 하지만 해석에있어서 모든 원리나 디자인이 전혀 다르다고 할수는 없다.
위 그림은 32bit 의 instruction 을 표현하고있다. 당연히 각 비트는 0 or 1로 표현될것이다.
여기서 명령어가 32bit라고 해서 본인 컴퓨터에서 32bit 운영체제, 64bit운영체제가 명령어 비트에 따른것이라고 생각하면 오산이다. 명령어는 그자체로 32bit이고 본인의 컴퓨터에서 몇bit 운영체제를 말하는건 레지스터의 bit수를 의미한다. 뒤에 나올것이다.
2. MIPS and ARM ISA
MIPS ISA는 이번 컴퓨터 구조 포스팅에서 중점적으로 다룰 ISA이다. MIPS Computer System 사에 의해 개발된 ISA
인데, 다른뜻(MIPS = Millions of Instructions Per Second) 도 존재해서 혼동하지 않기 바란다.
본격적으로 들어가기 전에, 마이크로 프로세서에 대해 간략히 개념정리를 해본다.
적어도 마이크로 프로세서를 나누는 기준에는 몇가지가 있을텐데, 메모리 구성에 따른 하버드 vs 폰노이만 구조의 분류, 사용되는 용도와 종류에따른 분류 그리고 명령어 구조에 따른RISC 구조와 CISC 구조의 분류등이있다.
여기서 RISC와 CISC 의 차이는 Complex Instruction Set Computer 와 Reduced Instruction Set Computer
냐의 차이이다.
말그대로 RISC는 CISC에 비해 명령어의 수를 많이 줄였고, 그만큼 단순하다. 플러스해서 명령어 길이가 가변적인 CISC에 비해 RISC는 고정적이며, 적은 주소지정 모드를 가지고있다.
이런 RISC의 대표주자가 ARM, MIPS 가 있고 CISC의 대표주자로는 Intel x86이 있다.
여담으로 CISC의 대표주자인 intel은 8086->80286->...->pentium... 계속해서 아키텍쳐를 업그레이드 시켜왔지만 그 방법이 다분히 명령어를 늘리는 Incremental ISA 형식이기때문에 상당히 입문자가 배우기에도 어렵다고 한다.
이러한 문제점때문에 최근 RISC-V 아키텍쳐등의 모듈형ISA는 상당히 매력적이다.
이러한 마이크로 프로세서들을 컨트롤함에 있어 어셈블리어 구조와 각각의 ISA를 익히는 것은 상당히 중요한 부분일 것이다. 앞으로는 ARM 과 MIPS 아키텍쳐를 중점으로 다룰것이지만 다른포스팅을 통해 RISC-V구조에 대해서도 알아보자.
3.Arithmetic Operations
ARM 과 MIPS 에서는 기본적인 Arithmetic 연산, 즉 산수연산은 3개의 operand로 구성된다.
C code : a = b+c;
MIPS assembly : add a, b, c
가령 c코드로 표현된 산수연산은 어셈블리어로 다음과 같이 표현된다.
일반적으로 addition과 같은 산수연산들은 operand, 즉 피연산자항이 3개로 구성되나 모든 아키텍쳐가 3개는 아니다. 인텔8085 나 x86아키텍쳐의 경우 하나 혹은 두개로 구성되기도 한다.
C code : f = (g + h) - (i + j);
MIPS assembly : add t0, g, h
add t1, i , j
sub f, t0, t1
위와 같은 c코드는 중간 결과 값들을 temporary variables 에 저장함으로써 표현할 수 있다.
여기서 t0가 의미하는것은 레지스터이다.
다시말하자면 논리회로시간쯤 한번은 들어본 CPU안에 존재하는 data access를 빠르게 가능하게하는 저장장소이다.
이렇듯 operand들은 레지스터안에 존재하기도 하며, 메모리안에 존재하기도 한다.
4. Registers
CPU 안에 존재하는 임시저장장소이다.
앞으로는 이러한 Register의 역할에대한 이해가 컴퓨터 아키텍쳐를 이해하는데 핵심이다.
이러한 Register는 컴퓨터내에 몇개 없고, 데이터 접근이 가장빠르지만 레지스터가 많을수록 Read/Write 가 느려져서 clock cycle time이 증가하는 문제가 있기 때문에 수가 제한되어있다.
MIPS 레지스터는 32개의 General purpose register를 가지고 있는데, 내부에는 이들을 하나의 Array로써 저장하고있고 이 register들의 집합을 Register File 이라 부른다.
예를들어 s0~s7번은 highlevel language에서의 변수에 해당, t0 ~ t9는 컴파일 과정의 임시결과 저장을 위한 register이고, 이들은 각기 고유 number를 가지고 있다.
결국 Register 수가 적으면 hardware 입장에서는 빨라지미만, program입장에서는 register의 수가 많은것의 속도가 개선되기에( 예를들면 레지스터가 적으면 arithmetic 계산에서 temp 변수가 많이 필요함 ) 적절한 balance가 필요하다.
MIPS 에서는 이러한 register로 부터의 operand 들만을 사용하고, 2개의 source 레지스터로부터 destination 레지스터에 저장하게 된다. MIPS에서는 각각의 Register들은 32bit로 구성되어있는데 이를 Word라고 하고, 컴퓨터가 한번에 인식하고, 처리할 수 있는 bit의 그룹으로 정의한다.
따라서 32bit레시스터의 경우 하나의 레지스터가 처리할 수 있는 수의 범위가 2³² 까지이기 떄문에, 2³² = 약 4GB의 컴퓨터가 되는 것이다.
Arm의 경우에도 16개의 General purpose register들로 구성되고 각각의 고유의 number를 가지고 사용관례를 가지고 있다.
5. Memory Operand
앞에서 Register의 기본적인 원리와 어셈블리연산의 원리에 대해 알아보았다.
결국 c코드가 연산될때 변수들은 빠른 처리를 위해 메모리가 아닌 레지스터에서 연산을 거친다.
이렇듯 복잡한 data structure들은 제한된 공간내에 담을 수 없으므로 레지스터단위로 연산을 한다하더라도 메모리까지 접근하여 데이터를 가져오는 memory operand 의 필요성을 알 수 있다.
이러한 Architecture 를 LOAD-STORE Architecture 라고 하고, 오직 data transfer instructions (load 및 store instructions) 만이 memory 를 access할 수 있고, 그 외의 instruction들은 registers 또는 immediate data operands 만을 사용하는 것을 load-store architecture 라고 한다.
메모리 접근에서는 각 memory location에 할당된 memory address 를 사용해 memory operand들을 access 할 수 있다.