实现整数运算指令
实验原理
前面ADDI指令的参考设计没有ALU模块,只能进行加法运算,为了实现更多的I型运算指令,需要添加ALU模块;参考设计只能是rs1加立即数,而R型运算指令和I型运算指令的区别在于第二个运算数的来源不同,I型指令是立即数,R型指令是寄存器,所以增加一个多路器进行选择,数据通路如图 1。
实验步骤
1. 用HDL设计实现数据通路
(1)增加ALU模块
将前面实验中自己设计的ALU模块添加到工程中。为便于考核,ALU运算功能的控制请按表 1设计。不要求实现SLTI/SLTIU(小于置1)指令,ALU设计可忽略该指令的需要。
ALUop |
功能描述 |
0001 |
加法 |
0010 |
减法 |
0011 |
按位逻辑与 |
0100 |
按位逻辑或 |
0101 |
按位逻辑异或 |
0110 |
算术右移 |
0111 |
逻辑左移 |
1000 |
逻辑右移 |
【提示】设计时需考虑移位运算的移位位数最多31位。
(2)连接CPU数据通路
实例化ALU模块,添加多路器;根据Controller模块的修改(见下)增加ALUop端口连接,连接增加的控制信号。
2. 设计控制逻辑
修改Controller模块,增加ImmToALU控制信号, 产生ALUop控制信号。注意少数指令的Funct3相同,由Funct7区分,如逻辑右移指令和算术右移指令,加法和减法指令。
R型指令与立即数无关,理论上立即数类型以及生成的立即数对指令结果没有影响。由于实验平台根据控制信号绘制动态信息流显示,为避免显示错误的信息流,建议R型指令的ImmType为0,并且生成的立即数为0。
3. 增加调试支持代码
验证任务提供了设计好的虚拟面板,和ADDI指令的参考设计相比,增加ImmToALU、ALUop等观察信号和RD2等观察数据。需要做的是在代码中增加相应的调试支持,注意序号和位宽一定要和虚拟面板一致,下面给出与虚拟面板对应的WS和WD示例。
always_comb begin
ws.WS3[3:0] = cALUop;
ws.WS2[4:0] = cImm_type;
ws.WS1 = cImmToALU;
ws.WS0 = cRegWrite;
End
always_comb begin
wd.WD9[31:0] = immData;
wd.WD8[31:0] = regReadData2;
wd.WD7[31:0] = regReadData1;
wd.WD6[4:0] = ra2;
wd.WD5[4:0] = ra1;
wd.WD4[31:0] = regWriteData;
wd.WD3[4:0] = wa;
wd.WD2[31:0] = instruction;
wd.WD1[31:0] = pc;
wd.WD0[31:0] = nextPC;
end
4. 在实验平台验证设计
根据ALU所实现的运算功能,执行相应的Ⅰ型和R型运算指令,并检查指令执行结果。
(1)Ⅰ型运算指令的参考测试程序
addi x0, x0, 0
addi x18, x0, 0x666
addi x18, x18, 0
andi x19, x18, 0x555
addi x19, x19, 0
ori x20, x18, 0x333
addi x20, x20, 0
xori x21, x18, -1
addi x21, x21, 0
slli x5, x18, 21
addi x5, x5, 0
srai x6, x18, 10
addi x6, x6, 0
srli x7, x18, 10
addi x7, x7, 0
srai x6, x5, 12
addi x6, x6, 0
srli x7, x5, 12
addi x7, x7, 0
(2)R型运算指令的参考测试程序
addi x18, x0, 0x666
addi x17, x0, 0x555
and x19, x18, x17
addi x19, x19, 0
or x20, x18, x17
addi x20, x20, 0
xor x21, x18, x17
addi x21, x21, 0
add x22, x18, x17
addi x22, x22, 0
sub x23, x18, x17
addi x23, x23, 0
addi x28, x0, 21
sll x5, x18, x28
addi x5, x5, 0
addi x28, x0, 10
sra x6, x18, x28
addi x6, x6, 0
srl x7, x18, x28
addi x7, x7, 0
addi x28, x0, 12
sra x6, x5, x28
addi x6, x6, 0
srl x7, x5, x28
addi x7, x7, 0
(3)编写自己的测试程序
编写一个综合Ⅰ型和R型运算指令的测试程序,验证自己的设计。根据指导教师的要求,提交验证记录。