SoC 12주차 RISC-V공부

김영기·2024년 5월 23일
0

SoC

목록 보기
2/2

메모리 읽기 쓰기

LOAD : 메모리 -> reg
Store: reg -> 메모리

Data Transfer Illustration

1 pc 값 0x0000
2 pc 값에 해당하는 명령어를 읽음.
3 lw x2, 4(x5)면 x5에 해당하는 reg의 값에 +4를 해준 주소를 메모리에서 읽어서 메모리의 값을 data_bus를 타고 x2에 써줌.

lw, load기 때문에 memory에서 reg
operation 끗

4 pc값 0x0004가 증가.
5 lw x3, 8(x5)를 가져옴.
6 x5에 해당하는 값에 8을 더해서 0x0018로 만들어줌. data bus를 타고 메모리의 0x0018에 해당하는 겂을 reg x3에 써줌.

7 pc값 0x0008로 증가
8 add x2,x2,x3 가져옴
9 x2, x3를 더해서 x3에 저장하는 process x2의 값에 덮어씀

byte Addr

주소가 8byte마다 1씩 올라감.
32bit로 보면 4씩 올라감.

물리적인게 아니라 가상적인 것임.

word : 32bit를 의미한다..!
CPU가 access한 최소 data의 단위는 1Byte

CPU명령마다 data의 단위가 다름.

Byte(8비트) 단위 LB, SB : char

Half Word(16비트) 단위 (LH, SH) : short , 2Byte

Word 단위 (Lw, SW) : int, 4Byte를 읽어오는 단위

float는 지원안함.

lw

lw rd, address
lw t0, 24(s3)

s3에 저장되어있는 값을 읽어서 걔랑 24를 더한 것이 메모리의 주소
그 메모리 주소의 값을 읽어서 t0에 저장하는 것이 load

t0는 x5, s3는 x19임.
lw는 i type
12bit가 imm : 24

rs1 : 19(x19)라서 // reg source

funct3 : 2 // 이거는 정해짐.

rd : 5 // reg destination

opcode : 3

imm이 24가 rs1의 x19의 값에 더해져서 rd에 값을 써준다.

rs1의 x19의 값은 32bit
imm은 24는 12bit 둘이 더해줘야하는데 bit수 안 맞음
imm의 값에 sing extesion을 진행한다.

s3에 0x0000_0094가 저장되어 있다고 하면, +24해서
0x0000_00ac가 된다. 시작주소가

8bit라고 생각해보면
0x00ac -> 00ad -> 00ae -> 00af

lw가 32bit(4byte)여서 ac에서 af까지 읽음.
af AA
ae BB
ad CC
ae DD

리틀 앤디안, 빅앤디안
보통 리틀 앤디안
MSB



LSB // 이런 스타일임.

12bit -2048에서 2047까지 표현 가능
rs1의 들어있는 값과 imm에 있는 값을 더함.

imm의 표현범위가 -2048~2047까지의 범위 access가능
base addr에서

SW reg->memory

메모리에 쓰기 위해서 주소와 데이터 필요

sw rs2, address

sw t2, 8 (s3)

s type

imm이 나눠져있음

verilog code작성시 concacnation 합쳐야함.

hexadecimal을 보고 표 2개 보고
어셈블리어를 짤 줄 알아야함. 아마 시험

cpp-> complie -> as (assembler) -> linker -> loader
실행파일에는 실행파일이랑 메모리 주소
./add 실행하면
loader에 탁 올라가면서 pc값이 탁탁탁 올라감.

lw x2, 80(zero)

0 + 80 = 80, 80번지에 들어있는 값을 읽어와서 x2라는 reg에 저장

pc값에서 읽어서 명령어가 튀어 나옴.
80은 imm이어서 명령어에 들어있음, 그냥 바로 나옴.

mux가 i type , r type 정해줌.
ALU가 더해서 80이 튀어나옴. 80주소가 들어가면 memory에서 data가 튀어나옴.

readdata에서 튀어나와서 reg file에 다시 저장됨.

lw

1 patch
pc값에 들어가서 명령어를 가져오는 것

2 decode 명령어를 분석해서
ALU로 들어가는 값 대기 시키기

3 ex ALU가 계산해서

4 MEM read data에서 MEM나오는 것

5 WB reg file에 다시 저장됨.

store


pc값이 나오고

imm에서 84가 나오는데 decode

ALU 계산되는게 exe 84나온느게

store는 쓰는 것 x2에서 data를 가져와서 memory에 써줌. mem

store는 wb가 없음.

add같은 경우는 mem이 없고 store는 wb가 없음

load는 다 있음

single cycle은 문제가 없음

multicycle은 문제가 있음
controller를 fsm으로 설계해야함. 명령어 보고 state machine이 갈 길이 달라짐.

RISC-V Memory Map 예

32bit

lw, sw 읽을 수 있는 범위 32bit

2^32 한줄이 8bit, 2^32이니까 4G byte

32g DRAM을 붙여도 4G가만 씀

OS에 맞는 프로그램을 깔아야함.
프로그램을 읽는 주소는 PC

data가 차지하는 영역은 Global과 Dynamic으로 바뀜

Global data는 전역변수

Dynamic은 main 내부, 함수 내부 , stack

GP, Global data

lw x2, 80(GP)

표현가능 범위가 -2048~2047

static

static 붙이면 전역변수가 댐.

함수 밖으로 나와있는

대부분은 Dynamic으로 들어감.

main, local에 들어가는 애들은 다 stack으로 dynamic data에 들어감.

계산할 data가 많으면 memory에 넣고 다시 끌어와야함.

int, stack에서 위에서부터 저장

malloc은 heap 아래에서 부터 저장

Exception Handlers

예외 사항이 발생하면 여기있는 코드가 작동 함.

profile
안녕하세요

0개의 댓글