u@home:~$

各个阶段的pc是要放一个模块里,还是各个模块用dff分别存?

chiplab里是这样一排的流水线寄存器一起传给下一个stage。

    input                              is_port0_valid,
    input [`GRLEN-1:0]                 is_port0_pc,
    input [31:0]                       is_port0_inst,
    input [`LSOC1K_DECODE_RES_BIT-1:0] is_port0_op,
    input [`GRLEN-3:0]                 is_port0_br_target,
    input                              is_port0_br_taken,
    input                              is_port0_exception,
    input [5 :0]                       is_port0_exccode,
    input                              is_port0_rf_wen,
    input [4:0]                        is_port0_rf_target,
    input [`LSOC1K_PRU_HINT:0]         is_port0_hint,

OpenSPARC T1里的做法是不同的模块管理相关的信号和各个stage的流水线寄存器。

比如sparc_ifu_fdp是ifu的data path,里面存着pc的各阶段的寄存器,需要的时候也是从这里像各个模块发出。

   // D stage PC and nPC
   dff_s  #(49)  pcd_reg(.din (pc_s),
                                 .q   (pc_d),
                                 .clk (clk),  .se(se), .si(), .so());
   dff_s  #(49)  npcd_reg(.din  (npc_s),
                                  .q    (npc_d),
                                  .clk  (clk), .se(se), .si(), .so());

   assign am_mask = , 32'hffffffff};

   // nand2
   assign pc_d_adj = pc_d & am_mask;
   assign npc_d_adj = npc_d & am_mask;

   assign ifu_exu_pc_d = pc_d_adj[47:0];

   // E stage PC and nPC
   dff_s  #(49)  pce_reg(.din (pc_d_adj),
                                 .q   (pc_e),
                                 .clk (clk), .se(se), .si(), .so());
   dff_s  #(49)  npce_reg(.din  (npc_d_adj),
                                  .q    (npc_e),
                                  .clk (clk), .se(se), .si(), .so());

   assign fdp_fcl_pc_oor_e = pc_e[48];
   assign ifu_tlu_pc_oor_e = pc_e[48];

   // M stage PC and nPC
   dff_s  #(49)  pcm_reg(.din  (pc_e),
                                 .q    (pc_m),
                                 .clk  (clk),  .se(se), .si(), .so());
   dff_s  #(49)  npcm_reg(.din (npc_e),
                                  .q   (npc_m),
                                  .clk (clk), .se(se), .si(), .so());
   assign ifu_tlu_pc_m = pc_m[48:0];
   assign ifu_tlu_npc_m = npc_m[48:0];

   // W stage PC and nPC
   dff_s  #(49)  pcw_reg(.din  (pc_m),
                                 .q    (pc_w),
                                 .clk  (clk),  .se(se), .si(), .so());
   dff_s  #(49)  npcw_reg(.din (npc_m),
                                  .q   (npc_w),
                                  .clk (clk), .se(se), .si(), .so());

我想学OpenSPARC T1的方式,也在cpu7_ifu_fdp里存了各个阶段的pc。

但因为开始是从chiplab改的ifu,从ifu_fdp到ifu_dec的部分,也就是取值到解码的时候,把一排的流水线寄存器都传给dec,并且在dec里存进寄存器。

现在只有这一段是原来chiplab的祥子,后面看着再改吧。

   dff_s #(`GRLEN) pc_d_reg (
      .din (pc_f),
      .clk (clock),
      .q   (pc_d),
      .se(), .si(), .so());
   
   dff_s #(`GRLEN) pc_e_reg (
      .din (pc_d),
      .clk (clock),
      .q   (pc_e),
      .se(), .si(), .so());

   dff_s #(`GRLEN) pc_m_reg (
      .din (pc_e),
      .clk (clock),
      .q   (pc_m),
      .se(), .si(), .so());
   
   dff_s #(`GRLEN) pc_w_reg (
      .din (pc_m),
      .clk (clock),
      .q   (pc_w),
      .se(), .si(), .so());

   assign ifu_exu_pc_w = pc_w;

ifu_exu_pc_w又传给exu,再_w的时候用。

现在的的问题是pc_d的寄存器重复了,cpu7_ifu_dec里也又一份。

后面还要考虑stall的问题,比如从_e的地方stall了,前面的ifu里的pc是不是就对应的不准了。这个要到branch和mul的时候考虑清楚。

screenshot0