实现整数运算指令
实验原理
前面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型运算指令的测试程序,验证自己的设计。根据指导教师的要求,提交验证记录。