nscscc2021 filter
This commit is contained in:
parent
e99dcb73cb
commit
f7acf70094
BIN
20210817_ok/final_inst_test.zip
Executable file
BIN
20210817_ok/final_inst_test.zip
Executable file
Binary file not shown.
BIN
20210817_ok/指令集答题.pdf
Executable file
BIN
20210817_ok/指令集答题.pdf
Executable file
Binary file not shown.
@ -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.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.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.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.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.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];
|
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.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.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.FLT = inst[30] & inst[10];
|
||||||
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.FLTC = inst[25:21] == 0 & inst[15:11] == 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.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.C0D = inst[15:11];
|
||||||
assign ctrl.MCtrl0.C0W = inst[30] & ~inst[29] & inst[23] & ~inst[3];
|
assign ctrl.MCtrl0.C0W = inst[30] & ~inst[29] & inst[23] & ~inst[3];
|
||||||
assign ctrl.MCtrl0.SEL = inst[2:0];
|
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.MR = inst[31];
|
||||||
assign ctrl.MCtrl1.MWR = inst[29];
|
assign ctrl.MCtrl1.MWR = inst[29];
|
||||||
|
@ -226,6 +226,8 @@ module Datapath (
|
|||||||
|
|
||||||
word_t M_I0_HI;
|
word_t M_I0_HI;
|
||||||
word_t M_I0_LO;
|
word_t M_I0_LO;
|
||||||
|
word_t M_I0_FLT_ANS;
|
||||||
|
word_t M_I0_RDataW0;
|
||||||
|
|
||||||
logic M_I1_NowExcValid;
|
logic M_I1_NowExcValid;
|
||||||
logic M_I1_PrevExcValid;
|
logic M_I1_PrevExcValid;
|
||||||
@ -497,11 +499,11 @@ module Datapath (
|
|||||||
// TODO: CACHE
|
// TODO: CACHE
|
||||||
| D.IA.MCtrl1.TLBR & D.IB.MCtrl0.C0W
|
| D.IA.MCtrl1.TLBR & D.IB.MCtrl0.C0W
|
||||||
| D.IA.MCtrl1.TLBP & 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.WCtrl.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.WCtrl.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.WCtrl.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.TLBR & D.IB.WCtrl.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.TLBP & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_INDEX & D.IB.MCtrl0.RS0 == C0
|
||||||
// Hazards Related to Exceptions or Interrupts
|
// Hazards Related to Exceptions or Interrupts
|
||||||
| D.IA.MCtrl0.C0W & D.IB.ERET & D.IA.MCtrl0.C0D == C0_EPC
|
| D.IA.MCtrl0.C0W & D.IB.ERET & D.IA.MCtrl0.C0D == C0_EPC
|
||||||
;
|
;
|
||||||
@ -672,7 +674,7 @@ module Datapath (
|
|||||||
E.en,
|
E.en,
|
||||||
E.I0.ECtrl
|
E.I0.ECtrl
|
||||||
);
|
);
|
||||||
ffenrc #(17) E_I0_MCtrl_ff (
|
ffenrc #(19) E_I0_MCtrl_ff (
|
||||||
clk,
|
clk,
|
||||||
rst | rstM,
|
rst | rstM,
|
||||||
D.I0.MCtrl,
|
D.I0.MCtrl,
|
||||||
@ -968,7 +970,7 @@ module Datapath (
|
|||||||
M.en,
|
M.en,
|
||||||
M.I0.ALUOut
|
M.I0.ALUOut
|
||||||
);
|
);
|
||||||
ffenrc #(17) M_I0_MCtrl_ff (
|
ffenrc #(19) M_I0_MCtrl_ff (
|
||||||
clk,
|
clk,
|
||||||
rst | rstM,
|
rst | rstM,
|
||||||
E.I0.MCtrl,
|
E.I0.MCtrl,
|
||||||
@ -976,6 +978,16 @@ module Datapath (
|
|||||||
~E_go | ~E_I0_go,
|
~E_go | ~E_I0_go,
|
||||||
M.I0.MCtrl
|
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 (
|
ffenrc #(5 + 1) M_I0_WCtrl_ff (
|
||||||
clk,
|
clk,
|
||||||
rst | rstM,
|
rst | rstM,
|
||||||
@ -1110,13 +1122,19 @@ module Datapath (
|
|||||||
);
|
);
|
||||||
|
|
||||||
// M.I0.HILOC0
|
// M.I0.HILOC0
|
||||||
mux5 #(32) M_I0_RDataW_mux (
|
mux5 #(32) M_I0_RDataW0_mux (
|
||||||
LO,
|
LO,
|
||||||
HI,
|
HI,
|
||||||
M_I0_MULTLB,
|
M_I0_MULTLB,
|
||||||
C0_rdata,
|
C0_rdata,
|
||||||
M.I0.ALUOut,
|
M.I0.ALUOut,
|
||||||
M.I0.MCtrl.RS0,
|
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
|
M.I0.RDataW
|
||||||
);
|
);
|
||||||
mux5 #(64) M_I0_HILO_mux (
|
mux5 #(64) M_I0_HILO_mux (
|
||||||
|
@ -72,6 +72,7 @@ module instr_valid (
|
|||||||
32'b01000010000000000000000000001000: valid = 1'b1; // TLBP
|
32'b01000010000000000000000000001000: valid = 1'b1; // TLBP
|
||||||
32'b01000010000000000000000000011000: valid = 1'b1; // ERET
|
32'b01000010000000000000000000011000: valid = 1'b1; // ERET
|
||||||
32'b011100???????????????00000000010: valid = 1'b1; // MUL
|
32'b011100???????????????00000000010: valid = 1'b1; // MUL
|
||||||
|
32'b011100?????00000?????11100110111: valid = 1'b1; // FILTER <-----
|
||||||
32'b100000??????????????????????????: valid = 1'b1; // LB
|
32'b100000??????????????????????????: valid = 1'b1; // LB
|
||||||
32'b100001??????????????????????????: valid = 1'b1; // LH
|
32'b100001??????????????????????????: valid = 1'b1; // LH
|
||||||
32'b100011??????????????????????????: valid = 1'b1; // LW
|
32'b100011??????????????????????????: valid = 1'b1; // LW
|
||||||
@ -174,3 +175,50 @@ endmodule
|
|||||||
// end
|
// end
|
||||||
// endcase
|
// endcase
|
||||||
// endmodule
|
// 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
|
||||||
|
@ -76,6 +76,8 @@ typedef struct packed {
|
|||||||
} ECtrl_t;
|
} ECtrl_t;
|
||||||
|
|
||||||
typedef struct packed {
|
typedef struct packed {
|
||||||
|
logic FLT;
|
||||||
|
logic FLTC;
|
||||||
RS0_t RS0; // critical
|
RS0_t RS0; // critical
|
||||||
logic HW; // critical
|
logic HW; // critical
|
||||||
logic LW; // critical
|
logic LW; // critical
|
||||||
|
127
tools/decoder.py
127
tools/decoder.py
@ -1,65 +1,66 @@
|
|||||||
table = [
|
table = [
|
||||||
('00000000000???????????????000000', 'SLL'),
|
# ('00000000000???????????????000000', 'SLL'),
|
||||||
('00000000000???????????????000010', 'SRL'),
|
# ('00000000000???????????????000010', 'SRL'),
|
||||||
('00000000000???????????????000011', 'SRA'),
|
# ('00000000000???????????????000011', 'SRA'),
|
||||||
('000000???????????????00000000100', 'SLLV'),
|
# ('000000???????????????00000000100', 'SLLV'),
|
||||||
('000000???????????????00000000110', 'SRLV'),
|
# ('000000???????????????00000000110', 'SRLV'),
|
||||||
('000000???????????????00000000111', 'SRAV'),
|
# ('000000???????????????00000000111', 'SRAV'),
|
||||||
('000000?????000000000000000001000', 'JR'),
|
# ('000000?????000000000000000001000', 'JR'),
|
||||||
('000000?????00000?????00000001001', 'JALR'),
|
# ('000000?????00000?????00000001001', 'JALR'),
|
||||||
('000000????????????????????001100', 'SYSCALL'),
|
# ('000000????????????????????001100', 'SYSCALL'),
|
||||||
('000000????????????????????001101', 'BREAK'),
|
# ('000000????????????????????001101', 'BREAK'),
|
||||||
('0000000000000000?????00000010000', 'MFHI'),
|
# ('0000000000000000?????00000010000', 'MFHI'),
|
||||||
('000000?????000000000000000010001', 'MTHI'),
|
# ('000000?????000000000000000010001', 'MTHI'),
|
||||||
('0000000000000000?????00000010010', 'MFLO'),
|
# ('0000000000000000?????00000010010', 'MFLO'),
|
||||||
('000000?????000000000000000010011', 'MTLO'),
|
# ('000000?????000000000000000010011', 'MTLO'),
|
||||||
('000000??????????0000000000011000', 'MULT'),
|
# ('000000??????????0000000000011000', 'MULT'),
|
||||||
('000000??????????0000000000011001', 'MULTU'),
|
# ('000000??????????0000000000011001', 'MULTU'),
|
||||||
('000000??????????0000000000011010', 'DIV'),
|
# ('000000??????????0000000000011010', 'DIV'),
|
||||||
('000000??????????0000000000011011', 'DIVU'),
|
# ('000000??????????0000000000011011', 'DIVU'),
|
||||||
('000000???????????????00000100000', 'ADD'),
|
# ('000000???????????????00000100000', 'ADD'),
|
||||||
('000000???????????????00000100001', 'ADDU'),
|
# ('000000???????????????00000100001', 'ADDU'),
|
||||||
('000000???????????????00000100010', 'SUB'),
|
# ('000000???????????????00000100010', 'SUB'),
|
||||||
('000000???????????????00000100011', 'SUBU'),
|
# ('000000???????????????00000100011', 'SUBU'),
|
||||||
('000000???????????????00000100100', 'AND'),
|
# ('000000???????????????00000100100', 'AND'),
|
||||||
('000000???????????????00000100101', 'OR'),
|
# ('000000???????????????00000100101', 'OR'),
|
||||||
('000000???????????????00000100110', 'XOR'),
|
# ('000000???????????????00000100110', 'XOR'),
|
||||||
('000000???????????????00000100111', 'NOR'),
|
# ('000000???????????????00000100111', 'NOR'),
|
||||||
('000000???????????????00000101010', 'SLT'),
|
# ('000000???????????????00000101010', 'SLT'),
|
||||||
('000000???????????????00000101011', 'SLTU'),
|
# ('000000???????????????00000101011', 'SLTU'),
|
||||||
('000001?????00000????????????????', 'BLTZ'),
|
# ('000001?????00000????????????????', 'BLTZ'),
|
||||||
('000001?????10000????????????????', 'BLTZAL'),
|
# ('000001?????10000????????????????', 'BLTZAL'),
|
||||||
('000001?????00001????????????????', 'BGEZ'),
|
# ('000001?????00001????????????????', 'BGEZ'),
|
||||||
('000001?????10001????????????????', 'BGEZAL'),
|
# ('000001?????10001????????????????', 'BGEZAL'),
|
||||||
('000010??????????????????????????', 'J'),
|
# ('000010??????????????????????????', 'J'),
|
||||||
('000011??????????????????????????', 'JAL'),
|
# ('000011??????????????????????????', 'JAL'),
|
||||||
('000100??????????????????????????', 'BEQ'),
|
# ('000100??????????????????????????', 'BEQ'),
|
||||||
('000101??????????????????????????', 'BNE'),
|
# ('000101??????????????????????????', 'BNE'),
|
||||||
('000110?????00000????????????????', 'BLEZ'),
|
# ('000110?????00000????????????????', 'BLEZ'),
|
||||||
('000111?????00000????????????????', 'BGTZ'),
|
# ('000111?????00000????????????????', 'BGTZ'),
|
||||||
('001000??????????????????????????', 'ADDI'),
|
# ('001000??????????????????????????', 'ADDI'),
|
||||||
('001001??????????????????????????', 'ADDIU'),
|
# ('001001??????????????????????????', 'ADDIU'),
|
||||||
('001010??????????????????????????', 'SLTI'),
|
# ('001010??????????????????????????', 'SLTI'),
|
||||||
('001011??????????????????????????', 'SLTIU'),
|
# ('001011??????????????????????????', 'SLTIU'),
|
||||||
('001100??????????????????????????', 'ANDI'),
|
# ('001100??????????????????????????', 'ANDI'),
|
||||||
('001101??????????????????????????', 'ORI'),
|
# ('001101??????????????????????????', 'ORI'),
|
||||||
('001110??????????????????????????', 'XORI'),
|
# ('001110??????????????????????????', 'XORI'),
|
||||||
('00111100000?????????????????????', 'LUI'),
|
# ('00111100000?????????????????????', 'LUI'),
|
||||||
('01000000000??????????00000000???', 'MFC0'),
|
# ('01000000000??????????00000000???', 'MFC0'),
|
||||||
('01000000100??????????00000000???', 'MTC0'),
|
# ('01000000100??????????00000000???', 'MTC0'),
|
||||||
('01000010000000000000000000000001', 'TLBR'),
|
# ('01000010000000000000000000000001', 'TLBR'),
|
||||||
('01000010000000000000000000000010', 'TLBWI'),
|
# ('01000010000000000000000000000010', 'TLBWI'),
|
||||||
('01000010000000000000000000001000', 'TLBP'),
|
# ('01000010000000000000000000001000', 'TLBP'),
|
||||||
('01000010000000000000000000011000', 'ERET'),
|
# ('01000010000000000000000000011000', 'ERET'),
|
||||||
('011100???????????????00000000010', 'MUL'),
|
# ('011100???????????????00000000010', 'MUL'),
|
||||||
('100000??????????????????????????', 'LB'),
|
# ('100000??????????????????????????', 'LB'),
|
||||||
('100001??????????????????????????', 'LH'),
|
# ('100001??????????????????????????', 'LH'),
|
||||||
('100011??????????????????????????', 'LW'),
|
# ('100011??????????????????????????', 'LW'),
|
||||||
('100100??????????????????????????', 'LBU'),
|
# ('100100??????????????????????????', 'LBU'),
|
||||||
('100101??????????????????????????', 'LHU'),
|
# ('100101??????????????????????????', 'LHU'),
|
||||||
('101000??????????????????????????', 'SB'),
|
# ('101000??????????????????????????', 'SB'),
|
||||||
('101001??????????????????????????', 'SH'),
|
# ('101001??????????????????????????', 'SH'),
|
||||||
('101011??????????????????????????', 'SW'),
|
# ('101011??????????????????????????', 'SW'),
|
||||||
|
('011100?????00000?????11100110111', 'FILTER'),
|
||||||
]
|
]
|
||||||
|
|
||||||
class Boolean:
|
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_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_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_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_MR'] = inst[31]
|
||||||
ctrl['MCtrl1_MWR'] = inst[29]
|
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_TLBWI'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1]
|
||||||
ctrl['MCtrl1_TLBP'] = inst[30] & ~inst[4] & inst[3]
|
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])
|
ctrl['RD'] = (~inst[29] & (inst[31] | inst[30]) | inst[29] & ~inst[30], inst[26])
|
||||||
print(ctrl)
|
print(ctrl)
|
||||||
|
37
tools/filter.py
Normal file
37
tools/filter.py
Normal file
@ -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))
|
@ -52,6 +52,7 @@
|
|||||||
32'b01000010000000000000000000001000 0 0 0 0 0 0 0 0 0 1 // TLBP
|
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'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???????????????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'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'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
|
32'b100011?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LW
|
||||||
|
125
tools/mctrl0.txt
125
tools/mctrl0.txt
@ -1,62 +1,63 @@
|
|||||||
////-------------------------------- HW LW HLS HLS2 HLS1 HLS0 C0W RS0 RS02 RS01 RS00
|
////-------------------------------- FLT HW LW HLS HLS2 HLS1 HLS0 C0W RS0 RS02 RS01 RS00
|
||||||
32'b00000000000???????????????000000 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLL
|
32'b00000000000???????????????000000 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLL
|
||||||
32'b00000000000???????????????000010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRL
|
32'b00000000000???????????????000010 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRL
|
||||||
32'b00000000000???????????????000011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRA
|
32'b00000000000???????????????000011 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRA
|
||||||
32'b000000???????????????00000000100 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLLV
|
32'b000000???????????????00000000100 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLLV
|
||||||
32'b000000???????????????00000000110 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRLV
|
32'b000000???????????????00000000110 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRLV
|
||||||
32'b000000???????????????00000000111 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRAV
|
32'b000000???????????????00000000111 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRAV
|
||||||
32'b000000?????000000000000000001000 0 0 ? 0 ? ? 0 ? ? ? ? // JR
|
32'b000000?????000000000000000001000 0 0 0 ? 0 ? ? 0 ? ? ? ? // JR
|
||||||
32'b000000?????00000?????00000001001 0 0 ? 0 ? ? 0 ALU 1 ? ? // JALR
|
32'b000000?????00000?????00000001001 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // JALR
|
||||||
32'b000000????????????????????001100 0 0 ? 0 ? ? 0 ? ? ? ? // SYSCALL
|
32'b000000????????????????????001100 0 0 0 ? 0 ? ? 0 ? ? ? ? // SYSCALL
|
||||||
32'b000000????????????????????001101 0 0 ? 0 ? ? 0 ? ? ? ? // BREAK
|
32'b000000????????????????????001101 0 0 0 ? 0 ? ? 0 ? ? ? ? // BREAK
|
||||||
32'b0000000000000000?????00000010000 0 0 ? 0 ? ? 0 HI 0 0 1 // MFHI
|
32'b0000000000000000?????00000010000 0 0 0 ? 0 ? ? 0 HI 0 0 1 // MFHI
|
||||||
32'b000000?????000000000000000010001 1 0 RS 0 ? ? 0 ? ? ? ? // MTHI
|
32'b000000?????000000000000000010001 0 1 0 RS 0 ? ? 0 ? ? ? ? // MTHI
|
||||||
32'b0000000000000000?????00000010010 0 0 ? 0 ? ? 0 LO 0 0 0 // MFLO
|
32'b0000000000000000?????00000010010 0 0 0 ? 0 ? ? 0 LO 0 0 0 // MFLO
|
||||||
32'b000000?????000000000000000010011 0 1 RS 0 ? ? 0 ? ? ? ? // MTLO
|
32'b000000?????000000000000000010011 0 0 1 RS 0 ? ? 0 ? ? ? ? // MTLO
|
||||||
32'b000000??????????0000000000011000 1 1 MULT 1 0 0 0 ? ? ? ? // MULT
|
32'b000000??????????0000000000011000 0 1 1 MULT 1 0 0 0 ? ? ? ? // MULT
|
||||||
32'b000000??????????0000000000011001 1 1 MULTU 1 0 1 0 ? ? ? ? // MULTU
|
32'b000000??????????0000000000011001 0 1 1 MULTU 1 0 1 0 ? ? ? ? // MULTU
|
||||||
32'b000000??????????0000000000011010 1 1 DIV 1 1 0 0 ? ? ? ? // DIV
|
32'b000000??????????0000000000011010 0 1 1 DIV 1 1 0 0 ? ? ? ? // DIV
|
||||||
32'b000000??????????0000000000011011 1 1 DIVU 1 1 1 0 ? ? ? ? // DIVU
|
32'b000000??????????0000000000011011 0 1 1 DIVU 1 1 1 0 ? ? ? ? // DIVU
|
||||||
32'b000000???????????????00000100000 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADD
|
32'b000000???????????????00000100000 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADD
|
||||||
32'b000000???????????????00000100001 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDU
|
32'b000000???????????????00000100001 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDU
|
||||||
32'b000000???????????????00000100010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUB
|
32'b000000???????????????00000100010 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUB
|
||||||
32'b000000???????????????00000100011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUBU
|
32'b000000???????????????00000100011 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUBU
|
||||||
32'b000000???????????????00000100100 0 0 ? 0 ? ? 0 ALU 1 ? ? // AND
|
32'b000000???????????????00000100100 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // AND
|
||||||
32'b000000???????????????00000100101 0 0 ? 0 ? ? 0 ALU 1 ? ? // OR
|
32'b000000???????????????00000100101 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // OR
|
||||||
32'b000000???????????????00000100110 0 0 ? 0 ? ? 0 ALU 1 ? ? // XOR
|
32'b000000???????????????00000100110 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // XOR
|
||||||
32'b000000???????????????00000100111 0 0 ? 0 ? ? 0 ALU 1 ? ? // NOR
|
32'b000000???????????????00000100111 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // NOR
|
||||||
32'b000000???????????????00000101010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLT
|
32'b000000???????????????00000101010 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLT
|
||||||
32'b000000???????????????00000101011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTU
|
32'b000000???????????????00000101011 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTU
|
||||||
32'b000001?????00000???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BLTZ
|
32'b000001?????00000???????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BLTZ
|
||||||
32'b000001?????10000???????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // BLTZAL
|
32'b000001?????10000???????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // BLTZAL
|
||||||
32'b000001?????00001???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BGEZ
|
32'b000001?????00001???????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BGEZ
|
||||||
32'b000001?????10001???????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // BGEZAL
|
32'b000001?????10001???????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // BGEZAL
|
||||||
32'b000010?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // J
|
32'b000010?????????????????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // J
|
||||||
32'b000011?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // JAL
|
32'b000011?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // JAL
|
||||||
32'b000100?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BEQ
|
32'b000100?????????????????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BEQ
|
||||||
32'b000101?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BNE
|
32'b000101?????????????????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BNE
|
||||||
32'b000110?????00000???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BLEZ
|
32'b000110?????00000???????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BLEZ
|
||||||
32'b000111?????00000???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BGTZ
|
32'b000111?????00000???????????????? 0 0 0 ? 0 ? ? 0 ? ? ? ? // BGTZ
|
||||||
32'b001000?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDI
|
32'b001000?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDI
|
||||||
32'b001001?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDIU
|
32'b001001?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDIU
|
||||||
32'b001010?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTI
|
32'b001010?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTI
|
||||||
32'b001011?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTIU
|
32'b001011?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTIU
|
||||||
32'b001100?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ANDI
|
32'b001100?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ANDI
|
||||||
32'b001101?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ORI
|
32'b001101?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // ORI
|
||||||
32'b001110?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // XORI
|
32'b001110?????????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // XORI
|
||||||
32'b00111100000????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // LUI
|
32'b00111100000????????????????????? 0 0 0 ? 0 ? ? 0 ALU 1 ? ? // LUI
|
||||||
32'b01000000000??????????00000000??? 0 0 ? 0 ? ? 0 C0 0 1 1 // MFC0
|
32'b01000000000??????????00000000??? 0 0 0 ? 0 ? ? 0 C0 0 1 1 // MFC0
|
||||||
32'b01000000100??????????00000000??? 0 0 ? 0 ? ? 1 ? ? ? ? // MTC0
|
32'b01000000100??????????00000000??? 0 0 0 ? 0 ? ? 1 ? ? ? ? // MTC0
|
||||||
32'b01000010000000000000000000000001 ? ? ? 0 ? ? 0 ? ? ? ? // TLBR
|
32'b01000010000000000000000000000001 ? ? ? ? 0 ? ? 0 ? ? ? ? // TLBR
|
||||||
32'b01000010000000000000000000000010 ? ? ? 0 ? ? 0 ? ? ? ? // TLBWI
|
32'b01000010000000000000000000000010 ? ? ? ? 0 ? ? 0 ? ? ? ? // TLBWI
|
||||||
32'b01000010000000000000000000001000 ? ? ? 0 ? ? 0 ? ? ? ? // TLBP
|
32'b01000010000000000000000000001000 ? ? ? ? 0 ? ? 0 ? ? ? ? // TLBP
|
||||||
32'b01000010000000000000000000011000 0 0 ? 0 ? ? 0 ? ? ? ? // ERET
|
32'b01000010000000000000000000011000 0 0 0 ? 0 ? ? 0 ? ? ? ? // ERET
|
||||||
32'b011100???????????????00000000010 0 0 MUL? 1 0 ? 0 MUL 0 1 0 // MUL
|
32'b011100???????????????00000000010 0 0 0 MUL? 1 0 ? 0 MUL 0 1 0 // MUL
|
||||||
32'b100000?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LB
|
32'b011100?????00000?????11100110111 1 0 0 ? 0 ? ? 0 MUL 0 1 0 // FILTER <--
|
||||||
32'b100001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LH
|
32'b100000?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LB
|
||||||
32'b100011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LW
|
32'b100001?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LH
|
||||||
32'b100100?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LBU
|
32'b100011?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LW
|
||||||
32'b100101?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LHU
|
32'b100100?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LBU
|
||||||
32'b101000?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SB
|
32'b100101?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // LHU
|
||||||
32'b101001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SH
|
32'b101000?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // SB
|
||||||
32'b101011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SW
|
32'b101001?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // SH
|
||||||
|
32'b101011?????????????????????????? ? ? ? ? 0 ? ? 0 ? ? ? ? // SW
|
Loading…
Reference in New Issue
Block a user