6 minute read

Review R-TYPE Instruction + Sequential Elements

  • assembly instruction만 보고 어떻게 동작하는지에 대해 배웠다.
  • 왜 Program counter라고 부를까? -> instructino이 위치하는 주소가 현재로부터 몇 byte 떨어진 곳일까? -> 4byte 왜냐하면 instruction 단위가 4byte이기 때문이다.
  • instruction이 4단위다.
  • data memory는 실제 memory가 아니라 실체가 instruction이다.
  • instruction이 주어졌을 때 가장 먼저 까봐야 하는 것은 opcode다. 왜냐하면 instruction의 종류를 파악해야 하기 때문이다. r format, i format, s format, sb format 등을 판단해야 한다. 우리는 이 4가지만 배웠다.
  • 왜 r field는 5bits일까? -> register의 개수가 32니까.
  • A[20]를 얻기 위해서는 index를 주면 된다.
  • register file이라 한다.
  • Arthimetical Logical Unit에 우리가 아는 대부분의 연산이 들어간다.
  • 나중에는 full carry adder를 carry가 항상 있기 때문에 cycle delay가 생기기 때문에 못 쓴다.
  • 하드웨어가 커지면 뭐가 안 좋을까? -> 요즘 5나노 하는 것은 transister가 작아지는 것이다.
  • 곱셈을 덧셈으로 하면 왜 안 될까? -> 전력 소비가 커져서 발열이 심하다. 발열을 없앨 수 있는 방법을 선택해야 한다.
  • power consumsion은 동작 주파수에 비레한다. clock
  • clock의 필요성을 이해해야 교수가 alu에서 멈춰서 오래 설명하는지 알 수 있다.
  • data path가 어떤 순서로 수행될까?
  • 데이터를 표현하는 전자들은 물이 흐르듯 흘러간다.
  • 1000번에 해당하는 연산이 수행된 후에 1004번지에 해당하는 연산이 자동으로 수행된다.
  • rs1: 1020이라 하자.
  • 물길을 막고 있다가 원하는 시점에 수행하도록 하는 것이 필요하다. 그래서 클락이 필요한 것이다.

  • 1000번이 처리되고 1004번이 바로 실행되지 않는다. pc는 다운 사이클마다 실행을 하라고 명령을 줄 것이다. 다음 사이클에 수행될 것이다.
  • 작은 전파 지연이 있기 때문에 작은 시간이 필요하다.
  • read only일 때는 현재 상태를 바꾸지 않기 때문에 신경쓰지 않아도 된다. write가 문제다.
  • write의 대상은 register이기 때문에 무언가를 저장할 수 있는 소자는 flipflop밖에 없기 때문에
  • 끊임 없이 흘러가는 데이터 flow 물길이다. 물길을 제어하는 ff이 있다.
  • 제어하는 부분을
  • processor가 다른 것보다 재밌는 것은 프로그램에 의해 제어 방식을 바꿀 수 있다는 것이다.

Load Instruction

  • Encoding은 왜 복잡할까? 왜 연속적으로 넣지 않았을까? -> 사람이 보기 편한 것보다 컴퓨터가 처리하기 쉽게 만들기 위해서다.
  • instrction[19-15], [24-20], [11-7]이 부분은 축약된 게 아닐 것이다.
  • 이 부분은 모든 명령어서 일치한다.
  • rs2에 해당하는 instuction은 어디로 들어갈까?
  • instuction [24-20]으로 들어가는 값은 의미 없는 0이 들어간다. 해당하는 것이 없기 때문에 회색으로 표현된 것이다.
  • 이것을 어떻게 무시할까? Read data2로 나올 텐데 이것을 어떻게 무시될까?
  • ALU
  • 하드웨어가 어떻게 동작한다라는 것을 설명했다.
  • load는 data memory를 사용하는 데 ALU는 어떤 목적으로 사용할까? -> ALU도 base address와 offset을 더할 때 덧셈을 사용한다.
  • 그러면 data memory에서는 address가 튀어나온다. 그리고 이것을 rd에 적재한다. write data로 들어간다.
  • 회색은 MUX(Multiplex: 여러 개 중 하나를 선택하는 것)에 의해 걸러진다.
  • ALUSrc라 하자.
  • Immediate generation이라 읽으면 된다.
  • 우리가 배우는 64비트 프로세서를 사용한다. register의 길이는 32bits다.
  • 주어진 immediate에서 남는 부분을 0으로 초기화하는 것이 일반적일 것 같지만 sign bits
  • most sign bit로 채우는 것이 맞는 것일 수 있다.
  • Q. ..
  • r format에서는 rs2는 사용하지 않는다. 그렇다고 하드웨어를 바꿀 수 없다.
  • 그렇게 입력받도록 할 것이다.
  • read는 허용하면 무언가가 튀어나온다. 대신 애는 mux에 의해 선택되지 않고 240이 선택된다.
  • mux에 의해 선택받으면 240이 alu로 간다.
  • i format일 때는 위에 것이 선택되어야 하고 r format일 때는 아래 것만 선택되어야 한다.
  • alu로 들어가는 물길이 두 개가 있는데 control signal을 통해 조절한다.
  • 0으로 채우기 vs sign extension 채우기…….?
  • msb sign bit로
  • 4비트로 준 immediate field를 만들었ㄷㅏ…
  • 8비트로 표현되었으면
  • 5 + (-3) = 2
  • msb만 extension….
  • 모든 숫자가 -면
  • -3
  • 0011 -> 1100 -> 1101

  • -3인 1101을 1111 1101

  • 32비트가 들어가면 해당하는 12비트만 거른다.
  • Immediate generator는 opcode를 보고 control처럼 동작한다. 이렇게 잘라야 원하는 비트가 나온다.
  • base address와 offset을 더해서 얻을 게 ALU result로 간다.
  • 그것을 Read data port에 올려준다.
  • 한 번더 mux를 거친다. 왜냐하면
  • 여기서만 왜 1 0일까? memToGeg이라는 이름을 썼기 때문이다.
  • register file에는 갱신하는 애와 읽는 애가 따로 있다. Reg Write은 register에 값을 갱신하는 instruction이다.
  • 즉 rd를 사용한다.
  • 결과를 로딩한다는 것은 rd에 로딩을 한다는 것이다.
  • rd가 없는 instructiond은 garbage값을 무시헤야 한다.

  • Q. Immdiate Generator에 들어가는 것이 왜 Instuction [31-25]가 아닌지
  • A. instruction foramt마다 Immediate의 위치가 다르기 때문에 전체를 받아서 opcode에 따라 선별해낸다.
  • Q. Garbage에 들어가는 값은 무엇인지
  • A. instruction type마다 format이 다르기 때문에 전체를 받은 후에 opcode에 따라 해당하지 않는 부분을 걸러낸다.
  • Q. 프로세서는 64bits인데 register는 32bits면 남는 32bits는 어느 자리에 무엇으로 채워지는가?
  • A. register의 개수가 32개일 뿐이고 각 register의 크기는 64bits이다. 그래서 프로세서도 64bits인 것이다.

  • 하드웨어가 wire로 연결되었기 때문에 물길이라고 표현했다.
  • 조합회로는 새로운 물을 만들어내고 register만 물길을 막을 수 있다.
  • 1000번지에 해당하는 decoding과 연산을 한다.
  • pc에서 보면 위 add와 Instruction memory는 병렬 연결이다. 위 add는 밑의 Instruction memory보다 먼저 끝나지만 바로 실행되지 않지만 클락이 있기 때문에 밑의 과정이 끝날 때까지 기다린다.
  • 밑의 과정을 보고 cycle time을 정했을 거라 밑의 내용이 안전하게 유지된다.
  • 물인데 왜 쓰레기라고 필요할까? -> Immediate이 궁금한데 rs2를 의미하는 것이어서 관심 밖이기 때문에 그렇다.
  • rs1, rs2는 값이 아니라 index다. 몇 번 열쇠 주세요.(주소와 개념상 동일하지만 register에서는 index라고 부른다.)
  • 여기서는 CPI가 없다.
  • 한 명령어당 한 사이클이다.
  • Q. Instuction을 불러와서 한 사이클 동안 Instruction을 유지해야 하는데 Instruction 안에 register가 따로 있느냐?
  • A. 1000이 계속 인가되고 있다면 한 번만 로딩하도록 하는 것이 있지 않을까? 바뀐 것이 없다면 유지하고 있을 것 같다. 큰 비용은 아닐 것이다. 전력면에서 의미가 있을 것 같다. And gate를 주고 0을 주면 무조건 0이 나온다. 0일 때는 어떤 일을 안 하겠다. 우리는 gate 없이 중복적인 읽기를 하고 있다고 생각하면 된다.
  • Q. func3나 func7는 control에 전달되어야 하지 않는가?
  • A. ALU control에서는 이런 것들이 다 들어간다. opcode에서 큰 연산은 결정해서 ALU에서 결정되지만 세부적인 것에 해당하는 func에 해당하는 것은 ALU control에 들어가서 올바른 결론이 나오도록 한다.
  • Q. Immediate에서 왜 32비트를 통채로 받냐?
  • A. Immediate가 어느 위치에 있든 다 받아라.
  • Q. 64bits 프로세서라고 하면 무엇은 64bits일까?
  • A. register와 instruction은 64bits다.

Store Instuction(RISC-V)

  • 빨간색 숫자는 random하게 만든 예제다.
  • x10에 담긴 값이 1000이라고 가정하는 것이다.
  • 회색이 load기준이다. 출판사에서 제공하는 자료에서 save에 해당하는 내용이 없어서 다시 만들다보니 이렇게 되었다. 회색 부분은 load 기준이라 여기서는 의미가 있다.
  • 두 가지 연산을 하도록 하려면 control bits가 1비트 있어야 한다. 왜 2bits를 줘서 서로 다른 4가지 control하도록 했을까?
  • 둘 다 0이면 아무것도 안 하도록 하기 위해서다.
  • memory write와 read가 둘 다 있으니까.
  • instruction memory는 그런 기능이 없는데 여기서는 있다.
  • 둘 다 11일 때는 정의가 되지 않는다. 세 가지를 나타내기 위해서 2bits가 필요했던 것이기 때문에 11일 때는 정의되지 않는다.
  • data path를 이해하고 그 내부는 나중에 배운다.
  • RegWrite은 memory에서 쓰는 것이 아니라 register에서 쓰는 것이기 때문에 store에서는 쓸 일이 없다. 0
  • register의 값이나 instuction의 값이냐를 선택할 때 …
  • ALU는 store였다면 addition을 해야 한다.
  • ALU에서 zero는 branch를 보고 taken을 만드는 것이라 …
  • MemWrite = 1 (유일하게 store에서만 1이고 나머지에서는 0이다.)
  • MemRead = 0
  • MemtoReg = don’t care. 하드웨어가 편한 값으로 해라. 합성기에서 더 편한 값이 된다. MemtoReg는 관심이 없다. MemWrite은 하지 않기 때문에 어디에 Write할래라는 질문은 의미가 없다.
  • 항상 MemWrite = 0 -> MemtoReg = x(don’t care)
  • Branch는 Branch instruction일 때를 제외하고는 0이다.

Branch Instructions

  • rs1 - rs2 = 0 -> 같다.
  • rs1 - rs2 != 0 -> 다르다.
  • 0라는 signal은 같을 때 드는 flag다.
  • ALU result는 사용하지 않는다.(?)
  • 분기를 할 때 뭐가 필요할까? -> 분기할 주소가 필요하다. pc 값에 넣어줘야 분기 대상이 되는 곳으로 갈 수 있다.
  • 알 수 있는 것들이 정말 많다. 어짜피 하드웨어는 물길을 없애는 것보다 그것이 더 편리하다.
  • 일정 순간에 PC의 값이 들어가도록 해야 한다.
  • 같으면 flag가 0이다.
  • zero port가 깃발을 든다.
  • and gate를 거쳐 둘다 1일때만 진행
  • branch가 아니거나 맞더라도 equal이 아니었다면 4를 더한다.
  • Q. offset을 저장했을 때
  • target address는 12bits로 되어 있다.
  • Immediate generator에서 나온 것에 x2를 하고 있다.
  • 앞에서 %2를 했기 때문이다. 2장에서 보면 branch encoding을 하면서 x2(? %2)를 했다. (얼마나 떨어져 있는지 판단할 때 최대한 큰 단위로 해야 좋다.)
  • Q. alu result에서는 어떤 일이 벌어져?
  • -111
  • zero port는 0
  • 값이 0일 때 1을 반환한다. 값이 0라고 0이 나가는 것이 아니다.
  • zero port의 의미는 event flag다.
  • beq에 특화된 회로다.
  • bne에서는 not gate를 이용하면 된다.
  • pc -relate addressing이기 때문에 pc와 더하는 것이다. 절대 주소는 모른다.
  • regWrite = 0
  • ALUSrc = 0 -> rs2를 선택한다.
  • Immediate 값은 무조건 사용된다. 계속 쓰레기가 나오고 있지만 0이 나오고 있기 때문에 상관 없다. pc 4를 선택하고 있기 때문에
  • beq의 조건이 만족되었을 때 성공적으로 진행된다.
  • memoryWrite = 0, memRead = 0
  • Value operation 은 뺄셈
  • MIPS는 %4를 했었기 때문에 x4를 한다.
  • branch instruction이 위치한 현재 위치
  • MIPS의 부족한 것을 RISC에서 보안했다.
  • MIPS와 비교하시오 이런 문제 안 나온다.

R

  • ALUsrc = 0
  • ALUop = 지정한 연산
  • 4.4는 skip한다. ALU control은 안 한다.
  • MemWrite = 0
  • MemRead = 0
  • MemtoReg = 0
  • branch = 0

L

  • RegWrite = 1
  • ALUSrc = 1 -> rs2 없어
  • ALUop = 덧셈
  • MemWrite = 0
  • MemRead = 1 (인 유일한 instruction)
  • MemtoReg = 1 (유일)

Store

  • RegWrite = 0
  • ALUSrc = 1 (rs2를 쓰지만 immediate을 쓰기 때문에)
  • Store일 때 의미 있게 사용한다.
  • MemtoReg = don’t care
  • Branch = 0

시험 범위

Tags:

Categories: ,

Updated: