Computer Organization: Formats and Logic
/ 10 min read
Table of Contents
Course index · Previous: RISC-V Assembly · Next: Datapath Control
R-Format Layout
- opcode:它决定了这条指令属于哪种基本格式(比如是 R型、I型还是 S型)。
- funct3 (3 位功能码):在
opcode划定的大范围下,进一步细分操作类型。比如,同样是 R 型算术指令,funct3就可以用来区分这到底是加减法相关的指令,还是移位指令,或者是异或(XOR)这样的逻辑指令。 - funct7 (7 位功能码):这是最精细的区分。当两个指令的
opcode和funct3都完全一样时,就需要靠funct7来做最后的“拍板”。加法 (add) 和 减法 (sub)。对于硬件来说,加法和减法高度相似,它们的opcode相同,funct3也相同。它们唯一的区别就在于funct7中有一个二进制位不同
I-Format Layout
Load Instructions are also I-Type
S-Format Layout
B-Format Layout
既然代码是连续存的,而且分支指令通常跳得不远,那么我们在指令里面,就不需要存一个完整的 32 位绝对内存地址(比如 0x80001234)。我们只需要存一个偏移量 (Offset) 就可以了(比如告诉 CPU:“以当前的 PC 地址为基准,往前跳 16 个字节”)。
目标地址 = 当前 PC 寄存器的值 + 偏移量 (Offset)。
在计算分支跳转时,我们不使用单字节作为单位
为了保证底层架构的一致性,RISC-V 官方做了一个硬性规定:无论你当前的处理器到底支不支持 16 位的压缩指令,所有分支跳转指令的偏移量,一律以 2 字节(半字)为基本单位进行缩放!
- 上半部分 (Instruction encodings,
inst[31:0]): 这是指令存放在内存中的原始样子。你可以看到 I、S、B 型指令中,立即数(imm)是被无情拆散、塞在各个角落的。 - 下半部分 (32-bit immediates produced,
imm[31:0]): 这是 CPU 内部的立即数生成器 (Immediate Generator) 电路的工作结果。它把上面那些散落的碎片抓出来,重新拼成一个标准的 32 位数字,准备送给 ALU(算术逻辑单元)去计算。
Long Immediates (U-Format)
J-Format
J 型指令为了跳得更远,把能挪用的空间全挪用了,腾出了足足 20 位的空间来存放立即数。 和上一页讲过的 B 型指令一样,为了“白嫖”一个比特位,J 型指令的偏移量也是以 2 字节为单位的
Compiling, Assembling, Linking, and Loading
架构图位置
Synchronous Digital Systems
Swithes 开关
Transistors 晶体管
晶体管说明
上图实现了CMOS非门
Accumulator
- 电路根本不会等你输入下一个数,它在一微秒内可能已经自己绕着圈子加了几万次,导致输出信号剧烈波动、产生乱码
- 无法清零
Register Details Flip-flops
Accumulator (Revisited)
Course index · Previous: RISC-V Assembly · Next: Datapath Control