RISC-V · DATAPATH

ADD 다음에는 메모리와 PC를 봅니다

같은 블록도에서 데이터 이동, 쓰기 허용과 다음 명령 주소를 따로 따라가면 빠진 연결을 찾기 쉽습니다.

레지스터 파일은 배열만 있으면 끝나지 않습니다

RV32I 규격의 정수 레지스터는 32개·32비트이며 x0는 항상 0입니다. ADD x3,x1,x2는 두 입력을 더해 낮은 32비트를 x3에 기록합니다. opcode뿐 아니라 기능 비트로 연산을 구분해야 하며, x0를 목적지로 한 요청이 x0의 값을 바꾸면 안 됩니다.

설명용으로 x1=10, x2=5라면 x3=15입니다. 이 산술 예는 읽기 포트, 쓰기 시점, x0 보호와 정지 중 갱신 여부를 검증한 파형이 아닙니다. 입력에 10과 5를 넣은 화면과 실제 결과를 관측한 화면도 구분해야 합니다.

ADD·LW·SW·BEQ를 각각 추적합니다

명령계산·비교결과의 목적지다음 PC
ADD rd,rs1,rs2rs1 + rs2ALU 결과 → rdPC + 4
LW rd,imm(rs1)rs1 + 부호 확장 imm주소의 32비트 메모리 값 → rdPC + 4
SW rs2,imm(rs1)rs1 + 부호 확장 immrs2의 32비트 값 → 메모리PC + 4
BEQ rs1,rs2,offsetrs1과 rs2의 동등 비교일반 레지스터 쓰기 없음같으면 PC + offset, 아니면 PC + 4

표는 정상 완료한 32비트 기본 명령의 개념입니다. 예외·인터럽트·메모리 대기와 파이프라인 제어는 생략했습니다. 실제 구현에서 load 요청을 보냈다는 이유로 읽기 결과가 도착하기 전에 write-back해서는 안 됩니다.

자체 추적 예: x1=0x1000, x2=0x12345678일 때 SW x2,4(x1)의 주소는 0x1004입니다. 같은 주소에서 성공적으로 읽는 LW x3,4(x1)는 저장한 32비트 값을 x3에 전달합니다. 이때 주소 0x1004를 x3에 쓰면 주소 계산과 읽기 결과를 혼동한 것입니다. 실제 RAM·버스에서 실행한 예는 아닙니다.

쓰기를 허용하는 신호와 피연산자 선택은 다릅니다

교육용 설계에서 흔히 쓰는 RegWrite는 레지스터 갱신의 허용, ALUSrc는 ALU 입력 출처의 선택을 뜻합니다. 이는 설계자가 붙이는 신호 이름이며 ISA가 정한 핀 이름은 아닙니다. 메모리 쓰기 허용과 write-back 출처 선택 역시 별도 결정입니다.

SW에는 주소 계산용 ALU가 필요하지만 그 주소를 rd에 쓰는 동작은 없습니다. BEQ에도 비교는 필요하지만 산술 결과를 저장하는 명령은 아닙니다. 따라서 매 클럭마다 무조건 registers[rd] = alu_result를 수행하는 골격은 네 명령을 함께 구현하지 못합니다. 제어 출력의 파형만으로 데이터 경로 전체의 연결을 입증할 수도 없습니다.

즉시값 복원과 다음 PC 선택을 분리합니다

공식 규격은 R/I/S/U 네 기본 형식과 B/J 즉시값 변형을 설명합니다. LW의 I형과 SW의 S형은 즉시값 비트 위치가 다릅니다. B/J 오프셋은 흩어진 비트를 조합하고 부호를 확장해야 합니다. 같은 슬라이스를 모든 명령의 offset으로 쓰지 않습니다. JALR는 rs1과 부호 확장 즉시값을 더한 뒤 목표주소의 bit 0을 0으로 만듭니다.

예를 들어 현재 PC=0x100, 같은 두 레지스터와 offset=-8을 둔 BEQ는 0x0F8로 향합니다. 이 예에서 offset은 바이트 단위의 설명값이지 raw instruction 비트열이 아닙니다. opcode를 떼어 냈다는 것만으로 음수 오프셋 복원까지 확인한 것은 아닙니다.

C 확장은 16비트와 32비트 명령의 혼합 및 2바이트 명령 정렬을 허용합니다. 그러므로 16비트 명령 뒤의 순차 PC는 PC+2일 수 있습니다. 기본 RV32I의 PC+4 규칙을 모든 RISC-V 명령에 일반화하지 않습니다.

입력뿐 아니라 결과와 금지된 갱신도 봅니다

  • ADD: 실제 rd 출력, x0 쓰기 시도와 x0 읽기 결과를 함께 봅니다.
  • LW/SW: 주소·쓰기 데이터·응답과 write-back 값의 출처를 구분합니다.
  • BEQ: 같은 경우와 다른 경우, 양수·음수 offset의 다음 PC를 봅니다.
  • 정지·reset: PC와 레지스터가 유지되거나 초기화되는 조건을 따로 봅니다.

작은 배열의 주소 일부만 사용한 메모리 데모는 상위 주소가 달라도 같은 위치에 접근할 수 있습니다. 이것을 완전한 메모리맵 구현으로 읽지 않습니다. 미초기화 영역의 X 값, 잘못된 명령과 예외도 별도 시험 대상입니다. 이 항목들은 검증 계획이며 특정 교육용 RTL의 결함을 직접 재현했다는 진술이 아닙니다.

연재의 관찰 기록과 여기서 확인한 규격을 구분합니다

Krish Prasad의 Day 58 소개와 후속 연재를 정리한 인계 원고를 읽고, 위 공식 RV32I·C 규격으로 개념을 다시 구성했습니다. 원저자의 그림·PDF·파형은 다시 열지 않았습니다. 따라서 인계에 적힌 그림별 오류나 첨부 전체 판독을 이 글 편집자의 직접 관찰로 옮기지 않았습니다. RTL 빌드·실행·보드 검증을 한 글도 아닙니다.

English summary. Trace data, write enables and next-PC selection separately. ADD, loads, stores and branches need different destinations and controls. The examples are explanatory, not simulation results; original course attachments were not reopened. See ISA and RTL verification for the distinction between a test plan and observed evidence.