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\%$
教材:
- $\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-x7
,x28-x31
约定作为临时变量x8-x9
,x18-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
为目标寄存器,存储 rs1
和 rs2
两个操作寄存器的运算结果,即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
为目标寄存器,存储 rs1
和 immediate
进行运算的结果,即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
4if(x1 == x2)
statement_if_eq;
else
statement_if_neq;
1 | bne x1, x2, L1 |
1 |
signed, unsigned
Function Call
寄存器传参
- 将参数存入寄存器
x10-x17
jal ra, address
- 被调用者计算,并将结果存入寄存器
jalr x0, 0(ra)
堆栈传参
- 参数寄存器压栈,
sp-8*k
+
1 | main: |