컴퓨터 구조

[컴퓨터 구조] 단일 사이클 구현(1)

kidmillionaire1998 2022. 8. 30. 20:28

숭실대학교 하석재 교수님의 2022-1학기 컴퓨터 구조 강의를 정리 및 재구성했다.

[전제]

- 상향 클럭 에지를 사용한다. (Rising Edge 사용)
- 한 사이클 내에는 피드백이 일어나지 않는다.
- 데이터는 32비트의 폭을 갖는다.

: 32 비트 MIPS가 취급하는 거의 모든 데이터가 32비트의 복을 갖기 때문에, 이 프로그램의 상태 소자와 논리 소자의 입력과 출력 폭은 거의 다 32비트이다.

-레지스터는 듀얼 포트(dual port) 설계이다.

: 메인 메모리와 다르게 레지스터에서는 필수조건이다. 예를 들어, add $r1, $r2, $r1이라는 명령어가 있을 때, r1과 r2값을 "읽는" 작업과 두 값의 합을 다시 r1에 "쓰는" 작업이 동시에 이루어져야 하기 때문이다.

-그림에서 버스(bus)는 굵은 선으로 표시할 것이다.

: 버스는 폭이 2비트 이상인 신호들이다. 어떤 때는 여러 버스들을 합쳐서 더 넓은 버스를 만들기도 한다. 예를 들어, 16비트 버스 2개를 합하여 32비트 버스로 만들 수 있다. 이럴 경우에는 버스 선에 레이블을 붙여서 더 넓은 버스를 만들기 위해 버스를 합쳤다는 것을 명확하게 나타낸다.

-데이터 패스는 검정색, 컨트롤 패스는 파란색이다.

Cf)

[버스]

컴퓨터 안의 부품들 간에, 또는 컴퓨터 간에 데이터와 정보를 전송하는 통로

- 2개의 노드만 통신이 가능하며, 통신 중의 2개의 노드 중간에 있는 노드는 통신이 불가능하다.
- 여러 노드가 같이 통신하려면 스케줄링이 필요함. (보통 TDMA 방식)

버스

[크로스바(cross bar)]

- 여러개의 노드가 동시에 통신 가능하지만 복잡하다.
- 시스템 요소(프로세서, 기억장치 모듈) 간에 한 개씩 별도의 전용 경로가 존재하기 때문에, 경로에 대한 경합으로 인한 지연이 없다.

크로스바

[싱글 포트 vs 듀얼포트 메모리/ 레지스터]

싱글 포트
: 한 번에 read 또는 write를 선택

듀얼포트
: 동시에 write와 read가 가능하게 설계

-메모리 핀이 두 개가 존재
-비디오 램(VRAM, GDDR)에 많다.

: 일반 메모리 램과 다르게 그래픽 카드에 있는 메모리를 지속적으로 읽고, 화면으로 보여줘야(쓰기) 하기 때문에 그렇다.

듀얼포트

[데이터 패스(Datapath)]

[구성요소(MIPS)]

-명령어 메모리와 데이터 메모리
: 서로 구분 되어 있는 하버드 Architecture
- 레지스터 파일( register file)
: 접근할 레지스터 번호를 지정함으로써 읽고 쓸 수 있는 레지스터들의 집합으로 구성된 상태소자
-ALU
-Adder
-PC(Program Counter)
: 주소 값이 4씩 증가한다. (32비트 워드)


샘플 MIPS 프로세서 구조


[명령어 (Instruction) Fetch]

[명령어 메모리]
-주소를 주면 (Read address) 해당 주소에 있는 명령어 내용(Instruction)이 무엇인 지 확인한다.
: 인출된 명령어는 데이터 패스의 다른 부분에서 사용된다.
-명령어 쓰기를 하지 않고, 읽기 전용이기 때문에 명령어 메모리(Instruction Memory)는 읽기 접근만 제공하면 된다. 이러한 이유로, 명령어 메모리는 조합회로로 취급한다.

[프로그램 카운터]
- 매 클럭 사이클 끝에 쓰기가 행해지는 32비트 레지스터이다. 따라서, 쓰기 제어 신호는 필요하지 않다.
[덧셈기]
- 두 32비트 입력을 더해서 합을 출력으로 내보내는 일만 하도록 결선되어 있는 ALU이다.
-PC의 주소 값에 4가 더해진 뒤(Add), 다음 PC의 주소 값이 정해진다.

레지스터 파일

[레지스터 파일]

-모든 레지스터 파일을 포함하고 있으며, 읽기 포트 2개와 쓰기 포트 1개가 있다. (듀얼 포트)
-항상 Read register 입력이 지정하는 레지스터의 내용을 출력하므로, 다른 제어 입력이 필요 없다.
-반면에, 레지스터 쓰기는 쓰기 제어 신호를 인가하여 쓴다는 것을 명확히 표시해야 한다. (RegWrite)

: 쓰기는 에지 구동이기 때문에, 모든 쓰기 입력이 클럭 에지에서 유효하다. 한 사이클에서 읽고 쓰기가 동시에 가능하다. 읽기는 전 클럭 사이클에서 쓴 값을 가져오며 새로 써진 값은 다음 클럭 사이클에서 읽을 수 있다.

-레지스터 번호 입력은 5비트이며, 데이터 선들은 32비트이다.

[ALU (Arithmetic Logic Unit)]

-4비트 ALU operation 신호로 제어된다.
-ALU의 zero 검출 출력은 분기를 구현할 때 사용한다. (입력값이 같은 지의 여부)

[데이터 메모리 유닛]

- 입력 2개 (Address, Write Data)와 출력 1개 (Read data) 를 갖는 상태 소자이다.
- 읽기(MemWrite)와 쓰기 제어 신호(MemRead)가 따로 있지만 한 클럭에는 이들 중 하나만 인가될 수 있다.

: 레지스터 파일과 달리 올바르지 않은 주소를 읽으면 문제를 일으킬 수 있으므로, 메모리 유닛은 읽기 신호가 필요하다.


[부호 확장 유닛(Sign Extension Unit)]

- 부호 확장 유닛은 16비트 입력값을 32비트 부호 있는 값으로 확장하여 출력으로 내보낸다.

[마이크로프로그래밍]

- 어셈블리 명령어를 실행하기 위해 제어 신호를 어떻게 줄 것인가?
: 데이터 패스도 여러 개 가능하며, 제어 신호도 다 다르다.
- x86-64(Amd 64) 어셈블리는 동일하지만, AMD/인텔의 마이크로 프로그램은 틀리다.

[분기 / 지연 분기]

[분기 목적지 주소]

:분기 명령어에 의해 지정되는 주소이다.

- MIPS 구조에서 분기 목적지는 명령어의 변위 필드 값에 분기 명령어 다음 명령어 주소를 더한 값이 된다.

[분기가 일어났다(branch taken)/ 분기가 일어나지 않았다(branch not taken)]

: 조건이 사실일 때(즉 두 피연산자 값이 같을 때) 분기 목적지 주소가 새로운 PC 값이 될 때 분기가 일어났다고 말하고,
피연산자 값이 같지 않으면 다른 보통 명령어와 같이, 증가된 PC 값이 새 PC값이 되는데, 이 경우에 분기가 일어나지 않았다고 말한다.

[지연 (delayed) 분기]

: 분기 조건이 참인지 거짓인지 상관없이 다음 명령어를 항상 실행한다.

-조건이 거짓이면 그대로 분기하지 않고 다음 명령어를 실행한다.
-조건이 참이면 지연 분기 명령어의 다음 명령어 실행 후 분기 주소로 점프

-지연 분기를 사용하게된 동기는 추후에 설명될 예정인 파이프라이닝이 분기에 미치는 영향 때문이다.