前言
有同学问我要龙芯源码,这里放一个仓库:https://github.com/trialley/loongson_MIPS_demo
另外五级流水线很常见了,在CSDN随便一搜就可以搜到很多资料,我的计组课设就是基于CSDN的资料设计的。
CPU内总线
EX module
乘法器是需要时钟的,EX模块其他部分都是是纯粹的组合电路
ALU module
ALU接口
module alu(
input [11:0] alu_control, // ALU控制信号
input [31:0] alu_src1, // ALU操作数1,为补码
input [31:0] alu_src2, // ALU操作数2,为补码
output [31:0] alu_result // ALU结果
);
控制线绑定
控制线在输入时就是独热码,故此有多少计算类型就有多少条控制线
assign alu_add = alu_control[11];
assign alu_sub = alu_control[10];
assign alu_slt = alu_control[ 9];
assign alu_sltu = alu_control[ 8];
assign alu_and = alu_control[ 7];
assign alu_nor = alu_control[ 6];
assign alu_or = alu_control[ 5];
assign alu_xor = alu_control[ 4];
assign alu_sll = alu_control[ 3];
assign alu_srl = alu_control[ 2];
assign alu_sra = alu_control[ 1];
assign alu_lui = alu_control[ 0];
输出
原来所有计算都是一旦有数据输入便会输出,而ALU最终的输出是由控制线控制的多路选择器来决定的
// 选择相应结果输出
assign alu_result = (alu_add|alu_sub) ? add_sub_result[31:0] :
alu_slt ? slt_result :
alu_sltu ? sltu_result :
alu_and ? and_result :
alu_nor ? nor_result :
alu_or ? or_result :
alu_xor ? xor_result :
alu_sll ? sll_result :
alu_srl ? srl_result :
alu_sra ? sra_result :
alu_lui ? lui_result :
32'd0;
最后ID来得低几位被命名为PC,不清楚为什么会有EXPC和MEMPC,program counter不是只在取址阶段才有吗,难道是为了展示不同器件处于不同的流水线状态?