ALU
ALU (Arithmetic Logic Unit) 是负责对二进制整数进行算术运算和位运算的组合电路部件,本实验要求你设计一个 32 位的能够对两个输入进行:按位与 / 或 / 异或、无符号数加法 / 减法 / 溢出、逻辑右移。
模块实现
报告中需要给出你写出的完整代码。
你可以在两种实现方式中选择:
- 仿照 slides p12,使用提供的 IP core 完成(你需要使用 Verilog 而非原理图实现);或
- (更推荐)参考标准第 5.1 节 Operators,使用运算符完成。
- 你可能需要参考标准第 5.5 节 Signed expressions,使用
$signed(), $unsigned()
完成实验。
- 你可能需要参考标准第 5.5 节 Signed expressions,使用
不论你采用何种方式,你的模块名与端口名应为:
ALU.v | |
---|---|
2023.3.9 更新:对于移位指令(如 SRA )的解释
指令 sra rd, rs1, rs2
:把寄存器 x[rs1]
右移 x[rs2]
位,空位用 x[rs1]
最高位填充,结果写入 x[rd]
。 x[rs2]
的低 5 位为移动位数,高位则被忽略。与 SRA 类似,其他移位指令 SRL、SLL 的移动位数都取决于低 5 位而非整体数值。
相应的, ALU 中 SRA 的含义为,将输入 A
右移 B[4:0]
位,高位用 A[31]
填充。比如:A = 32'hDEADBEEF, B = 32'hF00000E4
的 SRA 结果为 32'hFDEADBEE
,因为 A
的最高位为 1
且 B
的低 5 位为 5'b0_0100
,将 A
右移 4 位高位补 1
即得到结果。
2023.3.5 更新:对于 ALU_operation
的解释
本次实验中,你只需要根据 slides 提供的原理图实现 ADD, SUB, XOR, SRL, OR, AND, SLT 指令;也可以一次到位,直接将 ALU_operation
拓展为 4 位并实现全部指令。这对你本实验的实验分数没有任何影响。
本次实验的 ALU 实现的功能并不足以在之后的实验中直接使用,在之后的实验中,你要实现的完整操作如下:
操作 | ALU_operation 值 |
---|---|
ADD | 4'd0 |
SUB | 4'd1 |
SLL | 4'd2 |
SLT | 4'd3 |
SLTU | 4'd4 |
XOR | 4'd5 |
SRL | 4'd6 |
SRA | 4'd7 |
OR | 4'd8 |
AND | 4'd9 |
需要注意的是,上表 ALU_operation
值与操作的对应和本实验并不完全相同,比如本实验中 SLT
对应 3'b111
而在之后的约定中对应 4'b11
。
仿真测试
报告中需要给出 testbench 代码,测试波形与解释(波形截图需要保证缩放与变量数制合适)。
基础的仿真波形已经在附件 ALU/ALU_tb.v
,但它过于简单,你需要添加若干边界测试以完善。
思考题
现在对 ALU 进行拓展,要求修改 ALU 以支持两个有符号数的大小比较,你需要添加哪些端口以支持zero
信号仅能用来判断是否相等)
封装 IP Core
将你实现的 ALU 封装为 IP core 以便之后调用。