본문 바로가기

RISC-V CPU 설계/개념 정리

교과블록 2주차 발표 (3장)

3장은 ISA에 대해 배운다.

 

[1] Base ISA   ( RV32I, RV64I) >

 

>> RISC-V CPU가 필수로 제공해야 하는 명령어

 

- RV32I  : 32-bit 아키텍쳐에 기반한 정수(integer) 처리를 위한 명령어들

> 주로 소형 저전력 임베디드 시스템을 위한 프로세서로 사용되고 있다.

 

- RV64I  : 64-bit 아키텍쳐에 기반한 정수(integer) 처리를 위한 명령어들

> 레지스터의 크기 Program counter가 모두 64-bit RV32I 보다 명령어 12개가 더 많다. (곱셈, 나눗셈, 부동소수점 연산)

> 주로 AP (application processor , 스마트폰 CPU)

ex) RV32IMAC > RV32I + M + A + C 세가지 extension을 포함하는 명렁어 set

 

+) 우리는 RV32I ISA 공부

 

명령어 (instruction ) = 머신코드 (machine code) 또는 기계어

 

명령어를 사용해 코딩할때 >> 어셈블리 프로그래밍 할 때

 

명령어 >> 컴파일러 or 어셈블러를 통해 0과 1로 이루어진 형태로 바뀐 것을 기계어

 

 

when  컴퓨터가 프로그램을 실행

 

1. 기계어로 이루어진 프로그램을 메모리에 적재2. CPU는 기계어를 읽어 실행한다. > CPU의 기본 기능이 명령어를 실행하는 것

 

3장에서는 CPU 대략적인 구조를 보고 CPU 내부 하드웨어 구조 ( =마이크로 아키텍처)는 5장에서 설명

 

what is RV32I ??

 

 

- 32개의 (x0 ~ x31) 일반목적 레지스터 (general-purpose register) + PC (program counter)

 

>> x0 레지스터는 항상 0 으로 고정  why? 프로그램 수행 중 0이 많이 사용되는데 그때마다 주기억장치 (RAM) 에서 읽어오지 않고 바로 사용하도록 하기 위해서이다

 

+) 추가설명

 

x0 레지스터는 하드웨어 수준에서 이미 0으로 초기화되어 있으므로, 프로그램에서 명시적으로 값을 지정하지 않아도 항상 0 값을 가지고 있다. 이것은 매번 메모리에 접근하여 0 값을 가져오는 것보다 훨씬 빠르고 효율적 이다.

따라서 프로그램에서 0 값을 필요로 하는 경우에는 x0 레지스터를 사용하여 메모리 액세스 없이 바로 사용할 수 있다.

이를 통해 프로그램의 실행 속도를 향상시킬 수 있는 것 이다! 

 
 
 

>> x0을 zero라고 써도 된다는 의미 밑에 줄도 마찬가지

.

What is R-type , I-type , S-type , U- type , B-type , J-type  ??

 

>> 모두 명령어의 길이는 32-bit 이다.

 

3-3 [참고] RV32I에서 제공하는 모든 명령어

 

 

 

- 명령어에서 opcode , funct7 , funct3 field는 명령어가 어떤 동작을 하는지 명시하는 부분이다.

> 일반적으로 통칭 opcode이라고 부른다

 

+) RISC-V에서는 opcode와 funct7 필드를 함께 사용하여 명령어의 종류를 확장하거나 추가 기능을 제공한다.

                              funct3 필드를 사용하여 명령어의 특정 조건을 지정하거나 명령어의 작업을 세분화한다.

 

+) field = 주어진 명령어에서 특정 정보를 포함하고 있는 부분을 가리킨다.

 

- rs1, rs2, rd field에는 레지스터 번호를 명시한다.

 

rs1 = 첫 번째 피연산자 레지스터

rs2 = 두 번째 피연산자 레지스터 rd   = 목적지 레스터를 명시

 

레지스터 파일에 있는 레지스터의 개수가 32개 이기 때문에 rs1,rs2,rd는 모두 5-bit로 이루어져 있다. ,, 32(= 2^5)

 

32개 레지스터 중 1개를 명시하려면 5-bit가 필요하기 때문이다. 

 

- imm (immediate)은 명령어에 포함된 상수로 우리말로는 즉치값이다.

 

ex) add 명령어 >> 이해하기 

 

add x2, x3, x4 >> R-type 명령어 

 

sol) CPU는 x3 + x4 덧셈 연산을 하고 그 결과를 x2레지스터에 저장한다.

 

opcode = 011011, funct7 = 0000000, funct3 = 000 >> 위에 표에서 찾아보세요!

 

첫 번째 source 레지스터는 x3 > rs =1 , 두 번째 source 레지스터는 x4  > rs2 = 4   ,  destination 레지스터 x2 > rd = 2

 

 

>> 소프트웨어 프로그램의 기능 = 조건에 따라 (조건없이) 데이터 연산 혹은 처리를 하는 것

 

따라서 CPU는 최소 3가지 종류의 명령어는 반드시 제공

 

1. 데이터처리 명령어   >  연산 명령어

2. 메모리 접근 명령어 

>  CPU가 데이터를 메모리에서 레지스터로 가져오는 명령어& 레지스터 값을 메모리로 쓰기 위한 명렁어

3.분기 명령어 (branch instruction) > if for while과 같은 조건문이나 함수호출을 위한 명령어

 

 

 

 

 

RV32I 데이터 처리 명령어 (data processing instruction)

 

>> 알아두기!   /  RV32I에는 정수에 대한 덧셈과 뺄셈을 하는 명령어만 있다. (위에서 배웠죠?!)

 

 

(1)   add 명령어 (R-type 명령어)

 

add a5, a4, a5  =  a4 + a5 (=x14 + x15)덧셈을 하여 a5(=x15) 레지스터에 저장하는 명령어

 

>> 여기서 opcode , funct7 , funct3에 51 ,0 , 0이 들어가는이유는 그냥 그렇게 정해서 이다. ( 3-3 표 보기)

>> rs1, rs2에 source register 번호인 14 (=x14), 15 (=x15), rd에는 destination register 번호인 15 (=x15)  

 

add a5, a4, a5    2진수로 표현하면  명령어의 기계어 , 16진수 형태로 표현 하면 0x00F7_07B3

 

(2)   sub 명령어 (I-type 명령어)

 

addi a5, a5, -12  =  a5 +(-12) (=x15 + (-12))덧셈을 하여 a5(=x15) 레지스터에 저장하는 명령어

 

>> add 에서 처럼 opcode, funct3에는 어떤 값이 들어가는지 확인

>> rs1, rd에는 첫 번째 source register와 destination register 번호인 15 (=x15), 15(=x15)가 각각 들어간다.

 

두 번째 source operand인 -12는 imm 12에 어떤 형태로 들어갈까?

> 컴퓨터에서는 음의 정수를 2의 보수체계를 사용해 표현한다. 즉 , -12를 2의 보수로 표현한 값이 imm[11:0]에 들어간다.

 

> 책 참고 p.121~122