各个阶段的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的时候考虑清楚。