본문 바로가기
시스템 반도체/컴퓨터 구조 (RISC-V)

컴퓨터 구조 CPU register ( 레지스터, R-type, I-tpye, 메모리 계층 )

by 전컴반 2022. 2. 25.
반응형

먼저 CPU 레지스터가 왜 필요한지부터 알 필요가 있는데, 그 이유는 메모리가 계층구조로 이루어져 있기 때문이다. 무슨 말이냐면 메모리에 단계가 있다는 의미다. 이런 단계를 거쳐야 속도가 빠르고 지연이 없다.

 

메모리는 다양하다. 하드 디스크, 메인 메모리, 캐시, 레지스터... 이렇게 다양한 메모리지만 크기와 사이클의 속도가 다르다. 사이즈가 크면 속도는 느리다. 그렇게 때문에 한 단계씩 load 해서 미리 불러 놓고, 필요할 때 지연이 없게 해야 한다.

 

예를 들면, CPU 레지스터는 캐시에서 데이터를 가져오고 캐시는 메인 메모리에서 가져온다. 이게 메모리의 계층이다. 이런 이유로 레지스터가 필요하다. 

 

레지스터는 어떤 모습으로 존재할까? 예를 들어 32bit면 2의 5승이니 00000 ~ 11111가 있는데 이 중에 하나의 레지스터 주소 값으로 취한다. 또한 각각의 레지스터는 32비트를 가진다. 이때 여러 type이 있다.

 

 

R-type

 

operation은 3가지 부분으로 나눌 수 있다.

opcode = 7bit

funct7 = 7bit 

funct3 = 3bit 

 

위에 3 부분으로 operand를 정할 수 있다. 미리 정해져 있는 동작을 적으면 cpu는 알아서 명령어에 맞게 수행한다. 하지만 RSIC-V의 명령어는 40개의 opreation만 있는데 왜 이리 많냐고 하면, 자유성을 정하고 필요에 따라 추가할 수 있기 때문이다.

 

다음으로는 피연산자들이다.

rs1 = 5bit, first source operand, 32개의 레지스터가 있기 때문에 5bit를 가진다. 주소를 정해야하기 때문이다.

rs2 = 5bit, secend source operand

rd = 5bit, destination operand, 연산 결과가 저장되는 레지스터를 적어준다. 이때 얻은 결과값을 wirte (update)하는데 이건 매우 위험한 동작이다. 그래서 write control 신호가 필요하다. 따로 동작신호를 줘야 한다. 

 

대표적으로 산술 연산이 있다. add를 예로 들어보자

 

 

이렇게 있다면, 정해진 테이블에 맞게 집어넣으면 된다.

funct7, funct3, opcode는 RISC-V에서 정해져 있는 코드다. 나머지도 테이블에 맞게 넣는다. 이렇게 된 상태에서 2진 코드로 변경하면 그게 바로 머신 코드가 되는 것이다. 

 

 

0000000_10010_01001_000_00101_0110011으로 32bit지만 너무 길어서 16진수로 변환해보자, 4bit씩 잘라서 생각한다.

0x 0124_82B3로 변환 가능하다 (0x란, 16진 수라는 의미)

 

I-type

 

 

imm [11:0]이라는 친구가 있다. immediate라고 부르는데, 명령어로부터 바로 이용 가능하기 때문에 이렇게 부른다. 

12bit라, 범위는 부호 bit 하나를 빼고, 부호가 있는 -2^11 ~ 2^11 -1 (== -2048 ~ 2047)이다. 음수를 표현하기 위해 2의 보수로 사용한다. 

 

(+ 간단히 2의 보수를 설명하자면, 예를 들어 4bit에서 +2는 0010이다. -2는 0010을 뒤집은 뒤에 1을 더해준다. 즉 1101에서 +1을 하면 1110이 된다. 이게 -2이다.)

 

다시 돌아와서 immediate 예를 들어보자, addi t0, s3, -12에서 -12 source operands는 내장돼 바로 사용할 수 있다는 의미다.

 

 

이때 -12를 어떻게 표현할 것인가가 문제인데 위에서 말한 것처럼 2의 보수를 이용하여 표현한다.

 

여러 타입이 있지만 위와 똑같이 적용하여 머신 코드를 만든다.

반응형

댓글