riscv乘除法模块(M指令)移植(from cva6)

cva6的乘除法模块由四个文件组成,移植时只需这四个文件,分别是:
(cva6代码已上传)

  • mult.sv
  • multiplier.sv
  • serdiv.sv
  • lzc.sv

其中,乘除法模块和流水线的接口只有mult.sv,此交互发生在ex阶段,因此移植时只需要考虑mult.sv文件的输入输出信号。
riscv乘除法模块(M指令)移植(from cva6)_第1张图片
在mult.sv文件中对serdiv.sv和multiplier.sv中定义的模块进行了实例化,这两个文件分别完成了除法和乘法运算,而serdiv.sv中对lzc.sv文件中定义的模块进行了实例化,这个模块主要完成对前导0个数的计算。

mult模块输入输出信号

input:

clk_i:时钟信号
rst_ni:复位信号
flush_i:流水线冲刷信号
mult_valid_i:指示是否需要调用mult,若指令是M指令,则为1
fu_data_i:
	fu:4位,如果是M指令,则置5,否则置0.
	operator:7位枚举类型,设置见后文
	operand_a:rs1数据
	operand_b:rs2数据
imm:没有用到,全置0
trans_id:可以不用,全置0

output:

result_o:乘除法的结果
mult_valid_o:计算完成后,此信号会置1
mult_ready_o:没用
mult_trans_id_o:没用

关于fu_data_i.operator信号,源码为7位,里面定义了非常多的指令类型,但是由于我只想移植该模块实现M指令,其余指令实现不需要此信号,因此将其改为4位,定义如下:

typedef enum logic [3:0] { 
// Multiplications
MUL, MULH, MULHU, MULHSU, MULW,
// Divisions
DIV, DIVU, DIVW, DIVUW, REM, REMU, REMW, REMUW,
NOTMULT
} fu_op;

(最后的NOTMULT表示任何非M指令)
输入输出信号分析完毕,只需要在译码和执行阶段稍微修改代码,就可以完成M指令的移植。需要注意的是,cva6中的乘除法模块是64位,如果要移植到32位的cpu核,则需要修改信号的位数。

你可能感兴趣的:(ariane/cva6,cpu,risc-v,fpga)