🖊️ 计算机学院 计算机组成 (Computer Organization)
404

Basic info

课程名:计算机组成 (Computer Organization)

主讲教师: $\mathbf{A.P.}$ $\mathrm{De}$ $\mathrm{Ma}$

E-Mail:$\mathrm{[email protected]}$

分数占比:

  • Assignment $10\%$
  • Presence $10\%$
  • Quiz $10\%$
  • Lab $30\%$
    • Lab 0 ~ 3 基本实验 $30\%$
    • Lab 4 单周期 CPU $30\%$
    • Lab 5 流水线 CPU $30\%$
    • Lab 6 Data Cache $10\%$
  • Final $40\%$

教材:

  1. $\mathrm{David\; A.\; Patterson}$, Computer Organization and Design RISC-V Edition: The Hardware Software Interface

FPGA 平台:Artix 7, XC7A100T, CSG324, -1.

Lec 1 : Prelude

Technologies for building processors and memory

Yield is the proportion of working dies per wafer.

Chapter 2 : Instructions

Basic RISCV assembly

Registers: RISC-V 有 32 个 64-bit 大小的 register file, 64bit 被称作双字 (dword),32bit 被称为单字 (word)

寄存器:

  • x0 硬连线为常数 0
  • x1/ra 用于储存返回地址
  • x2/sp 指示栈顶
  • x3/gp 为全局指针
  • x4/tp 为线程指针
  • x5-x7x28-x31 约定作为临时变量
  • x8-x9x18-x27 保留
  • x10-x17 用于传参和返回

Memory: 内存地址单位为1 byte,遵守小端规则,无需内存对齐
常用的寻址方式是相对寻址:

1
ld  x9, 64(x22)

其中,寄存器x22存储内存基址,64 为偏移地址,单位为byte

寄存器的访问比内存访问快得多,设计时应尽多使用寄存器。

由于内存基址存储在寄存器中,而寄存器位宽为64,因此RISC-V最大寻址范围为 $2^{64}/2^3=2^{61}$ 个 dword

Immediate: 有的指令允许立即数,例如

1
addi x22, x22, 4

Instructions Formats

指令以二进制机器数的形式储存在内存中,所有RISC-V指令均为32bit
R-Format: R型指令用于三寄存器运算,其结构如下

1
2
| funct7 |  rs2  |  rs1  | funct3 |  rd   | opcode |
| 7bit | 5bit | 5bit | 3bit | 5bit | 7bit |

其中,opcode 存储指令代码,他和 funct7, funct3 一起,决定了指令所进行的操作是哪一种,rd 为目标寄存器,存储 rs1rs2 两个操作寄存器的运算结果,即
1
op rd, rs1, rs2

包括以下指令:add, sub
I-Format: I型指令用于含立即数的运算,其结构如下
1
2
|   immediate    |  rs1  | funct3 |  rd   | opcode |
| 12bit | 5bit | 3bit | 5bit | 7bit |

其中,opcode 存储指令代码,他和 funct3 一起决定了指令所进行的操作是哪一种,rd 为目标寄存器,存储 rs1immediate 进行运算的结果,即
1
op rd, rs1, imm

I型指令提供12位的立即数,无符号数范围为 $[0, 2^{12}-1]$ 有符号数范围为 $[-2^{11},2^{11}-1]$
包括以下指令:addi, ld
S-Format: S型指令用于储存指令,其结构如下:
1
2
| imm[11:5] |  rs2  |  rs1  | funct3 | imm[4:0] | opcode |
| 7bit | 5bit | 5bit | 3bit | 5bit | 7bit |

S型指令类似于 I型指令,但由于他不需要一个目标寄存器,而需要两个寄存器分别用来存待存数和内存基址,而为了保持统一的格式,立即数的后五位被放到了目标寄存器的位置。
包括以下指令:sd, sw, sb
SB-Format: SB型指令用于带条件的跳转,他的格式如下:
1
2
| imm[12,10:5] |  rs2  |  rs1  | funct3 | imm[4:1,11] | opcode |
| 7bit | 5bit | 5bit | 3bit | 5bit | 7bit |

SB型指令有12bit的立即数,其中,inst[31]imm[12] 为符号位,可以用于符号扩展,生成一个 32 位的立即数,即
1
{20{inst[31]}, inst[7], inst[30:25], inst[11:8], 0}

由于立即数的0位一直为0,所以指令中立即数的范围是 $[-2^{12}, 2^{12}-2]$ 即 $[-4096, 4094]$ 间的所有偶数,假设所有指令都是32bit,那么使用Branch最多可以跳 $[-1024, 1023]$ 条指令
UJ-Format: UJ指令用于无条件的跳转,格式如下:
1
2
| imm[20,10:1,11,19:12] |  rd   | opcode |
| 20bit | 5bit | 7bit |

UJ型指令有20位的立即数,类似于SB型指令,其立即数的第0位始终为0,因此其寻址范围是 $[-2^{20}, 2^{20}-2]$ 间所有偶数
U-Format: U指令用于加载大立即数,格式如下:
1
2
| imm[31:12] |  rd   | opcode |
| 20bit | 5bit | 7bit |

U型指令有20位的立即数,其范围为 $[-2^{19}, 2^{19}-1]$
lui 指令可以将一个20位的立即数加载到目标寄存器的 [31:12] 位,并将第 [11:0] 位清零,后面的 [11:0] 位可以使用 addi 指令来修改,这样就可以分段加载一个32位的大立即数。

Instructions

beq, bne:

1
2
3
4
if(x1 == x2)
statement_if_eq;
else
statement_if_neq;

1
2
3
4
5
6
7
  bne x1, x2, L1
statement_if_eq
beq x0, x0, endif
L1:
statement_if_neq
endif:
other_statement
1

signed, unsigned

Function Call

寄存器传参

  • 将参数存入寄存器 x10-x17
  • jal ra, address
  • 被调用者计算,并将结果存入寄存器
  • jalr x0, 0(ra)

堆栈传参

  • 参数寄存器压栈, sp-8*k
    +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
main:
addi sp, sp, 8
sw x10, 4(sp)
sw x11, 0(sp)
addi x10, x0, 3
jal ra, fib
beq x0,x0, q
fib:
addi x5, x0, 3
blt x10, x5, Exit

addi x10, x10, -1
addi sp, sp, 12
sw ra, 8(sp)
sw x10, 4(sp)
sw x11, 0(sp)
jal ra, fib
addi x5, x0, x11
lw x11, 0(sp)
lw x10, 4(sp)
lw ra, 8(sp)
addi sp, sp, -12

addi x10, x10, -2
addi sp, sp, 12
sw ra, 8(sp)
sw x10, 4(sp)
sw x11, 0(sp)
jal ra, fib
addi x6, x0, x11
lw x11, 0(sp)
lw x10, 4(sp)
lw ra, 8(sp)
addi sp, sp, -12

add x11, x5, x6
jalr x0, 0(x1)

Exit:
addi x11, x0, 1
jalr x0, 0(x1)
q:
 留言
評論插件加載失敗
正在加載評論插件
Hexo 框架 & 主題 Keep
本站由 提供部署服務