에피소드 VIII: 분기 명령어 추가하기

이제 좀 더 흥미롭게 만들기 위해 분기 명령어를 추가합니다. 분기 명령어가 있으면 블링키(blinky)를 만들 수 있습니다(야호!!). 어떻게 하는지 살펴봅시다. 회로도에서 볼 수 있듯이, 이번에는 설계를 더 크게 바꿔야 합니다.

먼저 왼쪽 부분에서, 이제 NextPC의 값은 PC+4 또는 ALU의 출력 중 하나를 고르는 멀티플렉서(mux)에서 선택됩니다. 이 mux는 술어의 결과(회로도의 오른쪽 부분)와 명령어 디코더에서 오는 새로운 신호 모두에 의해 구동됩니다. 이제 회로도의 오른쪽 부분을 보면, 술어는 레지스터 파일의 두 출력에 연결되어 있습니다. 이제 분기가 일어나면 PC는 PC + imm으로 설정되어야 합니다. 이를 위해 ALU의 가산기를 재사용합니다. 두 mux는 왼쪽에서 imm을, 오른쪽에서 PC를 선택합니다. 또한 디코더에서 오는 추가 신호(여기에는 표시되지 않음)가 op를 0(ADD를 의미함)으로 강제합니다.

이 시점까지 (9개 중) 3개의 명령어를 구현했을 뿐이지만, 이 프로세서로도 흥미로운 일을 할 수 있습니다. 아직은 메모리에 값을 저장할 수 없으므로 아무것도 출력할 수 없지만, 레지스터 중 하나에서 신호를 끌어와 LED에 연결할 수는 있습니다. 그런 다음 중첩 루프 두 개(안쪽 루프는 지연용)를 프로그래밍하여 블링키를 구현할 수 있습니다. RAM의 초기 내용을 생성하려면 GNU RISC-V 어셈블리를 사용한 다음, objcopy 명령으로 오브젝트 파일을 Verilog의 readmemh 명령이 이해할 수 있는 원시 16진수로 변환하면 됩니다. 믿기 어려우시겠지만, 직접 만든 프로세서가 GNU 어셈블리로 컴파일된 RISC-V 코드를 실행하기 시작하면, 그것이 LED 몇 개를 깜빡이는 것에 불과하더라도 환상적인 경험입니다 !

TODO: 상태 기계의 변경 사항.

TODO: 설계, 어셈블리 프로그램, 테스트 벤치 복원.

이제 완전한 RV32I 프로세서까지 6개의 명령어만 남았습니다(FENCE와 SYSTEM은 제외하지만, 이것들 없이도 괜찮습니다). 제가 즐겨 부르는 이름대로 하자면 "이상한 명령어" 네 개를 구현해야 합니다. 사실 그렇게 이상하지는 않으며, 구현하기도 쉽습니다. 그런 다음 load와 store의 여러 변형을 구현해야 합니다(이쪽이 더 어렵습니다).

다음