u@home:~$

  • 遇到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...

  • LSU里遇到的处理lsu_op解码的问题

    lsu_op需要解码,需要分清是load还是store指令,分别是byte word 还是dword等等。 发出读和写请求都是在_e阶段,但如果是写操作,数据和地址发出去后,等结果就行了。 而读请求需要在_e发出请求,如果地址正确的话会在同cycle里马上会得到个data_addr_ok。 而数据要在后面n个周期才会回来。 这个阶段都叫做_m,但具体几个cycle,不能确定,因为会遇到cache miss。 读数据回来后,需要根据lsu_op找出这个读指令是读byte还是word等。 而lsu_op实际上是lsu_op_e,这时候已经没有了,必须用dff保存一份。 所以这里我用带enable的dff,在lsu_op传进来的时候就存起来,用valid做en。 70 // lsu_op needs dff, the following combinational logic is only used when data_data_ok is signaled at _m 71 wire [`LSOC1K_LSU_CODE_BIT-1:0] lsu_op_m; 72 73 dffe_s #(`LSOC1K_LSU_CODE_BIT) lsu_op_e2m_reg ( 74 .din (lsu_op), 75 .en (valid), 76 .clk (clk), 77 .q...