RISC-V
에 맞는 글이 없습니다.
조건 지우기RISC-V의 분기·점프 구현: 분기 판단 위치, JAL·JALR, 리턴 주소 스택 힌트(rd·rs1 규칙)
RISC-V 18편. 분기 판단 위치, JAL ID 리다이렉트, BTFN 정적 예측, 명세 2.5 힌트를 따르는 RAS를 파이프라인 모델에 넣어 비교했다. CPI가 1.368에서 1.227로 줄었고, RAS 8칸이 fib 복귀의 98.3%를 맞혔다.
RISC-V 5단 파이프라인: 포워딩·스톨 조건식, x0 처리
RISC-V 17편. 5단 파이프라인 모델로 같은 프로그램을 돌려 QEMU와 일치시키고 CPI를 쟀다. 포워딩을 켜면 1.37, 끄면 1.83이었다. rd≠0 조건을 빼면 HINT ntl.all을 쓰는 프로그램이 0 대신 0x80000000을 썼다.
즉시값 생성기와 RISC-V 단일 사이클 데이터패스
RISC-V 16편. 2편의 선택기 표를 즉시값 생성기 회로로 옮기고 단일 사이클 데이터패스를 조립했다. 프로그램 5개, 명령어 1,076,364개를 실행해 QEMU와 pc 열·레지스터가 모두 같았고, 분기가 20.0%(그중 58.5% taken)였다.
RISC-V 디코더 설계: opcode·funct3·funct7 표, 형식 판별, 불법 명령어 검출
RISC-V 15편. RV32I 디코드 표를 제어 신호까지 채우고 불법 명령어 조건 다섯 가지를 정한 뒤, 174,608개 단어로 GNU objdump와 대조했다. 165,923개가 같았고 다른 8,685개는 네 가지 원인으로 모두 설명됐다.
메모리 모델: RVWMO, FENCE의 의미, Ztso
RISC-V 9편. RVWMO 메모리 모델의 보존 프로그램 순서, fence의 pred·succ, aq·rl, Ztso를 정리했다. 리트머스 7개를 SC·TSO·RVWMO로 열거해 MP·SB·LB의 허용 여부를 세고, GCC의 C11 원자 연산 대응을 RVWMO와 Ztso로 비교했다.
A 확장: LR/SC, AMO, aq·rl
RISC-V 8편. A 확장의 LR/SC 예약과 실패 조건, AMO 9종, aq·rl 비트를 QEMU에서 확인했다. 하트 8개가 카운터를 경쟁하면 일반 증가는 22%만 남고 원자 방식은 모두 정확했으며, QEMU가 같은 값 재저장 뒤 sc를 성공시키는 점도 찾았다.
M 확장: 곱셈·나눗셈과 0 나누기·오버플로 규칙
RISC-V 7편. M 확장의 곱셈·나눗셈 명령어 13개와 0 나누기·오버플로의 정해진 결과(예외 없음)를 정리하고, QEMU에서 경계값 1,948개를 실행해 기준 모델과 모두 일치함을 확인했다. M이 없으면 곱셈 한 번에 명령어 86개가 더 든다.
FENCE.I와 자기 수정 코드: 명령어 쪽에서 지켜야 할 것
RISC-V 22편. FENCE.I와 자기 수정 코드를 다룬다. QEMU는 fence.i 없이도 다른 곳에 쓴 코드는 새 것을, 실행 중인 블록 안은 옛 것을 실행했다. 명령어 모델 16가지 조합으로 코어 구조별 FENCE.I 최소 구현을 확인했다.
C 확장 구현: 압축 해제기, 16비트 경계 페치, 정렬 안 된 32비트 명령어
RISC-V 21편. C 확장의 압축 해제기와 페치 버퍼를 Python으로 만들어 16비트 49,152개와 실제 rv32imc 프로그램을 objdump와 대조했다. 실행 명령어의 36.7%가 두 워드에 걸쳤고, 페치 버퍼가 워드 읽기를 33,771번에서 23,903번으로 줄였다.
A 확장 구현: LR/SC 예약 집합, AMO를 어디서 실행하나, aq·rl과 FENCE 구현
RISC-V 20편. LR/SC 예약 집합, AMO의 원자성, aq·rl과 FENCE 구현을 두 하트 모델로 비교했다. 다른 하트의 저장에 예약을 지우지 않으면 카운터가 69.6%로 줄고, QEMU는 ABA 시험에서 SC를 20번 모두 성공시켰다.
M 확장 구현: 곱셈·나눗셈기 연동, 0 나누기 결과 규칙 그대로 만들기
RISC-V 19편. M 확장 곱셈·나눗셈기를 비트 정확 Python 모델로 구현했다. 33비트 곱셈기 하나로 mulh 계열 셋을 처리하고, 30만 쌍과 QEMU 648개에서 불일치 0, 음수를 0으로 나눌 때의 함정(5,039개 불일치)을 찾았다.
작은 확장 묶음: Zicsr·Zifencei, Zicntr·Zihpm, B(Zba·Zbb·Zbs), Zicond, Zicbom
RISC-V 12편. CSR 명령어가 rd·rs1이 x0인지로 읽기·쓰기를 정하는 규칙을 QEMU에서 확인하고, B·Zicond 명령어를 RV32 2,772개, RV64 3,720개 조합으로 실행해 기준 모델과 모두 일치시켰다. B를 켜면 코드가 6.6~9.0% 줄었다.
C 확장: 압축 형식과 32비트 명령어 대응
RISC-V 11편. C 확장의 16비트 형식 9가지와 32비트 대응을 정리하고, 직접 짠 압축 해제기를 16비트 값 49,152개 전부에 대해 objdump와 대조했다. 실제 코드에서는 명령어의 51~69%가 16비트가 되어 코드가 26~34% 줄었다.
F·D 확장: FP 레지스터, 반올림 모드, fcsr 플래그, NaN boxing, 변환 규칙
RISC-V 10편. F·D 확장의 반올림 모드와 예외 플래그, 정규 NaN, NaN boxing, 범위 밖 정수 변환의 포화 규칙을 QEMU에서 명령어 229개로 실행해 분수 기준 모델과 모두 일치함을 확인했다.
V 확장 2: 마스크, 로드·스토어 종류, 축약·순열, tail·mask agnostic
RISC-V 14편. v0 마스크, 네 가지 로드·스토어, first-fault strlen, 축약·순열, ta/ma를 QEMU에서 실행했다. 커널 4개가 Python과 78항목 모두 일치했고, 명령어는 VLEN 1024에서 스칼라의 4~7%였다.
V 확장 1: VLEN·SEW·LMUL, vsetvli, 벡터 길이에 묶이지 않는 코드
RISC-V 13편. 벡터 레지스터와 VLEN·SEW·LMUL, vsetvli가 vl을 정하는 규칙을 정리했다. 같은 기계어를 QEMU VLEN 128~1024에서 돌리니 원소 100개 덧셈이 25·13·7·4번 돌았고, 명령어는 313~61개(스칼라 813개)였다.
어셈블리와 ABI: 레지스터 이름, 호출 규약, 스택 프레임, 의사 명령어, ELF
RISC-V 6편. psABI 호출 규약과 스택 프레임을 실제 C 함수로 따라갔다. work() 프레임은 80바이트, 9번째 인자부터는 스택으로 갔다. ABI별 인자 위치와 재배치를 확인했고, 링커 완화로 .text가 800바이트에서 712바이트로 줄었다.
RV64I: W 명령어, 부호 확장 규칙, 32비트와 다른 점
RISC-V 5편. RV64I의 W 명령어와 부호 확장 규칙을 QEMU로 확인했다. 0x7fffffff+1이 addw로 0xffffffff80000000이 됐고, 64비트 상수는 li로 평균 7.887개 명령어였다. 1편 utoa10이 커진 이유도 짚었다.
RV32I 3: 분기·점프, 로드·스토어와 정렬, FENCE, ECALL·EBREAK
RISC-V 4편. 분기 6종, jal·jalr, 로드 부호 확장, 정렬 안 된 접근, fence·ecall·ebreak를 QEMU에서 실행했다. jalr는 0x80000021을 0x80000020으로 바꿨고, 결과 56개가 기준 모델과 모두 일치했다.
RV32I 2: 정수 연산·비교·시프트와 lui·auipc로 상수·주소 만들기
RISC-V 3편. RV32I 정수 연산과 비교·시프트, 플래그 없는 오버플로 처리를 QEMU에서 경계값 15개로 확인하고, lui·auipc로 32비트 상수와 주소를 만드는 +1 보정을 100만 개 무작위 시험으로 따진다.
RV32I 1: 레지스터와 명령어 형식 6가지, 즉시값 비트가 뒤섞인 이유
RISC-V 2편. RV32I의 레지스터와 명령어 형식 여섯 가지를 보고, 즉시값 비트가 뒤섞인 이유를 즉시값 생성기의 선택기 입력 수(70 대 98)로 따진다. 직접 짠 인코더·디코더를 GNU as와 5,000개 대조했다.
RISC-V 개요: 명세 구성과 이름 읽기, 확장이 코드를 바꾸는 정도 재기
RISC-V 1편. 모듈식 ISA의 설계 원칙, 비특권·특권 두 권으로 나뉜 명세 구성, rv64gc 같은 이름 읽는 법을 정리하고, 같은 C 함수를 확장 조합별로 컴파일해 코드 크기가 972바이트에서 402바이트로 주는 것을 잰다.
