折腾了下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