Microarchitecture
컴퓨터 시스템은 위와 같은 계층으로 구성된다.
지금까지는 MIPS 명령어 체계를 정리하면서 3번째에 있는 Architecture 계층에 대해 고민했었다.
이제는 그보다 한단계 아래로 내려가서 마이크로 아키텍쳐를 보려고한다.
마이크로 아키텍쳐라는 말은 기계어로 된 명령어를 이해하고, 실행할 수 있는 CPU의 내부 하드웨어 구조를 의미한다.
MIPS의 ISA를 구현하는 마이크로아키텍쳐는 다양하게 있다.
같은 ISA여도 구현은 얼마든지 바뀔 수 있다. (마치 x86을 구현한 AMD 와 Intel 의 CPU가 다른 것처럼)
대표적인 구현 방법으로 한 사이클에 하나의 명령어를 처리하는 Single Cycle 방식이 있다.
하나의 명령어를 실행하고, 그 명령어의 실행이 끝나면 그 다음 명령어를 실행하는 방식이다.
이 방식의 단점은 전체 프로그램의 실행시간이 가장 실행시간이 긴 명령어 하나에 지배되는 것이다.
가장 실행시간이 긴 명령어의 실행시간에 맞춰서 모든 사이클의 주파수를 맞춰야 한다.
그래서 실제로는 두번째 방법인 Pipeline 기법을 사용하여 구현한다.
하지만 싱글사이클이 구현하기 간단하기 때문에 먼저 싱글 사이클로 마이크로아키텍쳐를 설계해보려고 한다.
컴퓨터의 성능 측정에 대해 정리할 때 CPU Time 이라는 개념을 사용했었다.
이때 CPU Time 에 영향을 미칠 수 있는 요소로 Microarchitecture가 있다.
마이크로 아키텍처는 CPI 와 T 에 영향을 미친다.
마이크로 아키텍처를 잘 설계하면 명령어당 필요한 사이클의 수를 줄이거나, 사이클 하나의 주기를 줄일 수 있다.
하지만 완벽한 마이크로아키텍쳐 (저전력, 저비용, 고성능) 를 만드는 것은 어렵다.
각각의 요소간 서로 트레이드오프가 있기 때문.
조합 회로와 순차 회로
논리회로에서 조합회로와 순차 회로의 개념을 배웠었다.
조합회로는 출력이 현재의 인풋에 의해 그 즉시 바로 결정되는 회로이다.
AND gate, Adder, Mux, ALU 와 같은 회로가 모두 조합회로이다.
순차회로는 출력이 현재의 인풋과 과거의 인풋 (상태) 에 의해 결정되는 회로이다.
따라서 순차회로는 과거의 상태를 저장할 별도의 저장공간을 필요로한다.
이를 state elements (기억 소자) 라고 하며, flip-flop 또는 latch 를 사용한다.
Flip - Flop vs Latch
latch는 level sensitive 해서 잘 사용하지 않고, 보통 flip-flop 을 사용한다.
flip-flop 은 edge triggered 하다.
이 말을 조금 더 자세히 설명하자면, 레지스터는 flip-flop 들로 구성되어있다.
edge triggered 하다고 할 때는 rising edge triggered 할 수도 있고, falling edge triggered 할 수도 있다.
이 글에서는 rising edge triggered 되는 D Flip - Flop 을 생각해보자.
D Flip - Flop 에는 D라는 데이터와 Clk 입력이 주어지고, Q 라는 아웃이 존재한다.
각 입력값에 따라 Q 출력은 다음과 같다.
클락은 0과 1이 반복되는 패턴이고, D 라는 데이터도 0 또는 1이 주어진다.
위 그림에서 꺾이지 않고 색칠된 부분은 D 라는 값이, 또는 Q 라는 값이 하나의 값을 쭉 유지하고 있다는 의미이다.
그리고 중간에 꺾인 부분은 데이터가 변경되는 부분이다.
D 플립플랍은 기억 소자이기 때문에 q는 입력이 들어온다고 해서 그 입력대로 바로 출력해주지 않는다.
항상 자신의 값을 유지한다.
그런데 Q가 내보내는 값이 바뀌는 순간이 있다.
바로 Clk 의 rising edge 타이밍이다.
D 플립플랍은 clk의 라이징 엣지 파트에 D가 가지고 있는 값을 새롭게 기억하면서 Q로 내보내는 값을 바꾼다.
그런데 이미지를 보면 알 수 있듯이, Clk 의 라이징 엣지와 Q 값이 바뀌는 타이밍이 미묘하게 다르다.
아무튼 이렇게 바뀐 q 값은 그 다음 라이징 엣지때까지 쭉 유지된다.
따라서 D flip - flop 은 값이 업데이트되는 순간이 매우 짧은 찰나이다.
반면 latch의 경우, level sensitive 하다.
latch는 clock 이 1인 동안은 항상 값을 바꿀 수 있게 허용하고, clock이 0인 동안에는 값이 유지되도록 설계되었다.
따라서 플립플랍에 비해 값이 업데이트되는 순간이 매우 길다.
값을 동기화할 때는 값을 업데이트하는 구간이 짧을 수록 디자인하기 유리하다.
따라서 디지털디자인에서는 래치보다 플립플랍을 더 자주 사용한다.
결론적으로는 D Flip - Flop 을 쓴다.
위 D 플립플랍은 아까와 다르게 입력값이 하나 더 있다.
write enable(또는 control) 이라는 값인데, 이 값이 1인 동안만 쓰기 동작을 할 수 있게 만들고, 이 값이 0일 때는 값을 쓰지 못하게, 즉 Q 값이 더 길게 유지되게 만든다.
이를 이용하면 clock 의 rising edge 마다 값을 쓸 수 있었던 것과 달리 원하는 타이밍에만 값을 쓸 수 있도록 제어할 수 있다.
이렇게 플립플랍을 바탕으로 디지털 시스템을 클락에 동기화시켜서 동작시킨다.
그래서 실제로 회로를 만들면 이렇게 조합회로와 기억 소자가 번갈아가면서 나오는 구조로 얽혀서 디자인된다.
기억소자와 기억소자 사이에는 값을 결정하는 조합 회로가 들어가는 것이다.
그리고 이렇게 기억된 값으로부터 새로운 값을 결정하는 과정은 1개의 clock cycle 내에 진행되어야 한다.
방금의 그림을 위와 같이 표현하기도 한다.
Mips 모델
이제부터 본격적으로 Single Cycle MIPS CPU를 설계하려고 한다.
첫번째 글에서 컴퓨터 시스템을 볼 때 north bridge, south bridge 와 같이 복잡하게 이야기 했었는데, 이를 단순화 시켜 CPU와 메모리가 직접 통신하는 위 구조로 디자인해보자.
이 CPU는 off chip 메모리로부터 실행하려는 명령어를 가져올 수 있어야 하고, 원하는 데이터를 읽거나 쓸 수 있어야 한다.
그래서 이를 위해 메모리의 주소를 전달하는 address bus 와 데이터가 왔다갔다하는 data bus 가 필요하다.
이 구조를 위와같이 조금 더 세분화해보려고 한다.
위쪽은 명령어를 얻어오는 구간이고, 아래쪽은 데이터를 읽고 쓰는 구간이다.
이렇게 용도별로 구간을 나눠 데이터버스도 분리하고자 한다.
(실제 DRAM 은 이렇게 동작하지 않지만, 현실적으로는 이게 맞다고 한다. 왜냐하면 나중에 캐시를 배우는데, 캐시를 포함하여 디자인하면 전체적으로 위와 같은 형태의 디자인을 하게 된다고 한다.)
Datapath & Control
마이크로 아키텍처는 크게 Datapath 와 Control 로 구성되어있다.
데이터패스는 1word 의 데이터가 동작하는 큰 흐름이다.
우리가 만드는 대부분의 유닛이 데이터패스에 속한다.
예를 들어 레지스터파일도 데이터가 흐를 때 거치는 하나의 공간일 뿐이라 데이터패스에 속한다.
ALU, Mux, 메모리도 모두 데이터패스다.
컨트롤은 데이터패스가 어떻게 명령어를 실행시켜야 할 지 지시한다.
말 그대로 데이터가 어떤 데이터패스로 가야할 지 결정하는 주체이다.
예를 들어 Mux로 보자면, Mux 자체는 데이터가 지나가는 여러 갈래의 길일 뿐이다.
컨트롤은 이 여러 갈래의 길 중에서 어떤 길을 선택할 지 결정하는 역할을 수행한다.
CPU 개요
이제부터 데이터패스와 컨트롤을 활용해서 MIPS CPU를 본격적으로 디자인하자.
CPU의 전체적인 구조는 위와 같이 나온다.
위에서 mips.v 라는 것은 베릴로그 소스코드 파일을 의미한다.
(베릴로그는 .v 확장자를 사용한다.)
MIPS 시스템을 하나의 큰 MIPS_System.v 라고하는 파일로 잘 구성했다면, 이 시스템에 클럭과 리셋 신호를 주어서 작동을 테스트할 test bench 도 베릴로그로 구성할 수 있다.
(리셋 신호는 PC 값을 초기화 하는 것같이 하드웨어의 값을 초기값으로 세팅하는 것을 말한다.)
CPU에서 명령어가 실행되는 과정은 크게 아래 과정으로 볼 수 있다.
1. Fetch : 명령어를 메모리에서 읽어온다.
2. Decodeing : 읽어온 명령어를 해석한다.
3. Execution : 해석한 대로 실행한다. 만약 메모리에 접근해야한다면 메모리에 접근까지 한다.
4 Next Fetch : 다음 명령어를 가져올 준비를 한다. (PC 값 증가)
이 4가지 과정이 하나의 사이클에서 일어나며, 이렇게 명령어 하나의 실행이 끝나면, 다음 사이클에서 이 4개 과정이 반복적으로 실행된다.
다음 글에서부터는 이제 위의 각각의 단계 하나하나를 회로도로 그리면서 MIPS CPU를 설계해볼 것이다.
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] 12. Single Cycle MIPS - Decode (0) | 2024.04.19 |
---|---|
[컴퓨터 구조] 11. Single Cycle MIPS - Fetch (0) | 2024.04.19 |
[컴퓨터 구조] 9. 곱셈, 부동 소수점 (1) | 2024.04.17 |
[컴퓨터 구조] 8. Computer Performance (0) | 2024.04.16 |
[컴퓨터 구조] 7. MIPS 명령어 총 정리 (0) | 2024.04.16 |