CPU设计实战:Loongarch版 实践任务8:阻塞技术解决相关引发的冲突

好的,设计完简单的流水线之后,看看下个任务是什么吧。看完之后是让我们解决流水线之间指令引起的冲突。


以下解释来源于胡伟武老师的计算机体系结构基础


什么是指令引起的冲突呢?指令的相关大致可以分为3类:数据相关、控制相关和结构相关,而这个实验就是解决数据相关的引起的冲突,根据冲突访问读和写的次序可以分为3种。第1种是写后读(Read After Write,简称RAW)相关,即后面指令要用到前面指令所写的数据,也称为真相关。第2种是写后写(Write After Write,简称WAW)相关,即两条指令写同一个单元,也称为输出相关。第3种是读后写(Write After Read,简称WAR)相关,即后面的指令覆盖前面指令所读的单元,也称为反相关。而在5级简单流水线中,只有RAW相关会引起流水线冲突,WAR相关和WAW相关不会引起流水线冲突。

对于如下指令序列

其中第1、2条指令间,第2、3条指令间,第3、4条指令间存在RAW相关。

从第1条指令的写回阶段指向第2条指令的译码阶段的箭头以及从第2条指令的写回阶段指向第3条指令的译码阶段的箭头都表示RAW相关会引起冲突。这是因为如果第2条指令要使用第1条指令写回到寄存器的结果,就必须保证第2条指令读取寄存器的时候第1条指令的结果已经写回到寄存器中了,而现有的5级流水线结构如果不加控制,第2条指令就会在第1条指令写回寄存器之前读取寄存器,从而引发数据错误。为了保证执行的正确,一种最直接的解决方式是让第2条指令在译码阶段等待(阻塞)3拍,直到第1条指令将结果写入寄存器后才能读取寄存器,进入后续的执行阶段。同样的方式亦适用于第2、3条指令之间和第3、4条指令之间。


而具体该如何做呢?结合上面的解释可以这么做:处于译码流水级的指令具有来自非0号寄存器的源操作数,如果这些源操作数中的任何一个寄存器号与当前时刻处于执行、访存或写回阶段的指令的目的操作数的寄存器号相同,则表明会引发冲突的写后读相关关系。

并且有一个细节:保证被比较的两个寄存器号都是有效的,这体现在三个方面:1.参与比较的指令到底有没有寄存器的源操作数或者目的操作数,2.如果寄存器号为0,那么也不用进行比较,因为0号寄存器的值恒为0,3.用来比较的流水级上到底有没有指令,如果没有指令那么比较毫无意义。

在判断条件成立的时候,将ID阶段的ready_go信号进行调整即可。

在写后读相关存在一种情况——LOAD TO BRANCH,即load后紧跟branch指令,而转移指令至少有一个源寄存器与load指令目的寄存器相同,所以存在写后读相关,在这种情况下的冲突引起的原因叫做“转移计算未完成”此时的brbus产生的nextPC肯定是不对的,所以我们要在上面新增一个brstall,表示转移计算未完成,另外也要给preIF加上ready_go,当brstall为1时,置ready_go为0。

另外在转移计算未完成时,建议将控制指令ram的使能信号拉低使之无效,在后续引入总线设计的时候,没有注意到这一点的话会很容易出错。


在改我代码的时候解决延迟槽就解决了好久,因为loongarch是没有延迟槽的,需要想办法把跳转指令后面的指令不去处理,主要就是跳转指令这一块引起的冲突,老是差一两个周期导致整个流水线停止,最终也是改好了。

下面三个是改动了的module

IF stage


module IF_stage(
	input  clk,
	input  reset,
	input  ID_allow_in,
	input  [33:0] br_bus,
	output        inst_sram_en,
    output [ 3:0] inst_sram_we,
    output [31:0] inst_sram_addr,
    output [31:0] inst_sram_wdata,
    input  [31:0] inst_sram_rdata,
	output [63:0] IF_ID_bus,
	output IF_to_ID_valid

    );
wire br_stall;
wire br_taken;
wire [31:0] br_target;
wire [31:0] IF_inst;
reg  [31:0] IF_pc;
wire [31:0] seq_pc;
wire [31:0] nextpc;
wire pre_If_ready_go;
wire IF_ready_go;
wire IF_allow_in;
wire to_IF_valid;
wire IF_to_ID_valid;
reg  IF_valid;


assign pre_If_ready_go = ~br_stall;
assign to_IF_valid = ~reset && pre_If_ready_go;
assign IF_ready_go = 1'b1;
assign IF_allow_in = !IF_valid || IF_ready_go && ID_allow_in;
assign IF_to_ID_valid =  IF_valid && IF_ready_go;   
assign IF_ID_bus = {IF_pc, IF_inst};
assign {br_stall,br_taken, br_target} = br_bus;

	always @(posedge clk) begin
	    if (reset) begin
	        IF_valid <= 1'b0;
	        
	    end
	    else if (IF_allow_in) begin
	        IF_valid <= to_IF_valid;
	    end
	end

	always @(posedge clk) begin 
		if(reset) begin
			 IF_pc <= 32'h1bfffffc;
			
		end else if(to_IF_valid && (IF_allow_in))begin
			 IF_pc <= nextpc;		
		end
	end
                       

assign seq_pc       = IF_pc + 3'h4;
assign nextpc       = br_taken ? br_target : seq_pc;
assign inst_sram_en    = to_IF_valid && (IF_allow_in || br_stall);
assign inst_sram_addr = nextpc;
assign IF_inst = inst_sram_rdata;
assign inst_sram_we = 4'b0;
assign inst_sram_wdata = 32'b0;


endmodule

ID stage

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/05/29 10:44:41
// Design Name: 
// Module Name: ID_stage
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module ID_stage(
  input  clk,
  input  reset,
  input  EX_allow_in,
  input  IF_to_ID_valid,
  input  [63:0]IF_ID_bus,
  input  [37:0]WB_rf_bus,
  input  [ 4:0]EX_dest,
  input  [ 4:0]MEM_dest,
  input  [ 4:0]WB_dest,
  input  EX_load,
  output ID_allow_in,
  output [33:0]br_bus,
  output [150:0]ID_EX_bus,
  output ID_to_EX_valid,
  output to_EX_inst_bl

    );
reg  [31:0] ID_pc;
reg  [31:0] ID_inst;
reg  ID_valid;
wire ID_ready_go;
reg delay_slot;

wire [31:0] br_offs;
wire [31:0] jirl_offs;
wire        src_reg_is_rd;
wire        src_reg_is_rj;
wire        src_reg_is_rk;
wire        dst_is_r1;
wire [ 5:0] op_31_26;
wire [ 3:0] op_25_22;
wire [ 1:0] op_21_20;
wire [ 4:0] op_19_15;
wire [ 4:0] rd;
wire [ 4:0] rj;
wire [ 4:0] rk;
wire [11:0] i12;
wire [19:0] i20;
wire [15:0] i16;
wire [25:0] i26;

wire rf_we  ;
wire [4:0]rf_waddr;
wire [31:0]rf_wdata;
wire [4:0]rf_raddr1;
wire [31:0]rf_rdata1;
wire [4:0]rf_raddr2;
wire [31:0]rf_rdata2;

wire [11:0] alu_op;
wire        src1_is_pc;
wire        src2_is_imm;
wire        src2_is_4;
wire        res_from_mem;
wire        gr_we;
wire        mem_we;
wire [4: 0] dest;
wire [31:0] rj_value;
wire [31:0] rkd_value;
wire [31:0] imm;

wire br_stall;
wire br_taken;
wire [31:0]br_target;

wire [63:0] op_31_26_d;
wire [15:0] op_25_22_d;
wire [ 3:0] op_21_20_d;
wire [31:0] op_19_15_d;

wire        inst_add_w;
wire        inst_sub_w;
wire        inst_slt;
wire        inst_sltu;
wire        inst_nor;
wire        inst_and;
wire        inst_or;
wire        inst_xor;
wire        inst_slli_w;
wire        inst_srli_w;
wire        inst_srai_w;
wire        inst_addi_w;
wire        inst_ld_w;
wire        inst_st_w;
wire        inst_jirl;
wire        inst_b;
wire        inst_bl;
wire        inst_beq;
wire        inst_bne;
wire        inst_lu12i_w;

wire        need_ui5;
wire        need_si12;
wire        need_si16;
wire        need_si20;
wire        need_si26;

wire [31:0]alu_src1;
wire [31:0]alu_src2;


assign op_31_26  = ID_inst[31:26];
assign op_25_22  = ID_inst[25:22];
assign op_21_20  = ID_inst[21:20];
assign op_19_15  = ID_inst[19:15];

assign rd   = ID_inst[ 4: 0];
assign rj   = ID_inst[ 9: 5];
assign rk   = ID_inst[14:10];

wire same_rj;
wire same_rk;
wire same_rd;
wire inst_no_dest_reg;
assign same_rd = src_reg_is_rd && rd != 5'b0 &&((rd == EX_dest) || (rd == MEM_dest) || (rd == WB_dest)); 
assign same_rj = src_reg_is_rj && rj != 5'b0 &&((rj == EX_dest) || (rj == MEM_dest) || (rj == WB_dest)); 
assign same_rk = src_reg_is_rk && rk != 5'b0 &&((rk == EX_dest) || (rk == MEM_dest) || (rk == WB_dest)); 
assign inst_no_dest_reg = inst_st_w | inst_b | inst_beq | inst_bne;
assign block = same_rd || same_rj || same_rk;
assign i12  = ID_inst[21:10];
assign i20  = ID_inst[24: 5];
assign i16  = ID_inst[25:10];
assign i26  = {ID_inst[ 9: 0], ID_inst[25:10]};


decoder_6_64 u_dec0(.in(op_31_26 ), .out(op_31_26_d ));
decoder_4_16 u_dec1(.in(op_25_22 ), .out(op_25_22_d ));
decoder_2_4  u_dec2(.in(op_21_20 ), .out(op_21_20_d ));
decoder_5_32 u_dec3(.in(op_19_15 ), .out(op_19_15_d ));

assign inst_add_w  = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h00];
assign inst_sub_w  = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h02];
assign inst_slt    = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h04];
assign inst_sltu   = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h05];
assign inst_nor    = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h08];
assign inst_and    = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h09];
assign inst_or     = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h0a];
assign inst_xor    = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h0b];
assign inst_slli_w = op_31_26_d[6'h00] & op_25_22_d[4'h1] & op_21_20_d[2'h0] & op_19_15_d[5'h01];
assign inst_srli_w = op_31_26_d[6'h00] & op_25_22_d[4'h1] & op_21_20_d[2'h0] & op_19_15_d[5'h09];
assign inst_srai_w = op_31_26_d[6'h00] & op_25_22_d[4'h1] & op_21_20_d[2'h0] & op_19_15_d[5'h11];
assign inst_addi_w = op_31_26_d[6'h00] & op_25_22_d[4'ha];
assign inst_ld_w   = op_31_26_d[6'h0a] & op_25_22_d[4'h2];
assign inst_st_w   = op_31_26_d[6'h0a] & op_25_22_d[4'h6];
assign inst_jirl   = op_31_26_d[6'h13];
assign inst_b      = op_31_26_d[6'h14];
assign inst_bl     = op_31_26_d[6'h15];
assign inst_beq    = op_31_26_d[6'h16];
assign inst_bne    = op_31_26_d[6'h17];
assign inst_lu12i_w= op_31_26_d[6'h05] & ~ID_inst[25];

assign to_EX_inst_bl = inst_bl;

assign alu_op[ 0] = inst_add_w | inst_addi_w | inst_ld_w | inst_st_w
                    | inst_jirl | inst_bl;
assign alu_op[ 1] = inst_sub_w;
assign alu_op[ 2] = inst_slt;
assign alu_op[ 3] = inst_sltu;
assign alu_op[ 4] = inst_and;
assign alu_op[ 5] = inst_nor;
assign alu_op[ 6] = inst_or;
assign alu_op[ 7] = inst_xor;
assign alu_op[ 8] = inst_slli_w;
assign alu_op[ 9] = inst_srli_w;
assign alu_op[10] = inst_srai_w;
assign alu_op[11] = inst_lu12i_w;

assign need_ui5   =  inst_slli_w | inst_srli_w | inst_srai_w;
assign need_si12  =  inst_addi_w | inst_ld_w | inst_st_w;
assign need_si16  =  inst_jirl | inst_beq | inst_bne;
assign need_si20  =  inst_lu12i_w;
assign need_si26  =  inst_b | inst_bl;
assign src2_is_4  =  inst_jirl | inst_bl;
assign imm = src2_is_4 ? 32'h4                      :
             need_si20 ? {i20[19:0], 12'b0}         :
/*need_ui5 || need_si12*/{{20{i12[11]}}, i12[11:0]} ;

assign br_offs = need_si26 ? {{ 4{i26[25]}}, i26[25:0], 2'b0} :
                             {{14{i16[15]}}, i16[15:0], 2'b0} ;

assign jirl_offs = {{14{i16[15]}}, i16[15:0], 2'b0};

assign src_reg_is_rd = inst_beq | inst_bne | inst_st_w;
assign src_reg_is_rj = ~(inst_b | inst_bl | inst_lu12i_w);
assign src_reg_is_rk = ~(inst_slli_w | inst_srli_w | inst_srai_w | inst_addi_w | inst_ld_w | inst_st_w | inst_jirl | 
                      inst_b | inst_bl | inst_beq | inst_bne | inst_lu12i_w);
assign src1_is_pc    = inst_jirl | inst_bl;

assign src2_is_imm   = inst_slli_w |
                       inst_srli_w |
                       inst_srai_w |
                       inst_addi_w |
                       inst_ld_w   |
                       inst_st_w   |
                       inst_lu12i_w|
                       inst_jirl   |
                       inst_bl     ;

assign res_from_mem  = inst_ld_w;
assign dst_is_r1     = inst_bl;
assign gr_we         = ~inst_st_w & ~inst_beq & ~inst_bne & ~inst_b;
assign mem_we        = inst_st_w;
assign dest          = inst_no_dest_reg ? 5'b0 :
                                        dst_is_r1 ? 5'd1 : rd;

assign rf_raddr1 = rj;
assign rf_raddr2 = src_reg_is_rd ? rd :rk;

assign {rf_we, rf_waddr, rf_wdata} = WB_rf_bus;

regfile u_regfile(
    .clk    (clk      ),
    .raddr1 (rf_raddr1),
    .rdata1 (rf_rdata1),
    .raddr2 (rf_raddr2),
    .rdata2 (rf_rdata2),
    .we     (rf_we    ),
    .waddr  (rf_waddr ),
    .wdata  (rf_wdata )
    );

assign rj_value  = rf_rdata1;
assign rkd_value = rf_rdata2;

assign ID_EX_bus = {
                    ID_pc,//150:119
                    alu_op,//118:107
                    src2_is_4,//106
                    src1_is_pc,//105
                    src2_is_imm,//104
                    gr_we,//103
                    mem_we,//102
                    dest,//101:97
                    imm,//96:65
                    rj_value,//64:33
                    rkd_value,//32:1
                    res_from_mem //0:0
};
assign rj_eq_rd = (rj_value == rkd_value);
assign br_taken = (   inst_beq  &&  rj_eq_rd
                   || inst_bne  && !rj_eq_rd
                   || inst_jirl
                   || inst_bl
                   || inst_b
                  ) && ID_valid && !delay_slot;
assign br_target = (inst_beq || inst_bne || inst_bl || inst_b) ? (ID_pc + br_offs) :
                                                   /*inst_jirl*/ (rj_value + jirl_offs);
assign br_bus = {
                br_stall, //33
                br_taken,//32
                br_target //31:0
                };
assign br_stall = br_taken && EX_load && ID_valid;
assign ID_ready_go    = ~block;
assign ID_allow_in     = !ID_valid || ID_ready_go && EX_allow_in;
assign ID_to_EX_valid = ID_valid && ID_ready_go && !delay_slot;
always @(posedge clk) begin
    if (reset) begin
        ID_valid <= 1'b0;
        delay_slot <= 1'b0;
    end
    else if (ID_allow_in) begin
        ID_valid <= IF_to_ID_valid;
    end
 
    if (IF_to_ID_valid && ID_allow_in) begin
        {ID_pc,ID_inst} <= IF_ID_bus;
         if (br_taken) begin
          delay_slot <= 1'b1;
          end else begin
            delay_slot <=1'b0;
          end
    end

end


endmodule

EX stage

module EX_stage(
    input         clk,
    input         reset,
    input  MEM_allow_in,
    input  ID_to_EX_valid,
    output EX_allow_in,
    input  [150:0]ID_EX_bus,
    input   inst_bl,
    output [70:0]EX_MEM_bus,
    output  EX_to_MEM_valid,
    output        data_sram_en,
    output [ 3:0] data_sram_we,
    output [31:0] data_sram_addr,
    output [31:0] data_sram_wdata,
    output [ 4:0] EX_dest_reg,
    output EX_load
    );

    reg  [31:0] EX_pc;

    reg EX_valid;
    wire EX_ready_go;
    reg  [11:0] EX_alu_op;
    reg         EX_src1_is_pc;
    reg         EX_src2_is_imm;
    reg         EX_src2_is_4;
    reg         EX_res_from_mem;
    reg         EX_gr_we;
    reg         EX_mem_we;
    reg  [4: 0] EX_dest;
    reg  [31:0] EX_rj_value;
    reg  [31:0] EX_rkd_value;
    reg  [31:0] EX_imm;
    wire [31:0] alu_result;
    reg EX_inst_bl;
    wire [31:0] alu_src1;
    wire [31:0] alu_src2;
    assign EX_ready_go    = 1'b1;
    assign EX_allow_in     = !EX_valid || EX_ready_go && MEM_allow_in;
    assign EX_to_MEM_valid =  EX_valid && EX_ready_go;
    assign EX_MEM_bus = {
                        EX_pc,//70:39
                        EX_gr_we,//38
                        EX_dest,//37:33
                        alu_result,//32:1
                        EX_res_from_mem//0
    };
    assign EX_dest_reg = EX_dest & {5{EX_valid}};
always @(posedge clk) begin
    if (reset) begin
        EX_valid <= 1'b0;
    end
    else if (EX_allow_in) begin
        EX_valid <= ID_to_EX_valid;
    end

    if (ID_to_EX_valid && EX_allow_in) begin
        {EX_pc ,
        EX_alu_op ,
        EX_src2_is_4,
        EX_src1_is_pc,
        EX_src2_is_imm,
        EX_gr_we,
        EX_mem_we,
        EX_dest,
        EX_imm,
        EX_rj_value,
        EX_rkd_value,
        EX_res_from_mem} <= ID_EX_bus;
        EX_inst_bl <= inst_bl;
    end
end
assign EX_load = EX_res_from_mem;
alu u_alu(
    .alu_op     (EX_alu_op ),
    .alu_src1   (alu_src1  ),
    .alu_src2   (alu_src2  ),
    .alu_result (alu_result)
    );
assign alu_src1 = EX_src1_is_pc  ? EX_pc : EX_rj_value;
assign alu_src2 = EX_src2_is_imm ? EX_imm : (EX_inst_bl ? 32'd4 : EX_rkd_value);
assign data_sram_en = 1'b1;
assign data_sram_we    = EX_mem_we && EX_valid ? 4'b1111 : 4'b0000;
assign data_sram_addr  = alu_result;
assign data_sram_wdata = EX_rkd_value;

endmodule

MEM stage

module MEM_stage(
    input  clk,
    input  reset,
    input  WB_allow_in,
    output MEM_allow_in,
    input  [70:0]EX_MEM_bus,
    input  [31:0] data_sram_rdata,
    input  EX_to_MEM_valid, 
    output MEM_to_WB_valid,
    output [69:0]MEM_WB_bus,
    output [ 4:0]MEM_dest_reg
    );

reg [31:0] MEM_pc;
reg MEM_res_from_mem;
reg MEM_gr_we;
reg [4:0]MEM_dest;
reg [31:0]MEM_alu_result;
wire [31:0] MEM_final_result;
wire [31:0] MEM_result;

reg MEM_valid;
wire MEM_ready_go;
assign MEM_ready_go    = 1'b1;
assign MEM_allow_in     = !MEM_valid || MEM_ready_go && WB_allow_in;
assign MEM_to_WB_valid = MEM_valid && MEM_ready_go;
assign MEM_dest_reg = MEM_dest & {5{MEM_valid}};
always @(posedge clk) begin
    if (reset) begin
        MEM_valid <= 1'b0;
    end
    else if (MEM_allow_in) begin
        MEM_valid <= EX_to_MEM_valid;
    end

    if (EX_to_MEM_valid && MEM_allow_in) begin
        {MEM_pc ,
        MEM_gr_we ,
        MEM_dest,
        MEM_alu_result,
        MEM_res_from_mem } <= EX_MEM_bus;
    end
end
assign MEM_result = data_sram_rdata;
assign MEM_final_result = MEM_res_from_mem ? MEM_result : MEM_alu_result;
assign MEM_WB_bus = {
                        MEM_pc,//69:38
                        MEM_gr_we,//37
                        MEM_dest,// 36:32
                        MEM_final_result//31:0
};
endmodule

WB stage

module WB_stage(
  input  clk,
  input  reset,
  output WB_allow_in,
  input  MEM_to_WB_valid,
  input  [69:0] MEM_WB_bus,
  output [37:0] WB_rf_bus,
  output [31:0] debug_wb_pc,
  output [ 3:0] debug_wb_rf_we,
  output [ 4:0] debug_wb_rf_wnum,
  output [31:0] debug_wb_rf_wdata,
  output [ 4:0] WB_dest_reg
  );
reg [31:0] WB_pc;
reg WB_valid;
wire WB_ready_go;

reg WB_gr_we;
reg [4:0]WB_dest;
reg [31:0]WB_final_result;
wire rf_we   ;
wire [4:0]rf_waddr;
wire [31:0]rf_wdata;
assign WB_ready_go = 1'b1;
assign WB_allow_in  = !WB_valid || WB_ready_go;
assign WB_dest_reg = WB_dest & {5{WB_valid}};
always @(posedge clk) begin
    if (reset) begin
        WB_valid <= 1'b0;
    end
    else if (WB_allow_in) begin
        WB_valid <= MEM_to_WB_valid;
    end

    if (MEM_to_WB_valid && WB_allow_in) begin
      {WB_pc,
       WB_gr_we,
       WB_dest,
       WB_final_result} <= MEM_WB_bus;
       
    end
end

assign rf_we    = WB_gr_we && WB_valid;
assign rf_waddr = WB_dest;
assign rf_wdata = WB_final_result;

assign WB_rf_bus = {rf_we,//37
                    rf_waddr,//36:32
                    rf_wdata//31:0
                    };

assign debug_wb_pc       = rf_we ? WB_pc : debug_wb_pc;
assign debug_wb_rf_we   = {4{rf_we}};
assign debug_wb_rf_wnum  = WB_valid && rf_we ? WB_dest : debug_wb_rf_wnum;
assign debug_wb_rf_wdata = WB_valid && rf_we ? WB_final_result : debug_wb_rf_wdata;


endmodule

mycpu

module mycpu_top(
    input  wire        clk,
    input  wire        resetn,
    // inst sram interface
    output wire        inst_sram_en,
    output wire [ 3:0] inst_sram_we,
    output wire [31:0] inst_sram_addr,
    output wire [31:0] inst_sram_wdata,
    input  wire [31:0] inst_sram_rdata,
    // data sram interface
    output wire        data_sram_en,
    output wire [ 3:0] data_sram_we,
    output wire [31:0] data_sram_addr,
    output wire [31:0] data_sram_wdata,
    input  wire [31:0] data_sram_rdata,
    // trace debug interface
    output wire [31:0] debug_wb_pc,
    output wire [ 3:0] debug_wb_rf_we,
    output wire [ 4:0] debug_wb_rf_wnum,
    output wire [31:0] debug_wb_rf_wdata
);
reg         reset;
always @(posedge clk) reset <= ~resetn;



// allow_in
wire ID_allow_in;
wire EX_allow_in;
wire MEM_allow_in;
wire WB_allow_in;
//bus
wire [63:0]IF_ID_bus;
wire [150:0]ID_EX_bus;
wire [70:0]EX_MEM_bus;
wire [69:0]MEM_WB_bus;
wire [33:0]br_bus;
wire [37:0]WB_rf_bus;
//valid
wire IF_to_ID_valid;
wire ID_to_EX_valid;
wire EX_to_MEM_valid;
wire MEM_to_WB_valid;
//inst_bl
wire inst_bl;

//block
wire EX_load;
wire [4:0]EX_dest;
wire [4:0]MEM_dest;
wire [4:0]WB_dest;
IF_stage IF(
    .clk(clk),
    .reset(reset),
    .ID_allow_in(ID_allow_in),
    .br_bus(br_bus),
    .inst_sram_en(inst_sram_en),
    .inst_sram_we(inst_sran_we),
    .inst_sram_addr(inst_sram_addr),
    .inst_sram_wdata(inst_sram_wdata),
    .inst_sram_rdata(inst_sram_rdata),
    .IF_ID_bus(IF_ID_bus),
    .IF_to_ID_valid(IF_to_ID_valid)

    );
ID_stage ID(
   .clk(clk),
   .reset(reset),
   .EX_allow_in(EX_allow_in),
   .IF_to_ID_valid(IF_to_ID_valid),
   .IF_ID_bus(IF_ID_bus),
   .WB_rf_bus(WB_rf_bus),
   .ID_allow_in(ID_allow_in),
   .br_bus(br_bus),
   .ID_EX_bus(ID_EX_bus),
   .ID_to_EX_valid(ID_to_EX_valid),
   .to_EX_inst_bl(inst_bl),
   .EX_dest(EX_dest),
   .WB_dest(WB_dest),
   .MEM_dest(MEM_dest),
   .EX_load(EX_load)
    );
EX_stage EX(
    .clk(clk),
    .reset(reset),
    .MEM_allow_in(MEM_allow_in),
    .ID_to_EX_valid(ID_to_EX_valid),
    .EX_allow_in(EX_allow_in),
    .ID_EX_bus(ID_EX_bus),
    .inst_bl(inst_bl),
    .EX_MEM_bus(EX_MEM_bus),
    .EX_to_MEM_valid(EX_to_MEM_valid),
    .data_sram_en(data_sram_en),
    .data_sram_we(data_sram_we),
    .data_sram_addr(data_sram_addr),
    .data_sram_wdata(data_sram_wdata),
    .EX_dest_reg(EX_dest),
    .EX_load(EX_load)
);
MEM_stage MEM(
    .clk(clk),
    .reset(reset),
    .WB_allow_in(WB_allow_in),
    .MEM_allow_in(MEM_allow_in),
    .EX_MEM_bus(EX_MEM_bus),
    .data_sram_rdata(data_sram_rdata),
    .EX_to_MEM_valid(EX_to_MEM_valid),    
    .MEM_to_WB_valid(MEM_to_WB_valid),
    .MEM_WB_bus(MEM_WB_bus),
    .MEM_dest_reg(MEM_dest)
    );
WB_stage WB(
    .clk(clk),
    .reset(reset),
    .WB_allow_in(WB_allow_in),
    .MEM_to_WB_valid(MEM_to_WB_valid),
    .MEM_WB_bus(MEM_WB_bus),
    .WB_rf_bus(WB_rf_bus),
    .debug_wb_pc(debug_wb_pc) ,
    .debug_wb_rf_we(debug_wb_rf_we),
    .debug_wb_rf_wnum(debug_wb_rf_wnum),
    .debug_wb_rf_wdata(debug_wb_rf_wdata),
    .WB_dest_reg(WB_dest)
    );
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值