实现整数运算指令

实验目的

(1)理解Ⅰ型和R型整数运算指令指令功能;

(2)理解数据通路与指令功能的关联;

(3)掌握硬布线控制逻辑的设计方法;

(4)进一步掌握CPU实验的调试方法。

实验原理

前面ADDI指令的参考设计没有ALU模块,只能进行加法运算,为了实现更多的I型运算指令,需要添加ALU模块;参考设计只能是rs1加立即数,而R型运算指令和I型运算指令的区别在于第二个运算数的来源不同,I型指令是立即数,R型指令是寄存器,所以增加一个多路器进行选择,数据通路如图 1

SingleCycleRISCV_07_SC-I-R 300dpi
图 1. ADDI指令的数据通路

实验步骤

1. 用HDL设计实现数据通路

(1)增加ALU模块

将前面实验中自己设计的ALU模块添加到工程中。为便于考核,ALU运算功能的控制请按表 1设计。不要求实现SLTI/SLTIU(小于置1)指令,ALU设计可忽略该指令的需要。

表 1. ALUop编码表

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

5. 提交电路测试

将验证正确的电路提交测试。

测试任务的虚拟面板所包含的观察信号和观察数据较少,但无需将设计代码中的观察变量减少到和虚拟面板一样,不会因此影响测试的分数。