📕Introduction
- 컴퓨터의 성능은 3가지 요소로 결정된다.
- Instruction count : ISA와 컴파일러
- Clock Cycle time : CPU hardware에 의해 결정된다.
- Clock Cycles Per Instruction(CPI) : CPU Hardware에 의해 결정된다.
📕Basic RISC - V Implementation
- RISC - V 에는 두 가지 실행 버전이 있습니다.
- A simplified (sequntial) version
- pipelined version
- RISC - instruction set
- memory - reference instruction : load/store doubleword(LW, SW)
- The arithmetic - logical instruction : add, sub , and , or
- The conditional branch instruction : branch if equal (beq)
- 모든 인스트럭션 단계는 두 번째 단계는 동일하다.
- 코드를 포함하고 메모리로부터 인스트럭션을 fetch 한 memory에게 Program Counter(PC)를 보낸다.
- 하나 혹은 2개의 레지스터를 읽는다.
- 위의 공통된 단계가 끝나면 각자의 인스트럭션에 따라 수행하는 동작들이 다르다.
- ex) Arithmetic instructions은 두 개의 레지스터 (operation)을 수행, 1개의 레지스터(계산 결과 저장)
📕High - Level View of a RISC-V Implementation
- RISC - V의 datapath를 간략화 한 그림이다.
- data path는 PC, adder, ALU, instruction and data memory and registers를 포함한다.
📗Arithmetic instruction 실행 예
- 예를 들어 add x5, x6, x7을 실행한다고 가정할 때
- instruction fetch ( add x5, x6 , x7)
- 메모리로부터 인스트럭션을 fetch 함.
- Register access (read x6, x7)
- Addition (x6+x7)
- 계산 결과를 x5에다가 write 함.
- instruction fetch ( add x5, x6 , x7)
📗Data transfer의 예
- lw x5, 40(x6)을 실행한다고 가정할 때
- instruction fetch (lw x5, 40(x6))
- Register access ( read x6)
- memory address를 계산한다.
- 메모리를 읽는다 ( x6+40) 그리고 x5 레지스터에 data를 write 한다.
📕Conciderations on Implementation
- 이러한 실행은 두 인스트럭션의 두 가지 중요한 측면을 빠뜨린다.
- data line은 고정되어 있지 않다.
- 여러 가지 길로 들어오는데 우리는 거기서 적절한 datapath를 선정해야 한다.
- 따라서 우리는 multiplexers를 설치해서 적절한 datapath를 결정한다.
- datapath의 통제가 부족하다.
- control unit이 필요하다.
- 예를 들어서 ALU가 어떤 연산을 해야 할지 결정하는 게 control unit이다.
- data line은 고정되어 있지 않다.
📕Basic implementation of the RISC - V subset
- RISC - V 실행은 3가지 multiplexers와 컨트롤 유닛을 포함한다.
Processor = Datapath + Control
📕Logic Design Conventions
- datapath는 두 가지 타입의 논리적 elements로 구성되어 있다.
- Combinational element : An operation element ,
- 예를 들어 AND gate or an ALU
- output은 input의 실행 결과이다.
- State element : A memory element
- 예를 들어 register or memory
- 정보를 저장함.
- A state element는 적어도 2개의 인풋과 하나의 아웃풋을 가진다.
- 필요한 입력은 기록할 데이터 값과 데이터가 기록될 때를 결정하는 클럭입니다
- 출력은 이전 클럭 사이클에서 작성된 값을 제공합니다.
- Combinational element : An operation element ,
wrtie신호가 1일 때 D에다가 data를 입력하고 Clock cycle이 1일 때 입력되어있던 Data를 Q에 옮긴다.
첫 번째 구간에서는 Clock cycle과 Write 신호가 둘 다 1이라서 Data -> Q로 쓰인다.
하지만 두 번째 구간에서는 Clock cycle과 Write가 둘 다 1이 아니라서 Q로 데이터가 쓰이지 않는다.
마지막 세 번째 구간에서는 Write 신호가 먼저 1로 바뀌어서 D에 data가 쓰이는데 Clock cycle도 Write 신호가 1일 때 1로 바뀌었기 때문에 Q에 data가 쓰인다.
💡즉 wrtie 신호와 clock cycle이 둘 다 1일 때 Data -> Q로 옮겨진다.
📕Clocking Methodlogy
- A clocking methodology는 데이터를 읽고 써야 할 신호를 정의합니다.
- 우리는 edge-triggered clocking methodology를 추정합니다.
- 순차적인 논리적 element에 의해 저장된 값들이 오직 clock edge에 의해 업데이트된다는 의미입니다.
- 즉 clock edge에 의해 값들이 변경되는 것이 edge-triggered-methodology입니다.
- Combinational logic은 clock cycle 동안 data를 전송한다.
- clock cycle 사이에서 발생한다.
- state element로부터 input을 받고, output을 state element로 보낸다.
- 가장 긴 delay가 clock period를 결정합니다.
📕Building Datapath
- Datapath는 프로세서 내에서 데이터를 작동하거나 보유하는 데 사용되는 단위입니다.
- instruction과 data memories, register file, ALU, adders를 포함합니다.
- 인스트럭션을 실행하기 위해 필요한 3가지 요소
- memory : 주어진 주소에 인스트럭션을 저장하거나 제공하기 위해 저장함.
- Program Counter (PC) : 현재 실행하는 instructio의 주소를 저장합니다.
- adder : PC를 다음 명령의 주소로 증가시킨다.
- 어떠한 인스트럭션을 실행하기 위해, 우리는 인스트럭션을 메모리로부터 fetch 해야 합니다. 그리고 다음 인스트럭션에 해당하는 값으로 PC를 증가시켜줘야 합니다.
📕R-format Instruction Support
- R-format 인스트럭션은 두 개의 레지스터를 읽고, ALU 작업을 수행한다. 그리고 결과를 레지스터에 작성한다.
- ex) add , sub , and or instructions -> add x1, x2, x3
- 프로세서는 레지스터 파일이라고 불리는 구조에 32개의 레지스터를 저장한다.
- {x0, x1 ,.... x31}
- 레지스터에 숫자를 지정해서 읽거나 쓸 수 있다.
- register가 이동하는 datapath는 5bit만 할당된다.
- 왜냐하면 x0~x31까지 있기에 5bit만 할당해도 충분하게 모두 다 사용 가능하기 때문이다.
- data는 32-bit
- ALU는 두 개의 32bit input을 받아서 32-bit의 결괏값을 생산한다.
- 1-bit zero : ALU내에서 연산 결과가 0인지를 판단함.
- 4-bit ALU Operation : ALU의 연산 부호를 결정함.
📕Load/Store Instruction Support
- Load/store instructions은 base register에다가 12-bit sined offset field를 더해서 메모리 주소를 계산한다.
- lw x1, offset(x2) or sw x1, offset(x2) -> x2 : base register
- Store instruction : register 값 (x1)를 메모리에 write 한다.
- Load instruction : 메모리를 읽고, 레지스터를 업데이트한다. (x1)
- 12-bit offset은 32-bit signed value로 확장될 필요성이 있다.
- Immediate generator unit(Immgen)는 32-bit instruction을 입력으로 받고, Immgen은 12-bit field를 32-bit signed-extended value로 확장시켜준다.
📕Branch Instruction Support
- Branch instructions는 3개의 연산자를 가진다.
- 두 개의 레지스터는 동등성을 비교한다.
- A 12-bit offset은 branch target address를 계산하기 위해 사용한다.
- ex) beq x1, x2, offset
- branch target address는 pc에 sign-extend offset을 더해서 계산된다.
- offset은 1bit shift left 한다.
- branch는 짝수로만 이동 가능하기에 offset은 짝수라고 가정하고, 하나의 비트를 더 사용하기 위해 1 bit shift left 해준다.
- 1 bit shift left 하면 무조건 주소는 짝수가 될 것이다.
- offset은 1bit shift left 한다.
- branch가 true인지 false인지에 따라 pc의 값이 결정된다.
- branch is taken -> branch target address는 new PC가 된다.
- branch is not taken -> 현재 PC에 값에서 증가한 값이 new PC가 될 것이다.
📕Datapath for Branch Instruction
- Branch datapath는 두 가지 작업을 합니다.
- branch target address를 계산합니다.
- Immgen + Adder
- 레지스터의 내용을 Test -> 두 개의 레지스터를 빼서 0인지 체크하고 그 결과를 ALU에게 줌.
- branch target address를 계산합니다.
📕Creating a Single Datapath
- 가장 간단한 datapath는 당연하게도 하나의 클럭 사이클에 의해 실행되는 인스트럭션이 될 것입니다.
- 데이터 경로 리소스는 명령당 두 번 이상 사용할 수 없습니다.
- 따라서 인스트럭션과 데이터 메모리를 분리했습니다.
- Multiplexers를 둬서 여러 방향에 datapath 중에서 인스트럭션마다 적절한 datapath를 사용하게 만들었습니다.
📕Full Datapath
- 인스트럭션과 데이터 두 개의 메모리가 있습니다.
- 여기서 인스트럭션 add x5, x6, x7이 들어왔다고 가정해봅시다.
- 우선 인스트럭션 메모리에서 인스트럭션을 페치 합니다.
- 그러고 Read register 1,2에 x6, x7을 각각 넣어줍니다. 이때 datapath는 5-bit입니다. [레지스터는 5bit 할당]
- register 1,2에 있는 data를 읽어서 ALU에 전달합니다.
- 두 개의 data를 ALU에서 ALU operation에 의해서 연산을 하고 그 결과를 datamemory로 보내거나 데이터 메모리를 거치지 않고 바로 wrtie data로 넘어가서 write register인 x7에 값을 작성합니다.
- 인스트럭션의 실행이 완료되었으므로, PC + 4를 PC에 넣어줍니다.
- beq x5, x6, offset
- 인스트럭션 메모리에 인스트럭션을 페치 합니다.
- Read register 1,2에 x5, x6을 넣어줍니다.
- beq 명령어이기에 ALU에서 x5와 x6을 sub 해줍니다.
- 여기서 결과가 0이라면 zero에 신호가 가서 pc+offset 에 해당하는 값이 PC에 저장됩니다.
- 결과가 0이 아니라면 zero에 신호가 가지 않아서 기존에 진행하던 pc+4의 값이 pc에 저장됩니다.
📕ALU Control
- RISC - V의 ALU는 4개의 control input에 따라 4개의 경우의 수를 정의합니다.
ALU control lines | Function |
0000 | AND |
0001 | OR |
0010 | add |
0110 | subtract |
- 입력받은 인스트럭션에 따라 ALU는 4가지의 인스트럭션 동작을 실행합니다.
- Load and Store : ALU가 메모리 주소를 덧셈함.
- Branch : 두 개의 연산자를 뺄셈 계산하고 그것의 결과가 0인지 아닌지를 check 함.
- R-type : ALU가 instruction의 funct7과 funct3의 값에 따라 AND, OR, add, subtract 할지를 결정함.
Instruction | Format | funct7 | rs2 | rs1 | funct3 | rd | opcode |
add(add) | R | 0000000 | reg | reg | 000 | reg | 0110011 |
sub(sub) | R | 0100000 | reg | reg | 000 | reg | 0110011 |
📕ALU Control Input
- 4-bit ALU control input은 small control unit에 의해 생산된다.
- Instruction funct7 & funct3에 값에 따라 바뀜.
- ALUOP는 main control unit에 2-bit control field이다.
Instruction opcode |
ALUOP | operations | funct7 | funct3 | ALU action | ALU control input |
lw | 00 | load word | X | X | add | 0010 |
sw | 00 | store word | X | X | add | 0010 |
beq | 01 | branch if equal | X | X | sub | 0110 |
R-type | 10 | add | 0000000 | 000 | add | 0010 |
R-type | 10 | sub | 0100000 | 000 | sub | 0110 |
R-type | 10 | and | 0000000 | 111 | and | 0000 |
R-type | 10 | or | 0000000 | 110 | or | 0001 |
- 저기서 X 표시는 신경 쓸 필요 없다는 뜻이다. 굳이 저걸 보지 않아도 인스트럭션을 구별할 수 있음.
- Multi-level decoding은 main control unit의 사이즈를 줄인다.
- main control unit은 ALUOP bits를 생성한다.
- ALUOP는 ALU unit을 컨트롤하는 신호를 만드는 입력으로 사용된다.
- smaller control units는 또한 control unit의 지연성을 잠제적으로 줄여준다.
📕Truth table for ALU control
- 많은 경우의 수를 굉장히 최적화 한 테이블이다.
- 실제로 input에 따른 경우의 수는 2^12 = 4096인데 그건 너무나 많은 경우의 수가 있다.
- 그래서 특정 값을 기준으로 바로바로 최적화할 수 있다.
- 즉 ALUOP가 00이면 바로 load or store 인스트럭션이라는 것을 알 수 있다.
- ALUOP 0 값이 1이면 beq, ALUOP1 값이 1이면 R-type이고 R-type 내에서는 funct3의 field와 funct7의 field를 참고해서 결정하면 된다.
📕Designing the Main control Unit
- main control unit을 설계하기 위해서 우리는 인스트럭션의 fied와 control lines를 확인해야 합니다.
- Opcode field (6 : 0 ) -> opcode + funct3 (14:12) + funct7(31:25)
- first register operand rs1 (19:15) -> R-type and Branch
- second register operand rs2 (24:20 ) -> R-type and Branch
- The destination register rd (11:7) -> R-type and load
- 다른 operand는 12-bit offset으로 되는데 그것은 branch or load-store에 사용된다.
📕Simplifying the immGen HardWare
- RISC - V는 복잡해 보이지만 hardware적으로는 간단한 instruction foramts를 가진다.
- 이러한 점은 RISC-V 실행에서 clock cycle time을 향상해줍니다.
- 특별하게 SB와 UJ 형식은 어셈블러에게 더 많은 작업을 제공함으로써 하드웨어를 다시 한번 단순화합니다.
- RISC -V는 field의 크기가 같고 immediates가 같은 두 개의 형태가 있습니다.
- SB vs S , UJ vs J
- 두 형태가 비슷함.
📕Simplifying ImmGen Hardware(2)
- 우선 제목은 slimplifying이라고 하는데 좀 많이 복잡하고 난해한 table이 등장했다.
- 첫 번째 테이블은 SB와 UJ에게 S/U의 형태를 도입한 테이블이고, 두 번째 테이블은 SB/UJ 형태를 적용한 테이블이다.
- 그럼 두 테이블의 차이는 SB와 UJ의 field일 것이다.
- 우선 이 그림을 이해하려면 UJ타입가 SB타입의 instructions type을 알아야 이해하기 편하다.
- 왼쪽 그림은 12bit만을 사용하는 SB format이고, 오른쪽 그림은 20 bit를 사용하는 UJ format이다.
- 우선 저 테이블의 구조를 알면 이해하기 편하다.
- 위의 0~31까지는 immediate의 index?라고 이해하면 편하겠다.
- SB타입은 immedatie를 12bit 할당받는데, 0~11 bit를 사용해야 하지만, branch 이동은 address가 항상 짝수이기에 우리는 실질적으로 immediate [13:1]를 사용하므로 테이블에서도 1~13까지가 유효한 데이터가 들어가고 나머지 칸은 전부 sign-extend 한 값이다.
- UJ 타입도 SB 타입과 동일하게 원래 할당된 크기보다 1bit 더 사용할 수 있기에, immediate [20:1]까지 사용하는 것이다. 나머지 값은 sign-extend 한 값이 들어가게 된다.
- SB 테이블을 보면
- SB타입은 immediate [0]은 사용하지 않기에 table [0]은 비어있다.
- 그리고 immediate [4:1] 값은 instruction에 어느 비트에 매핑되어있는지 찾아보면 된다. 8번째 bit부터 11번째 bit가 들어가 있기에, table [1]~table [4] = i8~i11이 될 것이다.
- immediate [10:5]는 25번째 bit부터 30번째 bit이기에 table [5]~table [10] = i25~i30이 될 것이다.
- immedate [11] = table [7] 이기에 i7이 되고, immediate [12] = 31번째 bit이기에 table [12]= i31이 들어가게 되는 것이다.
- UJ 테이블
- UJ타입도 immediate [0]은 사용하지 않기에 table [0]은 비어있다.
- immediate [10:1] = 21번째 bit~ 30번째 bit 이기에 table [1]~table [11] =i21~i30
- immediate [11]= 20번째 bit라서 table [11]=i20
- immediate [19:12] = 12번째 bit~19번째 bit라서 table [12]~table [19] = i12~i19
- immediate [20]= 31번째 bit라서 table [20]= i31
- 이렇게 SB/UJ 타입을 적용시킨 Immgen hardware는 하드웨어의 복잡도를 줄여준다.
📕Datapath with Control Lines
- 데이터 경로는 인스트럭션 라벨과 필요한 모든 멀티플렉서 및 제어 신호를 추가하여 업데이트됩니다.
📕Control Signals
- 컨트롤 유닛은 명령의 opcode 및 funct 필드만을 기준으로 제어 신호 중 하나를 제외한 모든 것을 설정할 수 있습니다.
- PCSrs 컨트롤 라인은 예외입니다.
- 인스트럭션이 beq이고 ALU의 0 출력이면 PCSrc가 asserted
- Signal name
- Regwrite
- 신호가 1일 때 : write register 입력의 레지스터는 write data input으로 기록됩니다.
- 신호가 0일 때 : 아무 일 발생 x
- ALUSRc
- 신호가 1일 때 : 두 번째 ALU operand은 sign-extended 인스트럭션의 12비트입니다. -> 즉 offset임.
- 신호가 0일 때: 두 번째 ALU operand는 register 2 출력에서 나옵니다
- PCSrc
- 신호가 1일 때 : pc는 branch target을 계산하는 adder의 출력으로 대체됩니다.
- 신호가 0일 때 : pc는 pc+4의 값으로 대체된다.
- MemRead
- 신호가 1일 때 : 주소 입력에 의해 지정된 데이터 메모리 내용이 읽기 데이터 출력에 저장된다.
- 신호가 0일 때 : 아무 일 발생 x
- MemWrite
- 신호가 1일 때 : 주소 입력에 의해 지정된 데이터 메모리 내용이 Write data input으로 대체된다.
- 신호가 0일 때 : 아무일 발생 x
- MemtoReg
- 신호가 1일 때: register에 입력된 값 write data input은 데이터 메모리에서 가져옵니다
- 신호가 0일 때 : regitser에 입력된 값 write data input은 ALU에서 가져온다.
- Regwrite
📗인스트럭션 타입에 따른 Control Signals의 여부
요약
..할라햇는데 실패 ㅇㅇ
'Computer Science > Computer Architecture' 카테고리의 다른 글
[Computer Architecture] - processor(3)-[pipeline, hazard] (0) | 2022.11.19 |
---|---|
[Computer Architecture] - processor (2) (0) | 2022.11.12 |
[Computer Architecutre] - floating point (0) | 2022.10.20 |
[computer archiecture] - arithmetic_for_computers(1) (0) | 2022.10.19 |
[computer architecture]-instruction_language_of_computer(3) (0) | 2022.10.11 |