Posts / 태그
#qemu
11편
즉시값 생성기와 RISC-V 단일 사이클 데이터패스
RISC-V 16편. 2편의 선택기 표를 즉시값 생성기 회로로 옮기고 단일 사이클 데이터패스를 조립했다. 프로그램 5개, 명령어 1,076,364개를 실행해 QEMU와 pc 열·레지스터가 모두 같았고, 분기가 20.0%(그중 58.5% taken)였다.
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 최소 구현을 확인했다.
A 확장 구현: LR/SC 예약 집합, AMO를 어디서 실행하나, aq·rl과 FENCE 구현
RISC-V 20편. LR/SC 예약 집합, AMO의 원자성, aq·rl과 FENCE 구현을 두 하트 모델로 비교했다. 다른 하트의 저장에 예약을 지우지 않으면 카운터가 69.6%로 줄고, QEMU는 ABA 시험에서 SC를 20번 모두 성공시켰다.
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개)였다.
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만 개 무작위 시험으로 따진다.
RISC-V