Multi Cycle CPU Jason Mars Monday, February 4, 13 Why a Multiple - - PowerPoint PPT Presentation

multi cycle cpu
SMART_READER_LITE
LIVE PREVIEW

Multi Cycle CPU Jason Mars Monday, February 4, 13 Why a Multiple - - PowerPoint PPT Presentation

Multi Cycle CPU Jason Mars Monday, February 4, 13 Why a Multiple Cycle CPU? Monday, February 4, 13 Why a Multiple Cycle CPU? The problem => single-cycle cpu has a cycle time long enough to complete the longest instruction in the machine


slide-1
SLIDE 1

Multi Cycle CPU

Jason Mars

Monday, February 4, 13

slide-2
SLIDE 2

Why a Multiple Cycle CPU?

Monday, February 4, 13

slide-3
SLIDE 3

Why a Multiple Cycle CPU?

  • The problem => single-cycle cpu has a cycle time long enough to complete

the longest instruction in the machine

Monday, February 4, 13

slide-4
SLIDE 4

Why a Multiple Cycle CPU?

  • The problem => single-cycle cpu has a cycle time long enough to complete

the longest instruction in the machine

  • The solution => break up execution into smaller tasks, each task taking a

cycle, different instructions requiring different numbers of cycles or tasks

Monday, February 4, 13

slide-5
SLIDE 5

Why a Multiple Cycle CPU?

  • The problem => single-cycle cpu has a cycle time long enough to complete

the longest instruction in the machine

  • The solution => break up execution into smaller tasks, each task taking a

cycle, different instructions requiring different numbers of cycles or tasks

  • Other advantages => reuse of functional units (e.g., alu, memory)

Monday, February 4, 13

slide-6
SLIDE 6

Why a Multiple Cycle CPU?

  • The problem => single-cycle cpu has a cycle time long enough to complete

the longest instruction in the machine

  • The solution => break up execution into smaller tasks, each task taking a

cycle, different instructions requiring different numbers of cycles or tasks

  • Other advantages => reuse of functional units (e.g., alu, memory)

Monday, February 4, 13

slide-7
SLIDE 7

Why a Multiple Cycle CPU?

  • The problem => single-cycle cpu has a cycle time long enough to complete

the longest instruction in the machine

  • The solution => break up execution into smaller tasks, each task taking a

cycle, different instructions requiring different numbers of cycles or tasks

  • Other advantages => reuse of functional units (e.g., alu, memory)
  • ET = IC * CPI * CT

Monday, February 4, 13

slide-8
SLIDE 8

High Level View

Monday, February 4, 13

slide-9
SLIDE 9

Breaking Execution into Clock Cycles

  • We will have five execution steps (not all instructions use all five)
  • fetch
  • decode & register fetch
  • execute
  • memory access
  • write-back
  • We will use Register-Transfer-Language (RTL) to describe these steps

Monday, February 4, 13

slide-10
SLIDE 10

Breaking Execution into Clock Cycles

Monday, February 4, 13

slide-11
SLIDE 11

Breaking Execution into Clock Cycles

  • Introduces extra registers when:
  • Signal is computed in one clock cycle and used in another, AND
  • The inputs to the functional block that outputs this signal can change

before the signal is written into a state element.

Monday, February 4, 13

slide-12
SLIDE 12

Breaking Execution into Clock Cycles

  • Introduces extra registers when:
  • Signal is computed in one clock cycle and used in another, AND
  • The inputs to the functional block that outputs this signal can change

before the signal is written into a state element.

  • Significantly complicates control. Why?

Monday, February 4, 13

slide-13
SLIDE 13

Breaking Execution into Clock Cycles

  • Introduces extra registers when:
  • Signal is computed in one clock cycle and used in another, AND
  • The inputs to the functional block that outputs this signal can change

before the signal is written into a state element.

  • Significantly complicates control. Why?
  • The goal is to balance the amount of work done each cycle.

Monday, February 4, 13

slide-14
SLIDE 14

Multi-Cycle Datapath

Monday, February 4, 13

slide-15
SLIDE 15

Multi-Cycle Datapath

  • More Latches

Monday, February 4, 13

slide-16
SLIDE 16

Multi-Cycle Datapath

  • More Latches
  • One ALU

Monday, February 4, 13

slide-17
SLIDE 17

Multi-Cycle Datapath

  • More Latches
  • One ALU
  • One Memory Unit

Monday, February 4, 13

slide-18
SLIDE 18
  • 1. Fetch

IR = Mem[PC] PC = PC + 4 (may not be final value of PC)

Monday, February 4, 13

slide-19
SLIDE 19
  • 2. Instruction Decode and Register Fetch

A = Reg[IR[25-21]] B = Reg[IR[20-16]] ALUOut = PC + (sign-extend (IR[15-0]) << 2)

Monday, February 4, 13

slide-20
SLIDE 20
  • 2. Instruction Decode and Register Fetch
  • compute target before we know if it will be used

(may not be branch, branch may not be taken)

A = Reg[IR[25-21]] B = Reg[IR[20-16]] ALUOut = PC + (sign-extend (IR[15-0]) << 2)

Monday, February 4, 13

slide-21
SLIDE 21
  • 2. Instruction Decode and Register Fetch
  • compute target before we know if it will be used

(may not be branch, branch may not be taken)

  • ALUOut is a new state element (temp register)

A = Reg[IR[25-21]] B = Reg[IR[20-16]] ALUOut = PC + (sign-extend (IR[15-0]) << 2)

Monday, February 4, 13

slide-22
SLIDE 22
  • 2. Instruction Decode and Register Fetch
  • compute target before we know if it will be used

(may not be branch, branch may not be taken)

  • ALUOut is a new state element (temp register)
  • everything up to this point must be Instruction-

independent, because we still haven’t decoded the instruction.

A = Reg[IR[25-21]] B = Reg[IR[20-16]] ALUOut = PC + (sign-extend (IR[15-0]) << 2)

Monday, February 4, 13

slide-23
SLIDE 23
  • 2. Instruction Decode and Register Fetch
  • compute target before we know if it will be used

(may not be branch, branch may not be taken)

  • ALUOut is a new state element (temp register)
  • everything up to this point must be Instruction-

independent, because we still haven’t decoded the instruction.

  • everything instruction (opcode)-dependent from here
  • n.

A = Reg[IR[25-21]] B = Reg[IR[20-16]] ALUOut = PC + (sign-extend (IR[15-0]) << 2)

Monday, February 4, 13

slide-24
SLIDE 24
  • 3. Execution, Memory Address Computation, or

Branch Completion

  • Memory reference (load or store)
  • ALUOut = A + sign-extend(IR[15-0])
  • R-type
  • ALUout = A op B
  • Branch
  • if (A == B) PC = ALUOut

At this point, Branch is complete, and we start over;

  • thers require more cycles.

Monday, February 4, 13

slide-25
SLIDE 25
  • 4. Memory access or R-type completion
  • Memory reference (load or store)
  • Load
  • MDR = Mem[ALUout]
  • Store
  • Mem[ALUout] = B
  • R-type
  • Reg[IR[15-11]] = ALUout

R-type is complete, store is complete.

Monday, February 4, 13

slide-26
SLIDE 26
  • 5. Memory Write-Back

Reg[IR[20-16]] = MDR

load is complete

Monday, February 4, 13

slide-27
SLIDE 27

Summary of Execution Steps

Step R-type Memory Branch Instruction Fetch IR = Mem[PC] PC = PC + 4 Instruction Decode/ register fetch A = Reg[IR[25-21]] B = Reg[IR[20-16]] ALUout = PC + (sign-extend(IR[15-0]) << 2) Execution, address computation, branch completion ALUout = A op B ALUout = A + sign- extend(IR[15-0]) if (A==B) then PC=ALUout Memory access or R- type completion Reg[IR[15-11]] = ALUout memory-data = Mem[ALUout]

  • r

Mem[ALUout]= B Write-back Reg[IR[20-16]] = memory-data

Monday, February 4, 13

slide-28
SLIDE 28

Complete Multi-Cycle Datapath

Monday, February 4, 13

slide-29
SLIDE 29

Complete Multi-Cycle Datapath

New Instruction Appears Out of Nowhere? Which One?

Monday, February 4, 13

slide-30
SLIDE 30
  • 1. Instruction Fetch

IR = Memory[PC] PC = PC + 4

Monday, February 4, 13

slide-31
SLIDE 31
  • 1. Instruction Fetch

IR = Memory[PC] PC = PC + 4

Monday, February 4, 13

slide-32
SLIDE 32
  • 1. Instruction Fetch

IR = Memory[PC] PC = PC + 4

Monday, February 4, 13

slide-33
SLIDE 33
  • 1. Instruction Fetch

IR = Memory[PC] PC = PC + 4

Monday, February 4, 13

slide-34
SLIDE 34
  • 2. Instruction Decode and Register Fetch

A = Register[IR[25-21]] B = Register[IR[20-16]] ALUOut = PC + (sign-extend (IR[15-0]) << 2)

Monday, February 4, 13

slide-35
SLIDE 35
  • 2. Instruction Decode and Register Fetch

A = Register[IR[25-21]] B = Register[IR[20-16]] ALUOut = PC + (sign-extend (IR[15-0]) << 2)

Monday, February 4, 13

slide-36
SLIDE 36
  • 2. Instruction Decode and Register Fetch

A = Register[IR[25-21]] B = Register[IR[20-16]] ALUOut = PC + (sign-extend (IR[15-0]) << 2)

Monday, February 4, 13

slide-37
SLIDE 37
  • 2. Instruction Decode and Register Fetch

A = Register[IR[25-21]] B = Register[IR[20-16]] ALUOut = PC + (sign-extend (IR[15-0]) << 2)

Monday, February 4, 13

slide-38
SLIDE 38
  • 3. Execution (R-Type)

ALUout = A op B

Monday, February 4, 13

slide-39
SLIDE 39
  • 3. Execution (R-Type)

ALUout = A op B

Monday, February 4, 13

slide-40
SLIDE 40
  • 4. R-Type Completion

Reg[IR[15-11]] = ALUout

Monday, February 4, 13

slide-41
SLIDE 41
  • 4. R-Type Completion

Reg[IR[15-11]] = ALUout

Monday, February 4, 13

slide-42
SLIDE 42
  • 4. R-Type Completion

Reg[IR[15-11]] = ALUout

Monday, February 4, 13

slide-43
SLIDE 43
  • 3. Branch Completion

if (A == B) PC = ALUOut

Monday, February 4, 13

slide-44
SLIDE 44
  • 3. Branch Completion

if (A == B) PC = ALUOut

Monday, February 4, 13

slide-45
SLIDE 45
  • 3. Branch Completion

if (A == B) PC = ALUOut

Monday, February 4, 13

slide-46
SLIDE 46
  • 4. Memory Address Computation

ALUout = A + sign-extend(IR[15-0])

Monday, February 4, 13

slide-47
SLIDE 47
  • 4. Memory Address Computation

ALUout = A + sign-extend(IR[15-0])

Monday, February 4, 13

slide-48
SLIDE 48
  • 4. Memory Address Computation

ALUout = A + sign-extend(IR[15-0])

Monday, February 4, 13

slide-49
SLIDE 49
  • 4. Memory Access Load

memory-data = Memory[ALUout]

Monday, February 4, 13

slide-50
SLIDE 50
  • 4. Memory Access Load

memory-data = Memory[ALUout]

Monday, February 4, 13

slide-51
SLIDE 51
  • 4. Memory Access Load

memory-data = Memory[ALUout]

Monday, February 4, 13

slide-52
SLIDE 52
  • 4. Memory Access Store

Memory[ALUout] = B

Monday, February 4, 13

slide-53
SLIDE 53
  • 4. Memory Access Store

Memory[ALUout] = B

Monday, February 4, 13

slide-54
SLIDE 54
  • 4. Memory Access Store

Memory[ALUout] = B

Monday, February 4, 13

slide-55
SLIDE 55
  • 5. Load Write-Back

Reg[IR[20-16]] = memory-data

Monday, February 4, 13

slide-56
SLIDE 56
  • 5. Load Write-Back

Reg[IR[20-16]] = memory-data

Monday, February 4, 13

slide-57
SLIDE 57
  • 5. Load Write-Back

Reg[IR[20-16]] = memory-data

Monday, February 4, 13

slide-58
SLIDE 58
  • 3. Jump Completion

PC = PC[31-28] | (IR[25-0] <<2)

Monday, February 4, 13

slide-59
SLIDE 59
  • 3. Jump Completion

PC = PC[31-28] | (IR[25-0] <<2)

Monday, February 4, 13

slide-60
SLIDE 60

What About the Control?

  • Single-cycle control used combinational logic
  • What does Multi-cycle control use?
  • FSM defines a succession of states, transitions between states (based on

inputs), and outputs (based on state)

  • First two states same for every instruction, next state depends on opcode

Monday, February 4, 13

slide-61
SLIDE 61

Multi-Cycle Control

Instruction fetch Decode and Register Fetch Memory instructions R-type instructions Branch instructions Jump instruction

start

Monday, February 4, 13

slide-62
SLIDE 62

Multi-Cycle Control

MemRead ALUSrcA = 0 IorD = 0 IRWrite ALUSrcB = 01 ALUOp = 00 PCWrite PCSource = 00

?

Memory Inst FSM R-type Inst FSM Branch Inst FSM Jump Inst FSM Instruction Fetch, state 0 Instruction Decode/ Register Fetch, state 1 O p c

  • d

e = L W

  • r

S W Opcode = R-type Opcode = BEQ Opcode = JMP Start

Monday, February 4, 13

slide-63
SLIDE 63

Multi-Cycle Control - The Full FSM

Monday, February 4, 13

slide-64
SLIDE 64

Multi-Cycle Control - The Full FSM

Which type of instruction is the slowest?

Monday, February 4, 13

slide-65
SLIDE 65

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

Monday, February 4, 13

slide-66
SLIDE 66

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5

Monday, February 4, 13

slide-67
SLIDE 67

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5

Monday, February 4, 13

slide-68
SLIDE 68

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3

Monday, February 4, 13

slide-69
SLIDE 69

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3 4

Monday, February 4, 13

slide-70
SLIDE 70

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3 4 4

Monday, February 4, 13

slide-71
SLIDE 71

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3 4 4

21

Monday, February 4, 13

slide-72
SLIDE 72

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3 4 4

21 16

Monday, February 4, 13

slide-73
SLIDE 73

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3 4 4

21 16 .2*(5) +

Monday, February 4, 13

slide-74
SLIDE 74

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3 4 4

21 16 .2*(5) + .1*(4) +

Monday, February 4, 13

slide-75
SLIDE 75

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3 4 4

21 16 .2*(5) + .1*(4) + .5*(4) +

Monday, February 4, 13

slide-76
SLIDE 76

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3 4 4

21 16 .2*(5) + .1*(4) + .5*(4) + .2*(3) =

Monday, February 4, 13

slide-77
SLIDE 77

Some Juicy Questions

  • How many cycles will it take to execute this code?
  • Whats going on during the 8th cycle of execution?
  • In what cycle does the actual addition of $t2 and $t3 take place?
  • Assume 20% loads, 10% stores, 50% R-type, 20% branches, what is the

CPI?

lw $t2, 0($t3) lw $t3, 4($t3) beq $t2, $t3, Label #assume not taken add $t5, $t2, $t3 sw $t5, 8($t3) Label: ...

5 5 3 4 4

21 16 .2*(5) + .1*(4) + .5*(4) + .2*(3) = 4

Monday, February 4, 13

slide-78
SLIDE 78

Multi-Cycle Key Points

Monday, February 4, 13

slide-79
SLIDE 79

Multi-Cycle Key Points

  • Performance gain achieved from variable-length instructions

Monday, February 4, 13

slide-80
SLIDE 80

Multi-Cycle Key Points

  • Performance gain achieved from variable-length instructions
  • ET = IC * CPI * cycle time

Monday, February 4, 13

slide-81
SLIDE 81

Multi-Cycle Key Points

  • Performance gain achieved from variable-length instructions
  • ET = IC * CPI * cycle time
  • Required very few new state elements

Monday, February 4, 13

slide-82
SLIDE 82

Multi-Cycle Key Points

  • Performance gain achieved from variable-length instructions
  • ET = IC * CPI * cycle time
  • Required very few new state elements
  • More, and more complex, control signals

Monday, February 4, 13

slide-83
SLIDE 83

Multi-Cycle Key Points

  • Performance gain achieved from variable-length instructions
  • ET = IC * CPI * cycle time
  • Required very few new state elements
  • More, and more complex, control signals
  • Control requires FSM

Monday, February 4, 13

slide-84
SLIDE 84

Exceptions

Monday, February 4, 13

slide-85
SLIDE 85

Exceptions

  • There are two sources of non-sequential control flow in a processor
  • explicit branch and jump instructions
  • exceptions
  • Branches are synchronous and deterministic
  • Exceptions are typically asynchronous and non-deterministic
  • Guess which is more difficult to handle?

(control flow refers to the movement of the program counter through memory)

Monday, February 4, 13

slide-86
SLIDE 86

Exceptions and Interrupts

Monday, February 4, 13

slide-87
SLIDE 87

Exceptions and Interrupts

  • The terminology is not consistent, but we’ll refer to
  • Exceptions as any unexpected change in control flow
  • Interrupts as any externally-caused exception

Monday, February 4, 13

slide-88
SLIDE 88

Exceptions and Interrupts

  • The terminology is not consistent, but we’ll refer to
  • Exceptions as any unexpected change in control flow
  • Interrupts as any externally-caused exception
  • So what is...
  • arithmetic overflow
  • divide by zero
  • I/O device signals completion to CPU
  • user program invokes the OS
  • memory parity error
  • illegal instruction
  • timer signal

Monday, February 4, 13

slide-89
SLIDE 89

So Far...

  • The machine we’ve been designing in class can generate two types of

exceptions.

  • arithmetic overflow
  • illegal instruction
  • On an exception, we need to
  • save the PC (invisible to user code)
  • record the nature of the exception/interrupt
  • transfer control to OS

Monday, February 4, 13

slide-90
SLIDE 90

Handling Exceptions

  • PC saved in EPC (exception program counter), which the OS may read and

store in kernel memory

  • A status register, and a single exception handler may be used to record the

exception and transfer control, or

  • A vectored interrupt transfers control to a different location for each possible

type of interrupt/exception

user code user code user code user code user code exception handler: read status register ... ... status register user code user code user code user code user code

  • verflow handler: ...

... ... illegal inst handler: .... ... ... I/O interrupt handler: ... ...

Monday, February 4, 13

slide-91
SLIDE 91

Supporting Exceptions

  • For our MIPS-subset architecture, we will add

two registers:

  • EPC: a 32-bit register to hold the user’s PC
  • Cause: A register to record the cause of

the exception

  • we’ll assume undefined inst = 0,
  • verflow = 1
  • We will also add three control signals:
  • EPCWrite (will need to be able to subtract 4

from PC)

  • CauseWrite
  • IntCause
  • We will extend PCSource multiplexor to be

able to latch the interrupt handler address into the PC.

EPC Cause PC PCWrite EPCWrite CauseWrite IntCause PCSource Interrupt Handler Address sub 4

Monday, February 4, 13

slide-92
SLIDE 92

Supporting Exceptions in our Datapath

Monday, February 4, 13

slide-93
SLIDE 93

Key Take-away

  • Exception-handling is difficult in the CPU
  • because the interactions between the executing instructions and the

interrupt are complex and sometimes unpredictable.

Monday, February 4, 13