实现分支指令

实验目的

(1)理解分支指令指令功能;

(2)进一步理解数据通路与指令功能的关联。

实验原理

分支指令包括beq、bne、blt、bge以及bltu、bgeu指令。数据通路如图 1

SingleCycleRISCV_07_300dpi 2022
图 1. 支持分支指令的数据通路

实验步骤

1. 分支指令译码和转移判断

修改Controller模块,增加分支指令译码。根据对rs1和rs2两个寄存器值的比较结果,产生PCjump控制信号。

2. 实现数据通路

(1)修改ImmGen模块

增加B型立即数的生成。注意B型立即数实际是13位立即数,最低位需要补0。

(2)修改CPU模块

添加多路器,根据图 1连接数据通路各个部件;连接增加的控制信号。

3. 增加调试观察信号

根据虚拟面板添加观察信号和观察数据。与虚拟面板对应的WS示例如下,WD和上一个实验相同。

    always_comb begin
        ws.WS6[3:0] = cALUop;
        ws.WS5[4:0] = cImm_type;
        ws.WS4      = cImmToALU;
        ws.WS3      = cMemWrite;
        ws.WS2      = cMemToReg;
        ws.WS1      = cPCjump;
        ws.WS0      = cRegWrite;
    end

4. 在实验平台验证设计

(1)编写测试程序,测试所实现的分支指令。每条指令均需验证转移和不转移两种情况。BEQ指令测试程序举例如下。

LOOP:   addi x18, x0, 0x555
	    sw   x18, 8(x0)
	    lw   x19, 8(x0)
	    sll  x20, x19, x18
	    beq  x20, x19, LOOP
	    beq  x18, x19, LOOP

(2)运行前面实验编写的计算斐波那契数列的程序。