恢复余数除法:8位无符号硬件除法
恢复余数除法(Restoring Division)是最直观的硬件除法算法:
| 除法算法 | 步骤数 | 每步操作 | 特点 |
|---|---|---|---|
| 恢复余数 | N | 减法+条件恢复 | 简单但慢(恢复步浪费) |
| 非恢复余数 | N | 加法或减法 | 无需恢复,但加减交替 |
| SRT除法 | | 基于冗余表示 | 更快,但实现复杂 | |
| Newton-Raphson | log(N) | 迭代逼近 | 适合浮点 |
// Lesson 14: Restoring Division — Unsigned 8-bit Divider
module divider(
input wire clk, rst_n,
input wire start,
input wire [7:0] dividend, divisor,
output reg [7:0] quotient, remainder,
output reg done,
output reg div_by_zero
);
reg [7:0] Q, A, M; reg [3:0] step; reg [2:0] bit_cnt;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin quotient<=0; remainder<=0; done<=0;
div_by_zero<=0; step<=0; Q<=0; A<=0; M<=0; bit_cnt<=0; end
else if(start && step==0) begin
if(divisor==0) begin div_by_zero<=1; quotient<=8'hFF;
remainder<=8'hFF; done<=1; end
else begin M<=divisor; Q<=dividend; A<=0;
step<=1; done<=0; div_by_zero<=0; bit_cnt<=0; end
end else if(step==1) begin
A<={A[6:0],Q[7]}; Q<={Q[6:0],1'b0}; step<=2;
end else if(step==2) begin
if(A>=M) begin A<=A-M; Q[0]<=1; end
else Q[0]<=0;
if(bit_cnt==7) begin quotient<=Q; remainder<=A; done<=1; step<=0; end
else begin bit_cnt<=bit_cnt+1; step<=1; end
end
end
endmodule
| 处理器 | 除法延迟 | 除法方法 | 面积 |
|---|---|---|---|
| Rocket Core | 25-37周期 | 迭代除法 | 小 |
| BOOM | 25-37周期 | 迭代除法 | 小 |
| ARM Cortex-A72 | 8-28周期 | SRT基数4 | 中 |
| Apple M1 | ~10周期 | 高基数SRT | 大 |
| Intel Alder Lake | 15-25周期 | 基数16 SRT | 大 |
RISC-V M扩展定义了4条除法指令:
| 指令 | 操作 | 特殊情况 |
|---|---|---|
| DIV | x[rd] = x[rs1] / x[rs2] (有符号) | ÷0→-1, MIN/-1→MIN |
| DIVU | x[rd] = x[rs1] / x[rs2] (无符号) | ÷0→2^W-1 |
| REM | x[rd] = x[rs1] % x[rs2] (有符号) | ÷0→rs1, MIN/-1→0 |
| REMU | x[rd] = x[rs1] % x[rs2] (无符号) | ÷0→rs1 |
恢复余数除法是最基础的实现。现代处理器使用更快的算法:
Apple M1的除法器使用高基数SRT,整数除法约10个周期。而Rocket的迭代除法需要25-37个周期。
| 资料 | 内容 | 链接 |
|---|---|---|
| RISC-V特权规范 | CSR、Trap、中断完整定义 | riscv.org/specifications |
| RISC-V手册 | 中文版免费教材 | crva.ict.ac.cn |
| OpenSBI源码 | M-mode固件参考实现 | github.com/riscv/opensbi |
| Linux RISC-V | 内核移植与驱动 | kernel.org |
| BOOM处理器 | UC Berkeley开源OoO核心 | github.com/riscv-boom/riscv-boom |
| 香山处理器 | 中科院开源高性能核心 | github.com/OpenXiangShan |
| 课程范围 | 课程号 | 主题 |
|---|---|---|
| 特权架构 | 01-06 | 特权级→CSR→ecall→mret→trap→中断 |
| 内存系统 | 07-12 | PLIC→CLINT→SV39→TLB→直接映射→组相联 |
| 算术单元 | 13-14 | Booth乘法器→恢复余数除法 |
| 乱序执行 | 15-19 | OoO→ROB→寄存器重命名→记分牌→Tomasulo |
| 分支预测 | 20-21 | 2位预测器→BTB |
| RISC-V扩展 | 22-26 | RVC→RVM→RVA→RVF→RVD |
| 系统集成 | 27-30 | PMP→解码器→SoC→启动流程 |
建议使用以下环境进行实验:
| 方法 | 32位延迟 | 面积(K gates) | 精度 |
|---|---|---|---|
| 恢复余数 | 64 cycles | 3 | 精确 |
| 非恢复余数 | 32 cycles | 4 | 精确 |
| SRT-4 | 16 cycles | 8 | 精确 |
| SRT-8 | 11 cycles | 15 | 精确 |
| Newton-Raphson | 6-8 cycles | 20+ | 近似(需要修正) |
| 查表+迭代 | 4-6 cycles | 30+ | 近似(需修正) |
SRT除法器以Sweeney、Robertson、Tocher三人命名,是目前最快的硬件除法算法:
Intel Pentium FDIV bug是计算机史上最著名的硬件bug之一,正是因为SRT除法器的查找表设计错误导致的。此后,硬件除法器的形式化验证变得至关重要。
非恢复余数除法消除了恢复步骤,每步固定一次加减运算:
非恢复余数除法比恢复余数除法每步少一次条件加法,性能提升约30%。这是硬件除法器最常用的基础算法。