여담
ISA란 instruction set architecture임
ISA 유형에는 CISC RISC 등등
ISA 종류에는 MIPS ARM x86 등등
ISA 통해 기계어 - HW 연결
ISA에서 명령어 정할때 고려사항 : high level 기능 다 구현할 수 있나? 적은 명령어로 효율적으로 hw에서 돌아가는가 등
Single Cycle
Single Cycle이란 한 clock당 하나의 명령어를 해결하는 환경
명령어 다 구현할수있는 processor는 너무 복잡하니까
이것만 돌아가는 걸로 배워본다. 또 모든 명령어는 같은 시간이 걸릴거라고 가정함 ㅇㅇ
먼저 사전 지식을 배워보자
Computers are sate machines
컴퓨터는 상태기계다 각각의 레지스터, 메모리, 디스크 등등은 상태를 가지고 있다.
processor의 역할은 이런 상태를 read and update 한다.
Instruction fetching
: 명령어를 cpu로 가져오는 동작
harvard 구조를 이용함.(instruction과 data가 다르게 저장되고 가져옴)
cpu는 무한으로 돈다. PC가 계속 증가하면서 명령어 가져옴
R-type 명령어가 Decoding 되는 과정을 보자
Register file은 index가 들어오면 해당 register들의 data를 뽑아주거나 write data가 들어오면 write하는 일만한다.
R-type 명령어의 rs rt rd 5bit짜리 register specifier들이 들어오면 해당하는 register들의 data가 나온다.
RegWrite라는 control signal에 의해서 write 실행 결정(뒤에나옴)
ALU는 op에 따라서 ALUOp만 실행한다.
R-type기준으로 Instruction memory에서 하나 fetch하면 해당 위치에 따라 적절하게 사용됨
edge기준으로 보자면
clock edge 발생하면 PC+4 되고 Instruction Memory에 명령어 들어가고 차례대고 계산해서 wirte data에 담긴다.
그리고 다음 edge 발생하면 rd 레지스터에 write data.
I-type Insturction인 경우
1) addi
addi 라고 생각하면 I-type 명령어는 R과 다르게 rt 레지스터가 read가아닌 write로 쓰일수 있다. 따라서 MUX를 추가해 두개의 명령어가 사용될수있게 설계한다.
만약에 RegDst가 0이라면 I-type 1이라면 R-type로 사용가능
암튼 I-type인 경우에 rs와 address를 이용해서 뽕짝해서 rt에 넣거나 한다. 따라서 address를 32bit로 연장하기위해서 Sign extend를 진행한다. (첫번째 숫자대로 유지하면서 32bit로만 늘리는거임)
그렇게 ALU에서 계산된 결과를 Registers에 write data로 넣는다. control signal에 의해 MUX들로 알아서 선택함 ㅇㅇ
2) lw
위에건 addi 인 경우고 만약 lw $rt, address($rs)라는 명령어를 실행한다고 해보자.
lw는 메모리의 data를 register로 저장하는 명령어로 rs의 값에 있는 주소의 data를 rt register로 저장하는거임.
이전과 추가된건 없다 하지만 control signal을 이용해 lw 명령어를 수행한다.
처음 I-type이라면 RegDst, ALUSrc은 1이다. 그리고 명령어가 lw라면 MemWrite = 0 MemRead = 1 MemToReg = 1 RegWrite = 1로 설정해 메모리에서 data를 읽어와서 regisister에 쓴다.
3) beq
branch인 경우 연산 결과에 따라 PC값이 바뀌기 때문에 PC에 연결된 추가적 설계가 필요하다.
beq인 경우를 살펴보자
control signal에 따라 rs와 rt를 뽑아온다. ALU에서 두개가 equal한지 비교한다 (XOR 연산 등등)
만약 ALU값이 Zero라면(rs == rt) PCSrc signal이 1이된다.
따라서 address가 PC값에 더 해진다는 뜻 ㅇㅇ
J-type Insturction인 경우
마지막으로 j 와 jal을 하기위에 추가적으로 붙인걸 보자.
branch는 offset이라 0~15bit로 * 4 해서 PC에 더해주었지만 j와 jal은 26bit 전체가 절대주소가된다.
따라서 25-0 bit를 따로 빼줘서 32bit로 크기 맞춰주고 그게 PC값이 되어야한다.
그렇다면 25bit 짜리놈을 어떻게 32bit로 만들까?
25bit 짜리를 일단 shift left 2를 한다. 어차피 memory에서는 4byte 단위로 잘라먹으니까 하위 2bit는 무조건 00이다. 따라서 명령어로 교환할때는 2bit를 뗀상태로 교환하고 마지막에 붙치는 형식.
그리고 상위 4bit는 현재 PC값의 상위 4bit에서 가져온다. 그렇게하면 2^28 = 256MB 범위의 주소를 이동할 수 있다.
Final
요 명령어은 돌아가는 single cycle mips processor의 구조이다.
control path
control signal로 control unit을 관리해서 instruction에 따라서 적절하게 돌아가게 해야한다.
위에서 파란색으로 되어있는 이 control unit들을 명령어에 따라 알맞는 값으로 설정해야됨.
각 명령어보고 control singal이 어떻게 설정될지 알아야됨.
x 는 don't care로 뭐로 설정되던지 상관없다는 뜻이다. RegWrite, MemToReg 가 0인 경우에는 설정을 하든 말든 상관없다 다만 Memory read write는 don't care라도 사용하지않는다면 반드시 0으로 설정한다.(성능 하락을 막기위해)
'학교공부 > 컴퓨터구조' 카테고리의 다른 글
컴퓨터구조 10,11 - Pipeline Hazards (2) | 2020.06.15 |
---|---|
컴퓨터구조 9 - Pipeline (0) | 2020.06.15 |
컴퓨터구조 MIPS - 2 (0) | 2020.06.14 |
컴퓨터구조 MIPS (0) | 2020.06.14 |
컴퓨터구조 Performance (0) | 2020.06.14 |