diff --git a/_posts/2023-07-11-18-27-54-cpu-design-part1-riscv-instruction.md b/_posts/2023-07-11-18-27-54-cpu-design-part1-riscv-instruction.md index af2593be4..08f67029e 100644 --- a/_posts/2023-07-11-18-27-54-cpu-design-part1-riscv-instruction.md +++ b/_posts/2023-07-11-18-27-54-cpu-design-part1-riscv-instruction.md @@ -63,7 +63,7 @@ RISC-V 指令集是一个精简指令集,也就意味着其所有的指令都 * 关于**旋转**的补充说明: - * 在 RISC-V 的指令集中,为了保持所有指令格式在寄存器字段位置上的一致性,设计出的 S 型指令将 12 位的立即数(imm[11:0])进行了拆分,使得 12 位立即数变成了两部分(imm[11:5] 和 imm[4:0])。如下图所示:![Snipaste_2022-07-01_12-50-36](https://gitee.com/tinylab/riscv-linux/blob/master/articles/wp-content/uploads/2022/03/riscv-linux/images/riscv_cpu_design/part1/Snipaste_2022-07-01_12-50-36.png) + * 在 RISC-V 的指令集中,为了保持所有指令格式在寄存器字段位置上的一致性,设计出的 S 型指令将 12 位的立即数(imm[11:0])进行了拆分,使得 12 位立即数变成了两部分(imm[11:5] 和 imm[4:0])。如下图所示:![Snipaste_2022-07-01_12-50-36](/wp-content/uploads/2022/03/riscv-linux/images/riscv_cpu_design/part1/Snipaste_2022-07-01_12-50-36.png) 但是在 B 型分支跳转指令中,我们实际需要的是一个 13 位的立即数,而这个立即数的 LSB(Least Significant Bit)总是为 0(本质上就是需要 12 位立即数左移 1 位)。所以从编码的角度上说,B 型指令和 S 型指令一样,只需要 12 位的立即数(将末位的 0 省略)。但是,如果 B 型指令只存储 12 位立即数,则指令执行的过程中将必须进行 12 位立即数的左移操作。左移操作对于硬件来说并不复杂或缓慢,但是却要实实在在的消耗 CPU 硬件资源;通常来说,常数量级的左移操作在芯片内并不会去使用像 ALU 模块中那样的专用移位器,而是将输入硬连线至偏移 1 位的输出线上。这样的操作虽然在时间消耗上可以忽略,但是却需要使用 CPU 硬件层面 12~32 根甚至更多的额外硬连线资源。