diff --git a/20210817_ok/final_inst_test.zip b/20210817_ok/final_inst_test.zip new file mode 100755 index 0000000..a758176 Binary files /dev/null and b/20210817_ok/final_inst_test.zip differ diff --git a/20210817_ok/指令集答题.pdf b/20210817_ok/指令集答题.pdf new file mode 100755 index 0000000..df1ac20 Binary files /dev/null and b/20210817_ok/指令集答题.pdf differ diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index 75feaa8..259a8d7 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -36,11 +36,13 @@ module Controller ( assign ctrl.SYSCALL = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[0]; assign ctrl.BREAK = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & inst[0]; - assign ctrl.ERET = inst[30] & inst[4]; + // assign ctrl.ERET = inst[30] & inst[4]; + assign ctrl.ERET = inst[30] & ~inst[29] & inst[4]; assign ctrl.OFA = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]); assign ctrl.ES = inst[31] | ~inst[30] & ~inst[28] & ~inst[27] & ~inst[26] & (inst[5] | inst[4] & inst[3] & ~inst[2] | ~inst[3] & inst[2]) | inst[29];; - assign ctrl.ET = ~inst[31] & ~inst[27] & ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & (inst[5] | (~inst[1] & (~inst[4] & ~inst[3] & ~inst[0] | inst[4] & inst[3]) | inst[1] & (~inst[4] | inst[3]))) | inst[30] & inst[29]); + // assign ctrl.ET = ~inst[31] & ~inst[27] & ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & (inst[5] | (~inst[1] & (~inst[4] & ~inst[3] & ~inst[0] | inst[4] & inst[3]) | inst[1] & (~inst[4] | inst[3]))) | inst[30] & inst[29]); + assign ctrl.ET = ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & ~inst[31] & ~inst[27] & (~inst[5] & (~inst[1] & (~inst[0] & (~inst[3] & ~inst[4] | inst[3] & inst[4]) | inst[0] & inst[4] & inst[3]) | inst[1] & (~inst[4] | inst[4] & inst[3])) | inst[5]) | inst[30] & inst[29] & ~inst[10]); assign ctrl.DS = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & (~inst[30] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | inst[26])); assign ctrl.DT = ~inst[31] & ~inst[29] & inst[28] & ~inst[27]; @@ -60,13 +62,20 @@ module Controller ( assign ctrl.ECtrl.SA = SA_t'({inst[31] | inst[29] | ~inst[26] & (inst[5] | inst[2]), inst[31] | (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26]))}); assign ctrl.ECtrl.SB = SB_t'({inst[31] | inst[29], inst[26] | ~inst[5] & inst[3]}); - assign ctrl.MCtrl0.HW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | ~inst[1] & inst[0]); - assign ctrl.MCtrl0.LW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | inst[1] & inst[0]); - assign ctrl.MCtrl0.HLS = HLS_t'({~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]}); + assign ctrl.MCtrl0.FLT = inst[30] & inst[10]; + assign ctrl.MCtrl0.FLTC = inst[25:21] == 0 & inst[15:11] == 0; + assign ctrl.MCtrl0.HW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | ~inst[1] & inst[0]); + assign ctrl.MCtrl0.LW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | inst[1] & inst[0]); + // assign ctrl.MCtrl0.HLS = HLS_t'({~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]}); + assign ctrl.MCtrl0.HLS = HLS_t'({ + ~inst[26] & ~inst[27] & ~inst[31] & (~inst[29] & ~inst[30] & ~inst[28] & inst[4] & inst[3] | inst[29] & inst[30] & ~inst[10]), + ~inst[30] & inst[1], + inst[0] + }); assign ctrl.MCtrl0.C0D = inst[15:11]; assign ctrl.MCtrl0.C0W = inst[30] & ~inst[29] & inst[23] & ~inst[3]; assign ctrl.MCtrl0.SEL = inst[2:0]; - assign ctrl.MCtrl0.RS0 = RS0_t'({~inst[30] & (inst[29] | inst[26] | ~inst[4]), inst[30], ~inst[29] & (inst[30] | ~inst[1])}); + assign ctrl.MCtrl0.RS0 = RS0_t'({~inst[30] & (inst[29] | inst[26] | ~inst[4]) & ~ctrl.MCtrl0.FLT, inst[30], ~inst[29] & (inst[30] | ~inst[1])}); assign ctrl.MCtrl1.MR = inst[31]; assign ctrl.MCtrl1.MWR = inst[29]; diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 2519ac3..61fabe5 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -226,6 +226,8 @@ module Datapath ( word_t M_I0_HI; word_t M_I0_LO; + word_t M_I0_FLT_ANS; + word_t M_I0_RDataW0; logic M_I1_NowExcValid; logic M_I1_PrevExcValid; @@ -497,11 +499,11 @@ module Datapath ( // TODO: CACHE | D.IA.MCtrl1.TLBR & D.IB.MCtrl0.C0W | D.IA.MCtrl1.TLBP & D.IB.MCtrl0.C0W - | D.IA.MCtrl1.TLBR & D.IB.MCtrl0.RW & D.IB.MCtrl0.C0D == C0_ENTRYHI & D.IB.MCtrl0.RS0 == C0 - | D.IA.MCtrl1.TLBR & D.IB.MCtrl0.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO0 & D.IB.MCtrl0.RS0 == C0 - | D.IA.MCtrl1.TLBR & D.IB.MCtrl0.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO1 & D.IB.MCtrl0.RS0 == C0 - | D.IA.MCtrl1.TLBR & D.IB.MCtrl0.RW & D.IB.MCtrl0.C0D == C0_PAGEMASK & D.IB.MCtrl0.RS0 == C0 - | D.IA.MCtrl1.TLBP & D.IB.MCtrl0.RW & D.IB.MCtrl0.C0D == C0_INDEX & D.IB.MCtrl0.RS0 == C0 + | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYHI & D.IB.MCtrl0.RS0 == C0 + | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO0 & D.IB.MCtrl0.RS0 == C0 + | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO1 & D.IB.MCtrl0.RS0 == C0 + | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_PAGEMASK & D.IB.MCtrl0.RS0 == C0 + | D.IA.MCtrl1.TLBP & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_INDEX & D.IB.MCtrl0.RS0 == C0 // Hazards Related to Exceptions or Interrupts | D.IA.MCtrl0.C0W & D.IB.ERET & D.IA.MCtrl0.C0D == C0_EPC ; @@ -672,7 +674,7 @@ module Datapath ( E.en, E.I0.ECtrl ); - ffenrc #(17) E_I0_MCtrl_ff ( + ffenrc #(19) E_I0_MCtrl_ff ( clk, rst | rstM, D.I0.MCtrl, @@ -968,7 +970,7 @@ module Datapath ( M.en, M.I0.ALUOut ); - ffenrc #(17) M_I0_MCtrl_ff ( + ffenrc #(19) M_I0_MCtrl_ff ( clk, rst | rstM, E.I0.MCtrl, @@ -976,6 +978,16 @@ module Datapath ( ~E_go | ~E_I0_go, M.I0.MCtrl ); + + Filter Filter_ff( + clk, + E_I0_ForwardS, + M.en & E.I0.MCtrl.FLT, + E.I0.MCtrl.FLTC, + M_I0_FLT_ANS + ); + + ffenrc #(5 + 1) M_I0_WCtrl_ff ( clk, rst | rstM, @@ -1110,13 +1122,19 @@ module Datapath ( ); // M.I0.HILOC0 - mux5 #(32) M_I0_RDataW_mux ( + mux5 #(32) M_I0_RDataW0_mux ( LO, HI, M_I0_MULTLB, C0_rdata, M.I0.ALUOut, M.I0.MCtrl.RS0, + M_I0_RDataW0 + ); + mux2 #(32) M_I0_RDataW_mux( + M_I0_RDataW0, + M_I0_FLT_ANS, + M.I0.MCtrl.FLT, M.I0.RDataW ); mux5 #(64) M_I0_HILO_mux ( diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 88fee42..08de04c 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -72,6 +72,7 @@ module instr_valid ( 32'b01000010000000000000000000001000: valid = 1'b1; // TLBP 32'b01000010000000000000000000011000: valid = 1'b1; // ERET 32'b011100???????????????00000000010: valid = 1'b1; // MUL + 32'b011100?????00000?????11100110111: valid = 1'b1; // FILTER <----- 32'b100000??????????????????????????: valid = 1'b1; // LB 32'b100001??????????????????????????: valid = 1'b1; // LH 32'b100011??????????????????????????: valid = 1'b1; // LW @@ -174,3 +175,50 @@ endmodule // end // endcase // endmodule + +module Filter ( + input clk, + input word_t s, + input logic en, + input logic clr, + output word_t ans +); + word_t max1, max2; + word_t min1, min2; + word_t sum; + logic [2:0] counter; + + always_ff @(posedge clk) begin + if (en) begin + if (clr) begin + max1 <= 32'h0; + max2 <= 32'h0; + min1 <= 32'hFFFF_FFFF; + min2 <= 32'hFFFF_FFFF; + sum <= 32'h0; + counter <= 3'b0; + end else begin + if (~counter[2]) counter <= counter + 1'b1; + + if ($unsigned(s) > $unsigned(max1)) begin + max2 <= max1; + max1 <= s; + end else if ($unsigned(s) > $unsigned(max2)) begin + max2 <= s; + end + + if ($unsigned(s) < $unsigned(min1)) begin + min2 <= min1; + min1 <= s; + end else if ($unsigned(s) < $unsigned(min2)) begin + min2 <= s; + end + + sum <= sum + s; + end + end + end + + assign ans = counter[2] ? (sum - max1 - max2 - min1 - min2) : 32'h0; + +endmodule diff --git a/src/include/defines.svh b/src/include/defines.svh index 41738ef..a3a0e9f 100644 --- a/src/include/defines.svh +++ b/src/include/defines.svh @@ -76,6 +76,8 @@ typedef struct packed { } ECtrl_t; typedef struct packed { + logic FLT; + logic FLTC; RS0_t RS0; // critical logic HW; // critical logic LW; // critical diff --git a/tools/decoder.py b/tools/decoder.py index 2e7b314..abdd358 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -1,65 +1,66 @@ table = [ - ('00000000000???????????????000000', 'SLL'), - ('00000000000???????????????000010', 'SRL'), - ('00000000000???????????????000011', 'SRA'), - ('000000???????????????00000000100', 'SLLV'), - ('000000???????????????00000000110', 'SRLV'), - ('000000???????????????00000000111', 'SRAV'), - ('000000?????000000000000000001000', 'JR'), - ('000000?????00000?????00000001001', 'JALR'), - ('000000????????????????????001100', 'SYSCALL'), - ('000000????????????????????001101', 'BREAK'), - ('0000000000000000?????00000010000', 'MFHI'), - ('000000?????000000000000000010001', 'MTHI'), - ('0000000000000000?????00000010010', 'MFLO'), - ('000000?????000000000000000010011', 'MTLO'), - ('000000??????????0000000000011000', 'MULT'), - ('000000??????????0000000000011001', 'MULTU'), - ('000000??????????0000000000011010', 'DIV'), - ('000000??????????0000000000011011', 'DIVU'), - ('000000???????????????00000100000', 'ADD'), - ('000000???????????????00000100001', 'ADDU'), - ('000000???????????????00000100010', 'SUB'), - ('000000???????????????00000100011', 'SUBU'), - ('000000???????????????00000100100', 'AND'), - ('000000???????????????00000100101', 'OR'), - ('000000???????????????00000100110', 'XOR'), - ('000000???????????????00000100111', 'NOR'), - ('000000???????????????00000101010', 'SLT'), - ('000000???????????????00000101011', 'SLTU'), - ('000001?????00000????????????????', 'BLTZ'), - ('000001?????10000????????????????', 'BLTZAL'), - ('000001?????00001????????????????', 'BGEZ'), - ('000001?????10001????????????????', 'BGEZAL'), - ('000010??????????????????????????', 'J'), - ('000011??????????????????????????', 'JAL'), - ('000100??????????????????????????', 'BEQ'), - ('000101??????????????????????????', 'BNE'), - ('000110?????00000????????????????', 'BLEZ'), - ('000111?????00000????????????????', 'BGTZ'), - ('001000??????????????????????????', 'ADDI'), - ('001001??????????????????????????', 'ADDIU'), - ('001010??????????????????????????', 'SLTI'), - ('001011??????????????????????????', 'SLTIU'), - ('001100??????????????????????????', 'ANDI'), - ('001101??????????????????????????', 'ORI'), - ('001110??????????????????????????', 'XORI'), - ('00111100000?????????????????????', 'LUI'), - ('01000000000??????????00000000???', 'MFC0'), - ('01000000100??????????00000000???', 'MTC0'), - ('01000010000000000000000000000001', 'TLBR'), - ('01000010000000000000000000000010', 'TLBWI'), - ('01000010000000000000000000001000', 'TLBP'), - ('01000010000000000000000000011000', 'ERET'), - ('011100???????????????00000000010', 'MUL'), - ('100000??????????????????????????', 'LB'), - ('100001??????????????????????????', 'LH'), - ('100011??????????????????????????', 'LW'), - ('100100??????????????????????????', 'LBU'), - ('100101??????????????????????????', 'LHU'), - ('101000??????????????????????????', 'SB'), - ('101001??????????????????????????', 'SH'), - ('101011??????????????????????????', 'SW'), + # ('00000000000???????????????000000', 'SLL'), + # ('00000000000???????????????000010', 'SRL'), + # ('00000000000???????????????000011', 'SRA'), + # ('000000???????????????00000000100', 'SLLV'), + # ('000000???????????????00000000110', 'SRLV'), + # ('000000???????????????00000000111', 'SRAV'), + # ('000000?????000000000000000001000', 'JR'), + # ('000000?????00000?????00000001001', 'JALR'), + # ('000000????????????????????001100', 'SYSCALL'), + # ('000000????????????????????001101', 'BREAK'), + # ('0000000000000000?????00000010000', 'MFHI'), + # ('000000?????000000000000000010001', 'MTHI'), + # ('0000000000000000?????00000010010', 'MFLO'), + # ('000000?????000000000000000010011', 'MTLO'), + # ('000000??????????0000000000011000', 'MULT'), + # ('000000??????????0000000000011001', 'MULTU'), + # ('000000??????????0000000000011010', 'DIV'), + # ('000000??????????0000000000011011', 'DIVU'), + # ('000000???????????????00000100000', 'ADD'), + # ('000000???????????????00000100001', 'ADDU'), + # ('000000???????????????00000100010', 'SUB'), + # ('000000???????????????00000100011', 'SUBU'), + # ('000000???????????????00000100100', 'AND'), + # ('000000???????????????00000100101', 'OR'), + # ('000000???????????????00000100110', 'XOR'), + # ('000000???????????????00000100111', 'NOR'), + # ('000000???????????????00000101010', 'SLT'), + # ('000000???????????????00000101011', 'SLTU'), + # ('000001?????00000????????????????', 'BLTZ'), + # ('000001?????10000????????????????', 'BLTZAL'), + # ('000001?????00001????????????????', 'BGEZ'), + # ('000001?????10001????????????????', 'BGEZAL'), + # ('000010??????????????????????????', 'J'), + # ('000011??????????????????????????', 'JAL'), + # ('000100??????????????????????????', 'BEQ'), + # ('000101??????????????????????????', 'BNE'), + # ('000110?????00000????????????????', 'BLEZ'), + # ('000111?????00000????????????????', 'BGTZ'), + # ('001000??????????????????????????', 'ADDI'), + # ('001001??????????????????????????', 'ADDIU'), + # ('001010??????????????????????????', 'SLTI'), + # ('001011??????????????????????????', 'SLTIU'), + # ('001100??????????????????????????', 'ANDI'), + # ('001101??????????????????????????', 'ORI'), + # ('001110??????????????????????????', 'XORI'), + # ('00111100000?????????????????????', 'LUI'), + # ('01000000000??????????00000000???', 'MFC0'), + # ('01000000100??????????00000000???', 'MTC0'), + # ('01000010000000000000000000000001', 'TLBR'), + # ('01000010000000000000000000000010', 'TLBWI'), + # ('01000010000000000000000000001000', 'TLBP'), + # ('01000010000000000000000000011000', 'ERET'), + # ('011100???????????????00000000010', 'MUL'), + # ('100000??????????????????????????', 'LB'), + # ('100001??????????????????????????', 'LH'), + # ('100011??????????????????????????', 'LW'), + # ('100100??????????????????????????', 'LBU'), + # ('100101??????????????????????????', 'LHU'), + # ('101000??????????????????????????', 'SB'), + # ('101001??????????????????????????', 'SH'), + # ('101011??????????????????????????', 'SW'), + ('011100?????00000?????11100110111', 'FILTER'), ] class Boolean: @@ -119,7 +120,7 @@ for inst, name in table: ctrl['MCtrl0_LW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | inst[1] & inst[0]) ctrl['MCtrl0_HLS'] = (~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]) ctrl['MCtrl0_C0W'] = inst[30] & ~inst[29] & inst[23] & ~inst[3] - ctrl['MCtrl0_RS0'] = (ctrl['DP1'], inst[30], ~inst[29] & (inst[30] | ~inst[1])) + ctrl['MCtrl0_RS0'] = (~inst[30] & (inst[29] | inst[26] | ~inst[4]), inst[30], ~inst[29] & (inst[30] | ~inst[1])) ctrl['MCtrl1_MR'] = inst[31] ctrl['MCtrl1_MWR'] = inst[29] @@ -128,6 +129,6 @@ for inst, name in table: ctrl['MCtrl1_TLBWI'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1] ctrl['MCtrl1_TLBP'] = inst[30] & ~inst[4] & inst[3] - ctrl['WCtrl_RW'] = (~inst[30] & (~inst[29] & (inst[31] | ~inst[28] & (~inst[27] & (~inst[26] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (inst[5] | ~inst[4] & ~inst[2] & inst[0])) | inst[26] & inst[20]) | inst[27] & inst[26])) | inst[29] & ~inst[31]) | inst[30] & ~inst[25] & ~inst[23]) + ctrl['WCtrl_RW'] = ~inst[30] & (~inst[29] & (inst[31] | ~inst[28] & (~inst[27] & (~inst[26] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (inst[5] | ~inst[4] & ~inst[2] & inst[0])) | inst[26] & inst[20]) | inst[27] & inst[26])) | inst[29] & ~inst[31]) | inst[30] & (inst[29] | ~inst[25] & ~inst[23]) ctrl['RD'] = (~inst[29] & (inst[31] | inst[30]) | inst[29] & ~inst[30], inst[26]) print(ctrl) diff --git a/tools/filter.py b/tools/filter.py new file mode 100644 index 0000000..987a7bf --- /dev/null +++ b/tools/filter.py @@ -0,0 +1,37 @@ +max1 = 0 +max2 = 0 +min1 = (1 << 32) - 1 +min2 = (1 << 32) - 1 +sum = 0 + +def flt(s, rst): + global max1, max2, min1, min2, sum + if rst: + max1 = 0 + max2 = 0 + min1 = (1 << 32) - 1 + min2 = (1 << 32) - 1 + sum = 0 + else: + sum += s + if (s > max1): + max2 = max1 + max1 = s + elif (s > max2): + max2 = s + if (s < min1): + min2 = min1 + min1 = s + elif (s < min2): + min2 = s + return (sum - max1 - max2 - min1 - min2) & 0xffffffff + +print(flt(1, False)) +print(flt(2, False)) +print(flt(3, False)) +print(flt(4, False)) + +print(flt(1, False)) +print(flt(2, False)) +print(flt(3, False)) +print(flt(4, False)) diff --git a/tools/global.txt b/tools/global.txt index e9cae6d..fca77dc 100644 --- a/tools/global.txt +++ b/tools/global.txt @@ -52,6 +52,7 @@ 32'b01000010000000000000000000001000 0 0 0 0 0 0 0 0 0 1 // TLBP 32'b01000010000000000000000000011000 0 0 1 0 0 0 0 0 1 1 // ERET 32'b011100???????????????00000000010 0 0 0 0 1 1 0 0 1 0 // MUL +32'b011100?????00000?????11100110111 0 0 0 0 1 0 0 0 1 0 // FILTER <--- 32'b100000?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LB 32'b100001?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LH 32'b100011?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LW diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index de0017c..8628e94 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -1,62 +1,63 @@ -////-------------------------------- HW LW HLS HLS2 HLS1 HLS0 C0W RS0 RS02 RS01 RS00 -32'b00000000000???????????????000000 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLL -32'b00000000000???????????????000010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRL -32'b00000000000???????????????000011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRA -32'b000000???????????????00000000100 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLLV -32'b000000???????????????00000000110 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRLV -32'b000000???????????????00000000111 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRAV -32'b000000?????000000000000000001000 0 0 ? 0 ? ? 0 ? ? ? ? // JR -32'b000000?????00000?????00000001001 0 0 ? 0 ? ? 0 ALU 1 ? ? // JALR -32'b000000????????????????????001100 0 0 ? 0 ? ? 0 ? ? ? ? // SYSCALL -32'b000000????????????????????001101 0 0 ? 0 ? ? 0 ? ? ? ? // BREAK -32'b0000000000000000?????00000010000 0 0 ? 0 ? ? 0 HI 0 0 1 // MFHI -32'b000000?????000000000000000010001 1 0 RS 0 ? ? 0 ? ? ? ? // MTHI -32'b0000000000000000?????00000010010 0 0 ? 0 ? ? 0 LO 0 0 0 // MFLO -32'b000000?????000000000000000010011 0 1 RS 0 ? ? 0 ? ? ? ? // MTLO -32'b000000??????????0000000000011000 1 1 MULT 1 0 0 0 ? ? ? ? // MULT -32'b000000??????????0000000000011001 1 1 MULTU 1 0 1 0 ? ? ? ? // MULTU -32'b000000??????????0000000000011010 1 1 DIV 1 1 0 0 ? ? ? ? // DIV -32'b000000??????????0000000000011011 1 1 DIVU 1 1 1 0 ? ? ? ? // DIVU -32'b000000???????????????00000100000 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADD -32'b000000???????????????00000100001 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDU -32'b000000???????????????00000100010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUB -32'b000000???????????????00000100011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUBU -32'b000000???????????????00000100100 0 0 ? 0 ? ? 0 ALU 1 ? ? // AND -32'b000000???????????????00000100101 0 0 ? 0 ? ? 0 ALU 1 ? ? // OR -32'b000000???????????????00000100110 0 0 ? 0 ? ? 0 ALU 1 ? ? // XOR -32'b000000???????????????00000100111 0 0 ? 0 ? ? 0 ALU 1 ? ? // NOR -32'b000000???????????????00000101010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLT -32'b000000???????????????00000101011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTU -32'b000001?????00000???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BLTZ -32'b000001?????10000???????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // BLTZAL -32'b000001?????00001???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BGEZ -32'b000001?????10001???????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // BGEZAL -32'b000010?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // J -32'b000011?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // JAL -32'b000100?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BEQ -32'b000101?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BNE -32'b000110?????00000???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BLEZ -32'b000111?????00000???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BGTZ -32'b001000?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDI -32'b001001?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDIU -32'b001010?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTI -32'b001011?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTIU -32'b001100?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ANDI -32'b001101?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ORI -32'b001110?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // XORI -32'b00111100000????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // LUI -32'b01000000000??????????00000000??? 0 0 ? 0 ? ? 0 C0 0 1 1 // MFC0 -32'b01000000100??????????00000000??? 0 0 ? 0 ? ? 1 ? ? ? ? // MTC0 -32'b01000010000000000000000000000001 ? ? ? 0 ? ? 0 ? ? ? ? // TLBR -32'b01000010000000000000000000000010 ? ? ? 0 ? ? 0 ? ? ? ? // TLBWI -32'b01000010000000000000000000001000 ? ? ? 0 ? ? 0 ? ? ? ? // TLBP -32'b01000010000000000000000000011000 0 0 ? 0 ? ? 0 ? ? ? ? // ERET -32'b011100???????????????00000000010 0 0 MUL? 1 0 ? 0 MUL 0 1 0 // MUL -32'b100000?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LB -32'b100001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LH -32'b100011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LW -32'b100100?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LBU -32'b100101?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LHU -32'b101000?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SB -32'b101001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SH -32'b101011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SW \ No newline at end of file +////-------------------------------- FLT HW LW HLS HLS2 HLS1 HLS0 C0W RS0 RS02 RS01 RS00 +32'b00000000000???????????????000000 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLL +32'b00000000000???????????????000010 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRL +32'b00000000000???????????????000011 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRA +32'b000000???????????????00000000100 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLLV +32'b000000???????????????00000000110 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRLV +32'b000000???????????????00000000111 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRAV +32'b000000?????000000000000000001000 0 0 0 ? 0 ? ? 0 ? ? ? ? // JR +32'b000000?????00000?????00000001001 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // JALR +32'b000000????????????????????001100 0 0 0 ? 0 ? ? 0 ? ? ? ? // SYSCALL +32'b000000????????????????????001101 0 0 0 ? 0 ? ? 0 ? ? ? ? // BREAK +32'b0000000000000000?????00000010000 0 0 0 ? 0 ? ? 0 HI 0 0 1 // MFHI +32'b000000?????000000000000000010001 0 1 0 RS 0 ? ? 0 ? ? ? ? // MTHI +32'b0000000000000000?????00000010010 0 0 0 ? 0 ? ? 0 LO 0 0 0 // MFLO +32'b000000?????000000000000000010011 0 0 1 RS 0 ? ? 0 ? ? ? ? // MTLO +32'b000000??????????0000000000011000 0 1 1 MULT 1 0 0 0 ? ? ? ? // MULT +32'b000000??????????0000000000011001 0 1 1 MULTU 1 0 1 0 ? ? ? ? // MULTU +32'b000000??????????0000000000011010 0 1 1 DIV 1 1 0 0 ? ? ? ? // DIV +32'b000000??????????0000000000011011 0 1 1 DIVU 1 1 1 0 ? ? ? ? // DIVU +32'b000000???????????????00000100000 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADD +32'b000000???????????????00000100001 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDU +32'b000000???????????????00000100010 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUB +32'b000000???????????????00000100011 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUBU +32'b000000???????????????00000100100 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // AND +32'b000000???????????????00000100101 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // OR +32'b000000???????????????00000100110 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // XOR +32'b000000???????????????00000100111 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // NOR +32'b000000???????????????00000101010 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLT +32'b000000???????????????00000101011 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTU +32'b000001?????00000???????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BLTZ +32'b000001?????10000???????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // BLTZAL +32'b000001?????00001???????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BGEZ +32'b000001?????10001???????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // BGEZAL +32'b000010?????????????????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // J +32'b000011?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // JAL +32'b000100?????????????????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BEQ +32'b000101?????????????????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BNE +32'b000110?????00000???????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BLEZ +32'b000111?????00000???????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BGTZ +32'b001000?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDI +32'b001001?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDIU +32'b001010?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTI +32'b001011?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTIU +32'b001100?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ANDI +32'b001101?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ORI +32'b001110?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // XORI +32'b00111100000????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // LUI +32'b01000000000??????????00000000??? 0 0 0 ? 0 ? ? 0 C0 0 1 1 // MFC0 +32'b01000000100??????????00000000??? 0 0 0 ? 0 ? ? 1 ? ? ? ? // MTC0 +32'b01000010000000000000000000000001 ? ? ? ? 0 ? ? 0 ? ? ? ? // TLBR +32'b01000010000000000000000000000010 ? ? ? ? 0 ? ? 0 ? ? ? ? // TLBWI +32'b01000010000000000000000000001000 ? ? ? ? 0 ? ? 0 ? ? ? ? // TLBP +32'b01000010000000000000000000011000 0 0 0 ? 0 ? ? 0 ? ? ? ? // ERET +32'b011100???????????????00000000010 0 0 0 MUL? 1 0 ? 0 MUL 0 1 0 // MUL +32'b011100?????00000?????11100110111 1 0 0 ? 0 ? ? 0 MUL 0 1 0 // FILTER <-- +32'b100000?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LB +32'b100001?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LH +32'b100011?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LW +32'b100100?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LBU +32'b100101?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LHU +32'b101000?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // SB +32'b101001?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // SH +32'b101011?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // SW \ No newline at end of file