ALU
包括五个模块,普通ALU模块,地址生成单元模块,分支预测解析模块,CSR读写控制模块,多周期乘/除模块
这些模块只负责具体指令的执行控制,均共享实际的运算数据通路。因此可以控制主要数据通路的面积开销。
普通ALU模块
普通ALU模块完全由组合逻辑组成,普通ALU模块本身并没有运算数据通路,其主要逻辑即根据普通ALU指令类型,发起对共享数据通路的操作请求,并且从共享的运算数据通路中取回运算结果。
// 从信息总线中取出相关信息
//本指令的第二个源操作数是否使用立即数
wire op2imm = alu_i_info [`E203_DECINFO_ALU_OP2IMM ];
// 本指令的第一个源操作数是否使用PC
wire op1pc = alu_i_info [`E203_DECINFO_ALU_OP1PC ];
//将第一个源操作数发送给共享的数据通路,如果是PC,则选择PC,否则选择源寄存器
assign alu_req_alu_op1 = op1pc ? alu_i_pc : alu_i_rs1;
//将第一个源操作数发送给共享的数据通路,如果是立即数,则选择立即数,否则选择源寄存器
assign alu_req_alu_op2 = op2imm ? alu_i_imm : alu_i_rs2;
wire nop = alu_i_info [`E203_DECINFO_ALU_NOP ] ;
wire ecall = alu_i_info [`E203_DECINFO_ALU_ECAL ];
wire ebreak = alu_i_info [`E203_DECINFO_ALU_EBRK ];
wire wfi = alu_i_info [`E203_DECINFO_ALU_WFI ];
// 根据指令的类型,产生所需计算的操作类型,并将其发送给共享的元素运算数据通路。
// The NOP is encoded as ADDI, so need to uncheck it
assign alu_req_alu_add = alu_i_info [`E203_DECINFO_ALU_ADD ] & (~nop);
assign alu_req_alu_sub = alu_i_info [`E203_DECINFO_ALU_SUB ];
assign alu_req_alu_xor = alu_i_info [`E203_DECINFO_ALU_XOR ];
assign alu_req_alu_sll = alu_i_info [`E203_DECINFO_ALU_SLL ];
assign alu_req_alu_srl = alu_i_info [`E203_DECINFO_ALU_SRL ];
assign alu_req_alu_sra = alu_i_info [`E203_DECINFO_ALU_SRA ];
assign alu_req_alu_or = alu_i_info [`E203_DECINFO_ALU_OR ];
assign alu_req_alu_and = alu_i_info [`E203_DECINFO_ALU_AND ];
assign alu_req_alu_slt = alu_i_info [`E203_DECINFO_ALU_SLT ];
assign alu_req_alu_sltu = alu_i_info [`E203_DECINFO_ALU_SLTU];
assign alu_req_alu_lui = alu_i_info [`E203_DECINFO_ALU_LUI ];
assign alu_o_valid = alu_i_valid;
assign alu_i_ready = alu_o_ready;
assign alu_o_wbck_wdat = alu_req_alu_res;
assign alu_o_cmt_ecall = ecall;
assign alu_o_cmt_ebreak = ebreak;
assign alu_o_cmt_wfi = wfi;
// 将共享数据通路的结果取回
// The exception or error result cannot write-back
assign alu_o_wbck_err = alu_o_cmt_ecall | alu_o_cmt_ebreak | alu_o_cmt_wfi;
地址生成单元
地址生成单元AGU 模块负责load,store和A扩展指令的地址生成。以及A扩展指令的微操作拆分和执行。AGU模块是整个存储器访问指令执行过程中所需的一部分。
分支预测解析模块
分支预测解析BJP模块主要负责 分支与跳转指令的结果解析和执行。BJP是分支跳转指令进行交付的主要依据。
CSR读写控制模块
CSR 读写控制模块主要负责CSR读写指令的执行。CSR读写控制模块完全由组合逻辑组成,其根据CSR读写指令的类型产生读写CSR模块的控制信号。
多周期乘/除模块
对于多周期的乘法除法器。
对于有符号整数乘法,使用常用的booth编码算法计算部分积,然后使用迭代的方法,在每个周期使用加法器对部分积进行累加。经过多个周期之后得到最终的乘积。
对于有符号的整数除法,使用常用的加减交替法,然后使用迭代的方法,在每个周期使用加法器得到部分余数,经过多个周期的迭代之后得到最终的商和余数。
两者结构非常类似,二者都使用加法器作为主要的数据通路,使用一组寄存器保存怒分积或者部分余数。因此两者可以进行资源复用,从而节省面积。
多周期乘除法MDV模块是ALU的一个子单元,通过复用ALU共享数据通路中的加法器,经过多个时钟周期完成乘法或者除法操作。
对于乘法操作,为了减少乘法操作所需的时钟周期数,MDV模块对乘法使用radix - 4的Booth编码算法,并且对无符号乘法进行符号位扩展后,统一当做有符号数进行运算。
对于除法操作,采用普通的加减交替法,同样对无符号乘法进行符号位扩展后。统一当做有符号数进行运算。加减交替法迭代所得结果存在着一位精度问题,因此不仅需要额外一个时钟周期以判断是否需要进行商和余数的校正。还需要两个额外时钟周期判断商和余数校正。最终得到完全准确的除法结果。
MDV模块只进行运算控制,并没有自己的加法器。加法器与其他的ALU子单元复用共享的运算数据通路,有没有存储部分积或部分余数的寄存器,寄存器和AGU复用寄存器。
因此MDV模块本身仅使用一些状态机进行控制和选择。
运算数据通路
运算数据通路是ALU真正用于计算的数据通路模块。运算数据通路功能比较简单,它被动地接受其他ALU子单元的请求并进行具体运算,然后将计算结果返回给其他子单元的运算数据通路。
交付 写回
指令交付功能在EXU完成。 指令写回功能也在EXU完成
EXU包括了译码 执行 写回 和交付功能。