에피소드 X: load 및 store 명령어 추가하기

거의 다 왔습니다! 하지만 load와 store를 추가하려면 설계에 상당히 많은 부분을 더해야 합니다. 쉬운 부분인 명령어 디코더부터 시작합시다. isLoad와 isStore라는 두 개의 신호를 추가로 생성합니다. 큰 switch 문에 두 가지 경우가 더 추가됩니다:

           7'b0000011: begin // Load
          writeBackEn = 1'b1;     // enable write back
          writeBackSel = 4'b0100; // write back source = RAM
          aluInSel1 = 1'b0;       // ALU source 1 = reg
          aluInSel2 = 1'b1;       // ALU source 2 = imm
          aluSel = 1'b0;          // ALU op = ADD
          imm = Iimm;             // imm format = I
          isLoad = 1'b1;
       end
     
           7'b0100011: begin // Store
          writeBackEn = 1'b0;     // disable write back
          writeBackSel = 4'bxxxx; // write back sel = don't care
          aluInSel1 = 1'b0;       // ALU source 1 = reg
          aluInSel2 = 1'b1;       // ALU source 2 = imm
          aluSel = 1'b0;          // ALU op = ADD
          imm = Simm;             // imm format = S
          isStore = 1'b1;
       end

모든 것은 이 회로도에 나온 대로 연결됩니다. 새로운 메모리 접근 서브시스템이 있습니다. 레지스터 write-back용 mux에 새 경로(읽은 메모리 데이터, read mem data)가 추가됩니다. 그다음에는 전선 두 개만 그리면 됩니다. 하나는 두 번째 레지스터 출력에서 쓸 메모리 데이터(written mem data)로, 다른 하나는 ALU 출력에서 메모리 주소(mem address)로 연결합니다. 읽기(읽은 메모리 데이터, read mem data)와 쓰기(쓸 메모리 데이터, write mem data)에 서로 다른 전선을 사용한다는 점에 유의하십시오. 하나의 양방향 데이터 버스 대신 두 개의 단방향 데이터 버스를 사용합니다.

한 가지 어려움이 남아 있습니다. 명령어를 읽을 때와 데이터를 읽을 때 같은 선을 사용한다는 점입니다. 명령어는 instr 레지스터로, 데이터는 레지스터 라이트백으로 어떻게 보낼 수 있을까요? 이를 처리하려면 유한 상태 기계가 비트 수준에서 조금 더 복잡해집니다.

다음 편에 계속됩니다.