오래 못 할 짓 하지 않기
[ 컴퓨터 구조 ] 14. Datapath - Single Path 본문
Data path 특 ) Instruction 이 정해져야 정렬됨. = 어느 길로 갈지 정해진다 이 말
우리는 아래에 있는 명령어들만 고려할 예정
주로 명령어가 실행되는 형태는
[ Fetch -> Execute ]
1. PC를 이용하여 Instruction address 를 가져온다.
2. 그 address를 통해서 Memory로부터 Instruction를 IR로 가져온다.
3. IR레지스터에 있는 값을 읽는다.
4. 그 값을 통하여 어떤 것을 수행할지 정한다.
그럼 각각의 명령어가 위에 있는 형태에서 어떻게 맞춰지는지 보자
ADD
1. PC 주소를 이용하여 IR 레지스터에 메모리로부터 값을 가져옴
2. 읽은 결과 add이므로, 연산을 한다.
3. 다음 PC값을 가리킨다.
SUB
1. PC 주소를 이용하여 IR 레지스터에 메모리로부터 값을 가져옴
2. 읽은 결과 SUB 이므로, 연산을 한다. ( 보수를 합하는 식임 )
3. 다음 PC값을 가리킨다.
LW
1. PC 주소를 이용하여 IR 레지스터에 메모리로부터 값을 가져옴
2. 읽은 결과 LW 이므로, 필요한 연산을 진행한다.
가져올 곳의 주소를 구해야 하므로, rs 레지스터의 주소값 + imm16값을 합한다.
여기에서 imm16값을 Extend한다.
그 이유는 명령어에서 받은 값은 16bit인데, 레지스터 자리는 32비트이므로,
나머지 16비트 채우려고 자릿수 맞춰주는 개념이라고 생각하자.
3. 계산한 메모리 주소에 있는 값을 rt 레지스터에 넣는다.
4. 다음 PC값을 가리킨다.
SW
1. PC 주소를 이용하여 IR 레지스터에 메모리로부터 값을 가져옴
2. 읽은 결과 SW 이므로, 필요한 연산을 진행한다.
가져올 곳의 주소를 구해야 하므로, rs 레지스터의 주소값 + imm16값을 합한다.
3. rt 레지스터에 있는 값을 계산한 메모리 주소에 넣는다.
4. 다음 PC값을 가리킨다.
BEQ
1. PC 주소를 이용하여 IR 레지스터에 메모리로부터 값을 가져옴
2. Cond에 rs 값과 rt값을 뺀 결과를 넣는다.
3. 다음 PC값을 Cond에 있는 값에 따라 맞춘다.
- Cond가 0이 아니면 그냥 PC+4
- Cond가 0이면, PC+4 + ( imm16값 *4 ) << 그 주소까지 가기 위한 값
Implementation
- Data register와 / Inst register 를 따로 둔 이유
: Single clock 이기 때문에 한 Clock cycle에 register 값을 딱 한 번만 읽을 수 있음
따라서, 이렇게 나누어 놓아야 Inst 랑 Data 각각 구할 수 있음
( 한 번 작업하는데 레지스터 하나에서 두 개 값을 못 꺼낸다 이 말)
우선 저 안에 있는 요소들을 각각 뜯어보자
Register File
레지스터에 있는 값들이 들어갔다 나왔다 하는 곳이다.
add Instruction일 때, 이 Register File은 어떻게 작동하는지 알아보자
ex) add 12,7,8
1) 7번 ,8번 레지스터를 Read register 1,2에 넣고, Write register에 12번 레지스터를 넣는다.
2) read regiser값을 read data에서 가져온다.
3) (register file옆에 있는) ALU에서 연산을 한 뒤 write data (12)에 넣는다.
4) Write data한 값이 Write register에 있는 12번 register에 들어간다.
Read register > Read data 세부적인 모습
몇 번째 레지스터를 보낼지는 MUX를 이용한다.
어느 Register에 write할지 정하는 건 decoder로 한다!
위에 있는 걸 합치면 아래와 같다.
구현하는 데에 필요한 Components는 위와 같다.
다들 각각 보게 되겠지만 어느 것을 할 때 어느 Components가 쓰이는지는 시험에 내기 아주 좋기에 꼭 외워두자
참고 할 점은 ALU가 있는데 왜 Adder가 있느냐?
--> PC = PC+4 를 할 때, Data/Inst register를 나눴듯이 이것도 같은 ALU에서 다 할 수 없기 때문에 하나 추가로 만들었음
ALU control signal
ALU control을 하기 위해서 A의 값, B의 값, Operation 값2개. 총 4개의 숫자를 보고 어느 function을 수행할지 정한다.
세부적으로 보면 이러한 형태인데, 그리 자세히 알 필요는 없다고 하심.
그냥 빨간색 칠해놓은 곳이 NOR이므로, 모든 숫자가 0이 들어가야 1이 된다. 정도 알아놓으라고 하심
Datapath
이젠 각 Components를 보면서 Datapath를 분석해볼 예정
Instruction Fetch
1. Instruction Memery에서, PC값에 해당하는 주소로 가서 Instruction을 가져온다!
2. PC = PC+4 (Adder에서 수행됨)
R-type Instruction
add rd rs rt
( 레지스터 순서는 R타입만 rd rs rt이고
나머지는 (명령어 ) rt rs이다 )
1. Instruction에 있는 rs,rt를 Read register 1,2에 넣고, Write register에 rd 레지스터를 넣는다.
2. read regiser값을 read data에서 가져온다.
3. ALU에서 연산을 한 결과를 Write Data에 넣는다.
4. 그 값이 Write register에 있는 rd에 들어간다.
LW , SW
[ LW ]
1. Instruction에 있는 rt를 Read register 1에 넣고, Imm16 값을 아래 sign extend 유닛에 보낸다.
rs는 write register에 넣는다.
2. rt > read data1 값과 sign extenede imm16 을 ALU에 넣고 합한다.
3. 그 결과로 나오는 주소값을 Data memory 에서 찾는다.
4. 그 메모리 주소에서 나오는 값을 Write data로 넣는다.
5. Write data에 있는 값을 Write register로 넣는다.
ex) lw $17 20($18)
ex)
17번 reg는 write reg로 간다.
18(rs)번 reg가 read reg 1에 간다.
20은 sign extend 유닛으로 간다.
위 read reg1 + extend(20) 의 결과값을 data mem주소로 한다.
17번 reg에 쓴다.
[ SW ]
1. Instruction에 있는 rt를 Read register 1에 넣고, Imm16 값을 아래 sign extend 유닛에 보낸다.
rs는 Read register 2 에 넣는다.
2. rt > read data1 값과 sign extenede imm16 을 ALU에 넣고 합한다.
3. 그 결과로 나오는 주소값을 Data memory 에서 찾는다.
4. Write data 에 rt값을 넣고 그 주소에 쓰고 저장한다.
Branch ( BEQ )
beq $6 $7 label
1. Instruction에 있는 rs,rt를 Read register 1,2에 넣는다.
2. ALU에서 둘을 뺀다.
3. 0이면 이제 label로 가는 건 Imm16으로 받으므로, 그 값을 sign extend하여 shift left 2 하고,
PC = PC + 4 + ( sign ex (imm16)) 하여 더한 곳으로 이동한다.
R-type + (Load or Store)
어떻게 작동할지 생각해보자
lw $5 20($7) / sw $5 20($7)
LW / SW에서 차이는
$5가 register 어느 파일에 들어가냐 차이이다.
LW일 땐 writer reg.
SW 일 땐 Read reg2로 들어가서 read data 2로 나와서 밑으로 빠져서 mem에 data write 로 들어간다.
R-type + (Load / Store) + Branch + PC
명령어별로 어떻게 돌아갈지 생각해보기
Add는 이런 Path임
A Simple Implementation Scheme
어떤 명령어일 때 ALU 혹은 다른 것 유닛에 어떤 값들이 들어가는지 알기~!!
Register 앞에 MUX가 있는 이유
R타입에서는 write reg가 갈 곳이 Inst[11~15] 이고
LW나 그 이외는 Inst[16~20] 이기 때문이다.
Control signal 관련해서는 Op 코드와 function 코드를 확인하면 되는데
1) OP코드 = 0 -> function 코드 확인
2) OP코드 !=0 -> 진행
ALU op 코드는 가장 왼쪽 bit로 확인한다.
● 왼쪽이 1이면 R - type 이므로, function code까지 확인하러 간다.
● 왼쪽이 0이면, 다른 명령어 이므로 그 명령어에 맞게 움직인다.
(출처)
한동대학교 용환기교수님 - 컴퓨터구조
'2학년 2학기 > 컴퓨터 구조' 카테고리의 다른 글
[ 컴퓨터 구조 ] 16. Datapath - Pipeline (0) | 2023.11.02 |
---|---|
[ 컴퓨터 구조 ] 15. Datapath - Single/Multi CLK Cycle (강의 multi 2) (0) | 2023.10.29 |
[ 컴퓨터 구조 ] 13. Floating Point number 2 (0) | 2023.10.15 |
[ 컴퓨터 구조 ] 문제풀기 2 (0) | 2023.10.12 |
[ 컴퓨터 구조 ] 12. Floating Point number (0) | 2023.10.09 |