issue,自然就是发射执行到后面的各个功能模块里。gs232里一共有三个port,也就是port0,port1,port2。
port0和port1是什么指令都能执行,port2好像有点限制,似乎只能走bru指令,还没弄准。
在这里,指令分成几类,分别是lsu bru mul div和none。none主要是csr和tlb相关的指令。
先挖几个坑。
后面的ex1_stage里有alu0, alu1, lsu_s1, branch几个模块。再后面的ex2_stage里有alu0, alu1, lsu_s2, bru_s2模块。问题是,为什么alu要重复出现?mul,div模块都已经独立出来了,alu里应该只有加减法,bit操作和位移了,都是单周期就能完成的。
lsu模块有两个stage,可以理解。branch怎么还分branch和bru_s2模块?
一说起多发射,自然会想到同时发射的指令是否有冲突,比如当前port0是lsu指令,那port1就不能再发射一条lsu指令了。同样的,mul,div这种也都不能同时发射,因为后面的功能模块有限。
但在chiplab,这个功能并不是实现在issue里,而是在decode里(lsoc1000_stage_de2.v),叫做crash,比如 data crash
201 wire data_crash_01 = (((raddr1_0 == waddr0) && raddr1_0_valid) || ((raddr1_1 == waddr0) && raddr1_1_valid) || ((stx_read == waddr0) && triple_read_1) )
202 && de_port0_valid && rf_wen0 && (waddr0 != 5'd0);
203
204 wire data_crash_02 = (((raddr2_0 == waddr0) && raddr2_0_valid) || ((raddr2_1 == waddr0) && raddr2_1_valid))
205 && de_port0_valid && rf_wen0 && (waddr0 != 5'd0);
206
207 wire data_crash_12 = (((raddr2_0 == waddr1) && raddr2_0_valid) || ((raddr2_1 == waddr1) && raddr2_1_valid))
208 && de_port1_valid && rf_wen1 && (waddr1 != 5'd0);
一旦有crash,port1就不会设置valid,就单发射了
285 wire crash = unit_crash_01 || data_crash_01 || lsu_protect_01 || single_issue || csr_read_crash;
524 always @(posedge clk) begin // internal valid
525 if (rst) valid1 <= 1'd0;
526 else if (exception || eret || bru_cancel || wb_cancel) valid1 <= 1'b0;
527 else if (de_allow_in) valid1 <= (de_port1_valid&& !crash) || (de_port0_valid && port0_op[`LSOC1K_RDTIME]);
528 end
再来说issue模块,主要作用是几个
1. 读寄存器,为后面的发射准备好参数。
2. 处理data forwarding
3. type_crash还没搞懂是怎么回事