-
LSU OP decode 搞错地方了
应该放在_d。现在是放在_e了。 LSU BRU要是想stall IFU,最好在_d就判断好指令,这样stall IFU的时候就不需要再处理_d流水线寄存器里的指令了,要不_d也得stall。 ALU也是把alu_op送进去的,里面也有解码的部分。 感觉应该把lsu_op在_d送进去,decode的verilog代码也是在lsu里,把结果送到_e的流水线寄存器里。 不过看到在OpenSPARC里也是部分解码出op,具体详细的还是在各个功能模块里。 ifu/rtl/sparc_ifu_dec.v //---------------------------------------------------------------------- // Code Begins Here //---------------------------------------------------------------------- assign clk = rclk; assign op = dtu_inst_d[31:30]; assign op2 = dtu_inst_d[24:22]; assign op3 = dtu_inst_d[24:19]; assign opf = dtu_inst_d[13:5]; // decode op assign brsethi_inst = ~op[1] & ~op[0]; assign call_inst = ~op[1] & op[0];...
-
遇到LSU指令时stall IFU,处理流水线中的指令
可以在_d阶段判断出是不是LSU指令,也可以知道是不是load指令。 现在store指令还没有试,不知道写成功回不回data_data_ok,要是回的话需要几个周期。 _d阶段,可以控制IFU仍然选择old pc,但当前的指令会进到_d的流水线寄存器。 可以刷_d流水线寄存器 可以用exu_ifu_stall_req来清除进到_d流水线寄存器的valid信号。这也相当于刷掉了这条指令,卡在_bf和_f的oldpc这条指令是最终送进流水线执行的。 问题是,exu_ifu_stall_req信号从lsu_op decode给出,只有1个cycle有效,怎样让它持续到LSU指令完成。 要看下openSPACR里,stall_req后是怎么恢复的。 ifu/rtl/sparc_ifu_fcl.v dff_s #(2) stlreq_reg(.din ({lsu_ifu_stallreq, ffu_ifu_stallreq}), .q ({lsu_stallreq_d1, ffu_stallreq_d1}), .clk (clk), .se(se), .si(), .so()); assign all_stallreq = ifq_fcl_stallreq | lsu_stallreq_d1 | ffu_stallreq_d1 | itlb_starv_alert; // leave out stall from ifq which goes directly to swl assign fcl_dtu_stall_bf = lsu_stallreq_d1 | ffu_stallreq_d1...
-
LSU读到数据,回写regfile时wen怎么办?
lsu需要回写regfile,把数据传回ecl(以后改byp),然后给到ecl_irf_rd_data_w,但这时候有个问题,wen已经不在了。 wen一开始在ecl里维护,从ifu_exu_rf_wen_d一直到最后的wen_w,给出ecl_irf_wen_w。 277 wire [4:0] wen_d; 278 wire [4:0] wen_e; 279 wire [4:0] wen_m; 280 wire [4:0] wen_w; 281 282 assign wen_d = ifu_exu_rf_wen_d & ifu_exu_valid_d; 283 284 dff_s #(1) wen_e_reg ( 285 .din (wen_d), 286 .clk (clk), 287 .q (wen_e), 288 .se(), .si(), .so()); 289 290 dff_s #(1) wen_m_reg...