u@home:~$

折腾了下IFU

IFU decode后的一堆_d的信号全给EXU了,这回把这部分信号放在ifu_dec里,给EXU的基本都是_e的信号。

register file还是放在EXU里。

ifu_exu_valid_d变成了在ifu fdp和dec之间的fdp_dec_inst_vld_kill_d,表示这条指令valid并且没有被kill_d。

cpu7_ifu_dec里也就放了些d2e的寄存器,本来这些是在cpu7_exu_ecl里的。

这样exu_ecl就看起来轻松了不少,exu接收_e的信号。

不过将来实现更多的机制,不知道ifu是不是又要折腾。

进到exu的_e信号,基本也都是先进到exu_ecl里,因为可能有一些简单的逻辑要处理,然后由ecl转发给各个功能模块alu lsu bru等。

IFU

IFU can be stalled through exu_ifu_stall_req as many cycles as it is pulled high.

When IFU is stalled, pc_bf keeps fetching the same address, pc_f : ifu_pcbf_sel_old_bf_l. kill_f is not effective during exu_ifu_stall_req.

pc_f2d_reg.en —\

valid_d_reg.en \
__ exu_ifu_stall_req

pc_d2e_reg.en / /

inst_vld_d2e_reg–/

When exe_ifu_stall_req is pulled high, both reg stalls, so pc_d and pc_e wont change.

   assign inst_vld_kill_f = ifu_fdp_valid_f & (~kill_f);

   assign inst_vld_kill_d = ifu_exu_valid_d & (~kill_d);



   wire pc_f2d_en;
   assign pc_f2d_en = inst_vld_kill_f & ~exu_ifu_stall_req;

   wire pc_d2e_en;
   assign pc_d2e_en = ifu_exu_valid_d & ~exu_ifu_stall_req;  //ifu_exu_valid_d should be inst_vld_kill_d