1. tlb control signals

2. exccode rename
3. tlb datapath partial

Co-authored-by: cxy004 <cxy004@qq.com>
Co-authored-by: Hooo1941 <Hooo1941@users.noreply.github.com>
This commit is contained in:
Paul Pan 2021-08-11 12:58:02 +08:00
parent 934a978aa7
commit bc549d8bd4
20 changed files with 306 additions and 494 deletions

View File

@ -10,3 +10,8 @@ trim_trailing_whitespace = true
[Makefile]
indent_style = tab
[tools/**/*.txt]
charset = utf-8
indent_style = tab
indent_size = 8

View File

@ -26,8 +26,8 @@ module AXI (
// ==============================
always_comb begin
inst.rdata = AXIRead.AXIReadData.rdata;
rdata.rdata = AXIRead.AXIReadData.rdata;
inst.rdata = AXIRead.AXIReadData.rdata;
rdata.rdata = AXIRead.AXIReadData.rdata;
if (AXIRead.AXIReadData.rid == 0) begin
inst.rvalid = AXIRead.AXIReadData.rvalid;
@ -57,12 +57,12 @@ module AXI (
AXIRead.AXIReadAddr.arburst = 2'b10; // Wrap
AXIRead.AXIReadAddr.arvalid = rdata.req | inst.req;
rdata.addr_ok = AXIRead.AXIReadData.arready;
if (rdata.req) begin
AXIRead.AXIReadAddr.arid = 4'b0001;
AXIRead.AXIReadAddr.arprot = 3'b001;
AXIRead.AXIReadAddr.araddr = rdata.addr;
AXIRead.AXIReadAddr.arlen = {1'b0, rdata.size};
rdata.addr_ok = AXIRead.AXIReadData.arready;
inst.addr_ok = 1'b0;
end else begin
AXIRead.AXIReadAddr.arid = 4'b0000;
@ -70,7 +70,6 @@ module AXI (
AXIRead.AXIReadAddr.araddr = inst.addr;
AXIRead.AXIReadAddr.arlen = {1'b0, inst.size};
inst.addr_ok = AXIRead.AXIReadData.arready;
rdata.addr_ok = 1'b0;
end
end

View File

@ -205,8 +205,8 @@ module CP0 (
if ( exception.ExcCode == `EXCCODE_MOD
| exception.ExcCode == `EXCCODE_TLBL
| exception.ExcCode == `EXCCODE_TLBS
| exception.ExcCode == `EXCCODE_ADDRR
| exception.ExcCode == `EXCCODE_ADDRW) begin
| exception.ExcCode == `EXCCODE_ADEL
| exception.ExcCode == `EXCCODE_ADES) begin
rf_cp0.BadVAddr = exception.BadVAddr;
end

View File

@ -36,7 +36,7 @@ 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[25];
assign ctrl.ERET = inst[30] & 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];;
@ -44,8 +44,8 @@ module Controller (
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.DP0 = ~inst[31];
assign ctrl.DP1 = ~inst[30] & (inst[31] | inst[29] | inst[28] | inst[27] | inst[26] | ~inst[4]) | inst[30] & inst[25];
assign ctrl.DP0 = ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4]);
assign ctrl.DP1 = inst[26] | (~inst[30] & (inst[31] | inst[29] | inst[28] | inst[27] | ~inst[4]) | inst[30] & (~inst[29] & inst[25] | inst[3]));
assign ctrl.ECtrl.OP.f_sl = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[3] & ~inst[1];
assign ctrl.ECtrl.OP.f_sr = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & inst[1];
@ -67,10 +67,13 @@ module Controller (
assign ctrl.MCtrl0.C0W = inst[30] & inst[23];
assign ctrl.MCtrl0.RS0 = RS0_t'({~inst[30] & (inst[29] | inst[26] | ~inst[4]), inst[30], ~inst[29] & (inst[30] | ~inst[1])});
assign ctrl.MCtrl1.MR = inst[31];
assign ctrl.MCtrl1.MWR = inst[29];
assign ctrl.MCtrl1.MX = ~inst[28];
assign ctrl.MCtrl1.SZ = inst[27:26];
assign ctrl.MCtrl1.MR = inst[31];
assign ctrl.MCtrl1.MWR = inst[29];
assign ctrl.MCtrl1.MX = ~inst[28];
assign ctrl.MCtrl1.SZ = inst[27:26];
assign ctrl.MCtrl1.TLBR = inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1];
assign ctrl.MCtrl1.TLBWI = inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1];
assign ctrl.MCtrl1.TLBP = inst[30] & ~inst[4] & inst[3];
assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~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]);

View File

@ -2,8 +2,8 @@
`include "CP0.svh"
module Datapath (
input clk,
input rst,
input clk,
input rst,
// MMU
sramro_i.master fetch_i,
@ -13,6 +13,9 @@ module Datapath (
input logic dTLBRefill,
input logic dTLBInvalid,
input logic dTLBModified,
output logic tlbr,
output logic tlbwi,
output logic tlbp,
// CP0
input logic C0_int,
@ -64,6 +67,11 @@ module Datapath (
word_t IQ_IB_inst;
word_t IQ_IB_pc;
logic IQ_IA_TLBRefill;
logic IQ_IA_TLBInvalid;
logic IQ_IB_TLBRefill;
logic IQ_IB_TLBInvalid;
logic [3:0] IQ_valids;
// Decode
@ -106,6 +114,11 @@ module Datapath (
logic D_IA_iv;
logic D_IB_iv;
logic D_IA_TLBRefill;
logic D_IA_TLBInvalid;
logic D_IB_TLBRefill;
logic D_IB_TLBInvalid;
logic D_IA_DataHazard;
logic D_IB_DataHazard;
@ -124,6 +137,7 @@ module Datapath (
logic E_I0_PrevExcValid;
logic [4:0] E_I0_PrevExcCode;
logic E_I0_PrevERET;
logic E_I0_PrevREFILL;
logic E_I0_ExcValidWithoutOF;
word_t E_I1_A;
@ -135,6 +149,7 @@ module Datapath (
logic E_I1_PrevExcValid;
logic [4:0] E_I1_PrevExcCode;
logic E_I1_PrevERET;
logic E_I1_PrevREFILL;
logic E_I1_ExcValidWithoutOF;
logic E_I0_FS_M_I0;
@ -163,6 +178,8 @@ module Datapath (
// Memory
logic M_go;
logic M_I0_go;
logic M_I1_go;
EXCEPTION_t M_exception;
@ -201,6 +218,11 @@ module Datapath (
word_t M_I0_HI;
word_t M_I0_LO;
logic M_I1_NowExcValid;
logic M_I1_PrevExcValid;
logic [4:0] M_I1_PrevExcCode;
logic M_I1_PrevREFILL;
logic M_I0_FS_M_I1;
logic M_I0_FS_W_I0;
logic M_I0_FS_W_I1;
@ -272,27 +294,29 @@ module Datapath (
assign F.en = PF.pc[1:0] != 2'b00 & D_IA_can_dispatch | fetch_i.req & fetch_i.addr_ok;
assign F.ExcValid = F.pc[1:0] != 2'b00 | iTLBRefill | iTLBInvalid;
//---------------------------------------------------------------------------//
// Instr Queue //
//---------------------------------------------------------------------------//
Queue #(64) InstrQueue (
Queue #(66) InstrQueue (
.clk(clk),
.rst(rst | rstD | rstM),
.vinA(fetch_i.data_ok | F.pc[1:0] != 2'b00),
.inA ({F.pc[2] ? fetch_i.rdata1 : fetch_i.rdata0, F.pc}),
.vinA(fetch_i.data_ok | F.ExcValid),
.inA ({F.pc[2] ? fetch_i.rdata1 : fetch_i.rdata0, F.pc, iTLBRefill, iTLBInvalid}),
.vinB(fetch_i.data_ok & ~F.pc[2]),
.inB ({fetch_i.rdata1, F.pc[31:3], 3'b100}),
.inB ({fetch_i.rdata1, F.pc[31:3], 3'b100, 2'b00}),
.enA (D.en0),
.voutA(IQ_IA_valid),
.outA ({IQ_IA_inst, IQ_IA_pc}),
.outA ({IQ_IA_inst, IQ_IA_pc, IQ_IA_TLBRefill, IQ_IA_TLBInvalid}),
.enB (D.en1),
.voutB(IQ_IB_valid),
.outB ({IQ_IB_inst, IQ_IB_pc}),
.outB ({IQ_IB_inst, IQ_IB_pc, IQ_IB_TLBRefill, IQ_IB_TLBInvalid}),
.valids(IQ_valids)
);
@ -302,19 +326,19 @@ module Datapath (
//---------------------------------------------------------------------------//
// D.FF
ffenr #(1 + 32 + 32) D_IA_ff (
ffenr #(1 + 32 + 32 + 2) D_IA_ff (
clk,
rst | rstM,
D.en1 ? {IQ_IA_valid & ~rstD, IQ_IA_pc, IQ_IA_inst} : {D_IB_valid, D.IB_pc, D.IB_inst},
D.en1 ? {IQ_IA_valid & ~rstD, IQ_IA_pc, IQ_IA_inst, IQ_IA_TLBRefill, IQ_IA_TLBInvalid} : {D_IB_valid, D.IB_pc, D.IB_inst, D_IB_TLBRefill, D_IB_TLBInvalid},
~D_IA_valid | D_go & E.en,
{D_IA_valid, D.IA_pc, D.IA_inst}
{D_IA_valid, D.IA_pc, D.IA_inst, D_IA_TLBRefill, D_IA_TLBInvalid}
);
ffenr #(1 + 32 + 32) D_IB_ff (
ffenr #(1 + 32 + 32 + 2) D_IB_ff (
clk,
rst | rstM,
D.en1 ? {IQ_IB_valid & ~rstD, IQ_IB_pc, IQ_IB_inst} : {IQ_IA_valid & ~rstD, IQ_IA_pc, IQ_IA_inst},
D.en1 ? {IQ_IB_valid & ~rstD, IQ_IB_pc, IQ_IB_inst, IQ_IB_TLBRefill, IQ_IB_TLBInvalid} : {IQ_IA_valid & ~rstD, IQ_IA_pc, IQ_IA_inst, IQ_IA_TLBRefill, IQ_IA_TLBInvalid},
D.en0,
{D_IB_valid, D.IB_pc, D.IB_inst}
{D_IB_valid, D.IB_pc, D.IB_inst, D_IB_TLBRefill, D_IB_TLBInvalid}
);
ffenr #(1) D_IA_Delay_ff (
@ -390,14 +414,26 @@ module Datapath (
D_IB_iv
);
assign D.IA_ExcValid = D_IA_valid & (D.IA_pc[1:0] != 2'b00 | ~D_IA_iv | D.IA.SYSCALL | D.IA.BREAK | D.IA.ERET);
assign D.IA_ERET = D_IA_valid & D_IA_iv & D.IA.ERET;
assign D.IA_ExcCode = D.IA_pc[1:0] != 2'b00 ? `EXCCODE_ADDRR : ~D_IA_iv ? `EXCCODE_RI : D.IA_inst[0] ? `EXCCODE_BREAK : `EXCCODE_SYSCALL;
assign D.IA_ExcValid = D_IA_valid & (D.IA_pc[1:0] != 2'b00 | D_IA_TLBRefill | D_IA_TLBInvalid | ~D_IA_iv | D.IA.SYSCALL | D.IA.BREAK | D.IA.ERET);
assign D.IA_ERET = D_IA_valid & D_IA_iv & D.IA.ERET;
assign D.IA_REFILL = D_IA_valid & D_IA_TLBRefill;
assign D.IA_ExcCode = D.IA_pc[1:0] != 2'b00 ? `EXCCODE_ADEL
: D_IA_TLBRefill ? `EXCCODE_TLBL
: D_IA_TLBInvalid ? `EXCCODE_TLBL
: ~D_IA_iv ? `EXCCODE_RI
: D.IA_inst[0] ? `EXCCODE_BP : `EXCCODE_SYS;
assign D.IB_ExcValid = D_IB_valid & (D.IB_pc[1:0] != 2'b00 | ~D_IB_iv | D.IB.SYSCALL | D.IB.BREAK | D.IB.ERET | D.IB_Delay & D.IB.BJRJ);
assign D.IB_ERET = D_IB_valid & D_IB_iv & D.IB.ERET & ~D.IB_Delay;
assign D.IB_ExcCode = D.IB_pc[1:0] != 2'b00 ? `EXCCODE_ADDRR : (~D_IB_iv | D.IB.ERET | D.IB_Delay & D.IB.BJRJ) ? `EXCCODE_RI : D.IB_inst[0] ? `EXCCODE_BREAK : `EXCCODE_SYSCALL;
assign D.IB_Delay = D.IA.BJRJ;
assign D.IB_ExcValid = D_IB_valid & (D.IB_pc[1:0] != 2'b00 | D_IB_TLBRefill | D_IB_TLBInvalid | ~D_IB_iv | D.IB.SYSCALL | D.IB.BREAK | D.IB.ERET | D.IB_Delay & D.IB.BJRJ);
assign D.IB_ERET = D_IB_valid & D_IB_iv & D.IB.ERET & ~D.IB_Delay;
assign D.IB_REFILL = D_IB_valid & D_IB_TLBRefill;
assign D.IB_ExcCode = D.IB_pc[1:0] != 2'b00 ? `EXCCODE_ADEL
: D_IB_TLBRefill ? `EXCCODE_TLBL
: D_IB_TLBInvalid ? `EXCCODE_TLBL
: ~D_IB_iv ? `EXCCODE_RI
: D.IB.ERET ? `EXCCODE_RI
: D.IB_Delay & D.IB.BJRJ ? `EXCCODE_RI
: D.IB_inst[0] ? `EXCCODE_BP : `EXCCODE_SYS;
assign D.IB_Delay = D.IA.BJRJ;
// D.Dispatch
assign D_IA_DataHazard = E.I0.WCtrl.RW & D.IA.RS == E.I0.RD & D.IA.ES & ~E.I0.MCtrl.RS0[2]
@ -442,6 +478,7 @@ module Datapath (
assign D.I0.pc = D.A ? D.IB_pc : D.IA_pc;
assign D.I0.ExcValid = D.A ? D.IB_ExcValid : D.IA_ExcValid;
assign D.I0.ERET = D.A ? D.IB_ERET : D.IA_ERET;
assign D.I0.REFILL = D.A ? D.IB_REFILL : D.IA_REFILL;
assign D.I0.ExcCode = D.A ? D.IB_ExcCode : D.IA_ExcCode;
assign D.I0.Delay = D.A ? D.IB_Delay : D.IA_Delay;
assign D.I0.OFA = D.A ? D.IB.OFA : D.IA.OFA;
@ -460,6 +497,7 @@ module Datapath (
assign D.I1.pc = D.A ? D.IA_pc : D.IB_pc;
assign D.I1.ExcValid = D.A ? D.IA_ExcValid : D.IB_ExcValid;
assign D.I1.ERET = D.A ? D.IA_ERET : D.IB_ERET;
assign D.I1.REFILL = D.A ? D.IA_REFILL : D.IB_REFILL;
assign D.I1.ExcCode = D.A ? D.IA_ExcCode : D.IB_ExcCode;
assign D.I1.Delay = D.A ? D.IA_Delay : D.IB_Delay;
assign D.I1.OFA = D.A ? D.IA.OFA : D.IB.OFA;
@ -547,13 +585,13 @@ module Datapath (
E.en,
E.I0.pc
);
ffenrc #(1 + 1 + 5 + 1 + 1) E_I0_Exc_ff (
ffenrc #(1 + 1 + 1 + 5 + 1 + 1) E_I0_Exc_ff (
clk,
rst | rstM,
{D.I0.ExcValid, D.I0.ERET, D.I0.ExcCode, D.I0.Delay, D.I0.OFA},
{D.I0.ExcValid, D.I0.ERET, D.I0.REFILL, D.I0.ExcCode, D.I0.Delay, D.I0.OFA},
E.en,
~D_go,
{E_I0_PrevExcValid, E_I0_PrevERET, E_I0_PrevExcCode, E.I0.Delay, E.I0.OFA}
{E_I0_PrevExcValid, E_I0_PrevERET, E_I0_PrevREFILL, E_I0_PrevExcCode, E.I0.Delay, E.I0.OFA}
);
ffen #(5 + 5) E_I0_RST_ff (
clk,
@ -602,13 +640,13 @@ module Datapath (
E.en,
E.I1.pc
);
ffenrc #(1 + 1 + 5 + 1 + 1) E_I1_Exc_ff (
ffenrc #(1 + 1 + 1 + 5 + 1 + 1) E_I1_Exc_ff (
clk,
rst | rstM,
{D.I1.ExcValid, D.I1.ERET, D.I1.ExcCode, D.I1.Delay, D.I1.OFA},
{D.I1.ExcValid, D.I1.ERET, D.I1.REFILL, D.I1.ExcCode, D.I1.Delay, D.I1.OFA},
E.en,
~D_go,
{E_I1_PrevExcValid, E_I1_PrevERET, E_I1_PrevExcCode, E.I1.Delay, E.I1.OFA}
{E_I1_PrevExcValid, E_I1_PrevERET, E_I1_PrevREFILL, E_I1_PrevExcCode, E.I1.Delay, E.I1.OFA}
);
ffen #(5 + 5) E_I1_RST_ff (
clk,
@ -634,7 +672,7 @@ module Datapath (
E.en,
E.I1.ECtrl
);
ffenrc #(5) E_I1_MCtrl_ff (
ffenrc #(8) E_I1_MCtrl_ff (
clk,
rst | rstM,
D.I1.MCtrl,
@ -653,19 +691,25 @@ module Datapath (
// E.Exc
assign E_I0_NowExcValidWithoutOF = C0_int & E_valid;
assign E_I0_NowExcValid = E_I0_NowExcValidWithoutOF | E_I0_Overflow & E.I0.OFA;
assign E_I0_ExcValidWithoutOF = E_I0_PrevExcValid | E_I0_NowExcValidWithoutOF;
assign E.I0.ExcValid = E_I0_PrevExcValid | E_I0_NowExcValid;
assign E.I0.ERET = E_I0_PrevERET & ~C0_int;
assign E.I0.ExcCode = C0_int ? 5'h0 : E_I0_PrevExcValid ? E_I0_PrevExcCode : `EXCCODE_OF;
assign E_I0_NowExcValid = E_I0_NowExcValidWithoutOF | E_I0_Overflow & E.I0.OFA;
assign E_I0_ExcValidWithoutOF = E_I0_PrevExcValid | E_I0_NowExcValidWithoutOF;
assign E.I0.ExcValid = E_I0_PrevExcValid | E_I0_NowExcValid;
assign E.I0.ERET = E_I0_PrevERET & ~C0_int;
assign E.I0.REFILL = E_I0_PrevREFILL & ~C0_int;
assign E.I0.ExcCode = C0_int ? 5'h0
: E_I0_PrevExcValid ? E_I0_PrevExcCode : `EXCCODE_OV;
assign E_I1_NowExcValidWithoutOF = C0_int & E_valid | E.I1.MCtrl.MR & E_I1_STRBERROR;
assign E_I1_NowExcValid = E_I1_NowExcValidWithoutOF | E_I1_Overflow & E.I1.OFA;
assign E_I1_ExcValidWithoutOF = E_I1_PrevExcValid | E_I1_NowExcValidWithoutOF;
assign E.I1.ExcValid = E_I1_PrevExcValid | E_I1_NowExcValid;
assign E.I1.ERET = E_I1_PrevERET & ~C0_int;
assign E.I1.ExcCode = C0_int ? 5'h0 : E_I1_PrevExcValid ? E_I1_PrevExcCode : E_I1_Overflow & E.I1.OFA ? `EXCCODE_OF : E.I1.MCtrl.MWR ? `EXCCODE_ADDRW : `EXCCODE_ADDRR;
assign E.I1.BadVAddr = E_I1_PrevExcValid ? E.I1.pc : E.I1.ALUOut;
assign E_I1_NowExcValid = E_I1_NowExcValidWithoutOF | E_I1_Overflow & E.I1.OFA;
assign E_I1_ExcValidWithoutOF = E_I1_PrevExcValid | E_I1_NowExcValidWithoutOF;
assign E.I1.ExcValid = E_I1_PrevExcValid | E_I1_NowExcValid;
assign E.I1.ERET = E_I1_PrevERET & ~C0_int;
assign E.I1.REFILL = E_I1_PrevREFILL & ~C0_int;
assign E.I1.ExcCode = C0_int ? 5'h0
: E_I1_PrevExcValid ? E_I1_PrevExcCode
: E_I1_Overflow & E.I1.OFA ? `EXCCODE_OV
: E.I1.MCtrl.MWR ? `EXCCODE_ADES : `EXCCODE_ADEL;
assign E.I1.BadVAddr = E_I1_PrevExcValid ? E.I1.pc : E.I1.ALUOut;
assign E_I0_go = ~E_I0_NowExcValid & (~E.A | ~E_I1_NowExcValid);
assign E_I1_goWithoutOF = ~E_I1_NowExcValidWithoutOF & (E.A | ~E_I0_NowExcValidWithoutOF);
@ -833,13 +877,13 @@ module Datapath (
M.en,
M.I0.pc
);
ffenrc #(1 + 1 + 5 + 1) M_I0_Exc_ff (
ffenrc #(1 + 1 + 1 + 5 + 1) M_I0_Exc_ff (
clk,
rst | rstM,
{E.I0.ExcValid, E.I0.ERET, E.I0.ExcCode, E.I0.Delay},
{E.I0.ExcValid, E.I0.ERET, E.I0.REFILL, E.I0.ExcCode, E.I0.Delay},
M.en,
~E_go,
{M.I0.ExcValid, M.I0.ERET, M.I0.ExcCode, M.I0.Delay}
{M.I0.ExcValid, M.I0.ERET, M.I0.REFILL, M.I0.ExcCode, M.I0.Delay}
);
ffen #(5 + 5) M_I0_RST_ff (
clk,
@ -888,13 +932,13 @@ module Datapath (
M.en,
M.I1.pc
);
ffenrc #(1 + 1 + 5 + 32 + 1) M_I1_Exc_ff (
ffenrc #(1 + 1 + 1 + 5 + 32 + 1) M_I1_Exc_ff (
clk,
rst | rstM,
{E.I1.ExcValid, E.I1.ERET, E.I1.ExcCode, E.I1.BadVAddr, E.I1.Delay},
{E.I1.ExcValid, E.I1.ERET, E.I1.REFILL, E.I1.ExcCode, E.I1.BadVAddr, E.I1.Delay},
M.en,
~E_go,
{M.I1.ExcValid, M.I1.ERET, M.I1.ExcCode, M.I1.BadVAddr, M.I1.Delay}
{M_I1_PrevExcValid, M.I1.ERET, M_I1_PrevREFILL, M_I1_PrevExcCode, M.I1.BadVAddr, M.I1.Delay}
);
ffen #(5) M_I1_RT_ff (
clk,
@ -914,7 +958,7 @@ module Datapath (
M.en,
M.I1.ALUOut
);
ffenrc #(5) M_I1_MCtrl_ff (
ffenrc #(8) M_I1_MCtrl_ff (
clk,
rst | rstM,
E.I1.MCtrl,
@ -933,6 +977,18 @@ module Datapath (
// M.Exc
assign M.I0.BadVAddr = M.I0.pc;
assign M_I1_NowExcValid = dTLBRefill | dTLBInvalid | dTLBModified;
assign M.I1.ExcValid = M_I1_PrevExcValid | M_I1_NowExcValid;
assign M.I1.REFILL = M_I1_PrevREFILL | dTLBRefill;
assign M.I1.ExcCode = M_I1_PrevExcValid ? M_I1_PrevExcCode
: dTLBRefill ? M.I1.MCtrl.MWR ? `EXCCODE_TLBS : `EXCCODE_TLBL
: dTLBInvalid ? M.I1.MCtrl.MWR ? `EXCCODE_TLBS : `EXCCODE_TLBL
: `EXCCODE_MOD;
assign M_I0_go = ~M.A | ~M_I1_NowExcValid;
assign M_I1_go = ~M_I1_NowExcValid;
assign M_exception = {
M.I1.ExcValid | M.I0.ExcValid,
~M.I0.ExcValid | M.I1.ExcValid & M.A ? {M.I1.Delay, M.I1.ExcCode, M.I1.BadVAddr, M.I1.pc, M.I1.ERET}

View File

@ -104,6 +104,9 @@ module mycpu_top (
logic dTLBRefill;
logic dTLBInvalid;
logic dTLBModified;
logic tlbr;
logic tlbwi;
logic tlbp;
AXI axi (
@ -127,8 +130,8 @@ module mycpu_top (
.rdata_axi (rdata_axi.master),
.wdata_axi (wdata_axi.master),
.K0 (K0),
.tlbwi (),
.tlbp (),
.tlbwi (tlbwi),
.tlbp (tlbp),
.c0_Index (c0_Index),
.c0_EntryHi (c0_EntryHi),
.c0_PageMask (c0_PageMask),
@ -169,8 +172,8 @@ module mycpu_top (
.EPC (C0_EPC),
.ext_int (ext_int),
.interrupt (C0_int),
.tlbr (),
.tlbp (),
.tlbr (tlbr),
.tlbp (tlbp),
.K0 (K0),
.Index (c0_Index),
.EntryHi (c0_EntryHi),
@ -195,6 +198,9 @@ module mycpu_top (
.dTLBRefill (dTLBRefill),
.dTLBInvalid (dTLBInvalid),
.dTLBModified(dTLBModified),
.tlbr (tlbr),
.tlbwi (tlbwi),
.tlbp (tlbp),
.C0_int (C0_int),
.C0_addr (C0_addr),

View File

@ -7,19 +7,24 @@
// prio: int
// fetch_addr
// fetch_tlb_refill
// fetch_tlb_invalid
// ri
// syscall, break, of
// syscall, break, overflow
// mem_addr
`define EXCCODE_INT 5'h00
`define EXCCODE_MOD 5'h01
`define EXCCODE_TLBL 5'h02
`define EXCCODE_TLBS 5'h03
`define EXCCODE_ADDRR 5'h04
`define EXCCODE_ADDRW 5'h05
`define EXCCODE_SYSCALL 5'h08
`define EXCCODE_BREAK 5'h09
`define EXCCODE_RI 5'h0A
`define EXCCODE_OF 5'h0C
// mem_tlb_refill
// mem_tlb_invalid
// mem_tlb_dirty
`define EXCCODE_INT 5'h00
`define EXCCODE_MOD 5'h01
`define EXCCODE_TLBL 5'h02
`define EXCCODE_TLBS 5'h03
`define EXCCODE_ADEL 5'h04
`define EXCCODE_ADES 5'h05
`define EXCCODE_SYS 5'h08
`define EXCCODE_BP 5'h09
`define EXCCODE_RI 5'h0A
`define EXCCODE_OV 5'h0C
typedef logic [31:0] word_t;
@ -71,23 +76,26 @@ typedef struct packed {
} ECtrl_t;
typedef struct packed {
RS0_t RS0; // critical
logic HW; // critical
logic LW; // critical
RS0_t RS0; // critical
logic HW; // critical
logic LW; // critical
logic [4:0] C0D;
logic C0W; // critical
logic C0W; // critical
HLS_t HLS;
} MCtrl0_t;
typedef struct packed {
logic MR; // critical
logic MWR; // critical
logic MR; // critical
logic MWR; // critical
logic MX;
logic [1:0] SZ;
logic TLBWI; // critical
logic TLBR; // critical
logic TLBP; // critical
} MCtrl1_t;
typedef struct packed {
logic RW; // critical
logic RW; // critical
} WCtrl_t;
typedef struct packed {
@ -125,6 +133,7 @@ typedef struct packed {word_t pc;} PF_t;
typedef struct packed {
logic en;
word_t pc;
logic ExcValid;
} F_t;
typedef struct packed {
@ -137,6 +146,7 @@ typedef struct packed {
word_t IA_inst;
logic IA_ExcValid;
logic IA_ERET;
logic IA_REFILL;
logic [4:0] IA_ExcCode;
logic IA_Delay;
word_t IA_S;
@ -148,6 +158,7 @@ typedef struct packed {
word_t IB_inst;
logic IB_ExcValid;
logic IB_ERET;
logic IB_REFILL;
logic [4:0] IB_ExcCode;
logic IB_Delay;
word_t IB_S;
@ -160,6 +171,7 @@ typedef struct packed {
logic ExcValid;
logic ERET;
logic REFILL;
logic [4:0] ExcCode;
logic Delay;
logic OFA;
@ -185,6 +197,7 @@ typedef struct packed {
logic ExcValid;
logic ERET;
logic REFILL;
logic [4:0] ExcCode;
logic Delay;
logic OFA;
@ -215,6 +228,7 @@ typedef struct packed {
logic ExcValid;
logic ERET;
logic REFILL;
logic [4:0] ExcCode;
logic Delay;
logic OFA;
@ -241,6 +255,7 @@ typedef struct packed {
logic ExcValid;
logic ERET;
logic REFILL;
logic [4:0] ExcCode;
word_t BadVAddr;
logic Delay;
@ -273,6 +288,7 @@ typedef struct packed {
logic ExcValid;
logic ERET;
logic REFILL;
logic [4:0] ExcCode;
word_t BadVAddr;
logic Delay;
@ -296,6 +312,7 @@ typedef struct packed {
logic ExcValid;
logic ERET;
logic REFILL;
logic [4:0] ExcCode;
word_t BadVAddr;
logic Delay;

View File

@ -1,48 +0,0 @@
////-------------------------------- RS0 1 0
32'b00000000000???????????????000000 ALUOut 1 0
32'b00000000000???????????????000010 ALUOut 1 0
32'b00000000000???????????????000011 ALUOut 1 0
32'b000001?????10000???????????????? ALUOut 1 0
32'b000001?????10001???????????????? ALUOut 1 0
32'b000011?????????????????????????? ALUOut 1 0
32'b000000?????00000?????00000001001 ALUOut 1 0
32'b001000?????????????????????????? ALUOut 1 0
32'b001001?????????????????????????? ALUOut 1 0
32'b001010?????????????????????????? ALUOut 1 0
32'b001011?????????????????????????? ALUOut 1 0
32'b001100?????????????????????????? ALUOut 1 0
32'b001101?????????????????????????? ALUOut 1 0
32'b001110?????????????????????????? ALUOut 1 0
32'b00111100000????????????????????? ALUOut 1 0
32'b000000???????????????00000000100 ALUOut 1 0
32'b000000???????????????00000000110 ALUOut 1 0
32'b000000???????????????00000000111 ALUOut 1 0
32'b0000000000000000?????00000010000 HI 0 1
32'b0000000000000000?????00000010010 LO 0 0
32'b01000000000??????????00000000??? C0 1 1
32'b000000?????000000000000000001000 ? ? ?
32'b000000????????????????????001100 ? ? ?
32'b000000????????????????????001101 ? ? ?
32'b000000?????000000000000000010001 ? ? ?
32'b000000?????000000000000000010011 ? ? ?
32'b000000??????????0000000000011000 ? ? ?
32'b000000??????????0000000000011001 ? ? ?
32'b000000??????????0000000000011010 ? ? ?
32'b000000??????????0000000000011011 ? ? ?
32'b000000???????????????0000??????? ? ? ?
32'b000001?????00001???????????????? ? ? ?
32'b000010?????????????????????????? ? ? ?
32'b000100?????????????????????????? ? ? ?
32'b000101?????????????????????????? ? ? ?
32'b000110?????00000???????????????? ? ? ?
32'b000111?????00000???????????????? ? ? ?
32'b01000000100??????????00000000??? ? ? ?
32'b01000010000000000000000000011000 ? ? ?
32'b100000?????????????????????????? ? ? ?
32'b100001?????????????????????????? ? ? ?
32'b100011?????????????????????????? ? ? ?
32'b100100?????????????????????????? ? ? ?
32'b100101?????????????????????????? ? ? ?
32'b101000?????????????????????????? ? ? ?
32'b101001?????????????????????????? ? ? ?
32'b101011?????????????????????????? ? ? ?

View File

@ -1,57 +0,0 @@
32'b00000000000???????????????000000 // SLL sa R[rt] R[rd]
32'b00000000000???????????????000010 // SRL sa R[rt] R[rd]
32'b00000000000???????????????000011 // SRA sa R[rt] R[rd]
32'b000000???????????????00000000100 // SLLV R[rs] R[rt] R[rd]
32'b000000???????????????00000000110 // SRLV R[rs] R[rt] R[rd]
32'b000000???????????????00000000111 // SRAV R[rs] R[rt] R[rd]
32'b000000?????000000000000000001000 // JR
32'b000000?????00000?????00000001001 // JALR pc 8 R[rd]
32'b000000????????????????????001100 // SYSCALL
32'b000000????????????????????001101 // BREAK
32'b0000000000000000?????00000010000 // MFHI R[rd]
32'b000000?????000000000000000010001 // MTHI R[rs] R[rt] HI
32'b0000000000000000?????00000010010 // MFLO R[rd]
32'b000000?????000000000000000010011 // MTLO R[rs] R[rt] LO
32'b000000??????????0000000000011000 // MULT
32'b000000??????????0000000000011001 // MULTU
32'b000000??????????0000000000011010 // DIV
32'b000000??????????0000000000011011 // DIVU
32'b000000???????????????00000100000 // ADD R[rs] R[rt] R[rd]
32'b000000???????????????00000100001 // ADDU R[rs] R[rt] R[rd]
32'b000000???????????????00000100010 // SUB R[rs] R[rt] R[rd]
32'b000000???????????????00000100011 // SUBU R[rs] R[rt] R[rd]
32'b000000???????????????00000100100 // AND R[rs] R[rt] R[rd]
32'b000000???????????????00000100101 // OR R[rs] R[rt] R[rd]
32'b000000???????????????00000100110 // XOR R[rs] R[rt] R[rd]
32'b000000???????????????00000100111 // NOR R[rs] R[rt] R[rd]
32'b000000???????????????00000101010 // SLT R[rs] R[rt] R[rd]
32'b000000???????????????00000101011 // SLTU R[rs] R[rt] R[rd]
32'b000001?????00000???????????????? // BLTZ
32'b000001?????10000???????????????? // BLTZAL pc 8 R[31]
32'b000001?????00001???????????????? // BGEZ
32'b000001?????10001???????????????? // BGEZAL pc 8 R[31]
32'b000010?????????????????????????? // J
32'b000011?????????????????????????? // JAL pc 8 R[31]
32'b000100?????????????????????????? // BEQ
32'b000101?????????????????????????? // BNE
32'b000110?????00000???????????????? // BLEZ
32'b000111?????00000???????????????? // BGTZ
32'b001000?????????????????????????? // ADDI R[rs] simm R[rt]
32'b001001?????????????????????????? // ADDIU R[rs] simm R[rt]
32'b001010?????????????????????????? // SLTI R[rs] simm R[rt]
32'b001011?????????????????????????? // SLTIU R[rs] simm R[rt]
32'b001100?????????????????????????? // ANDI R[rs] zimm R[rt]
32'b001101?????????????????????????? // ORI R[rs] zimm R[rt]
32'b001110?????????????????????????? // XORI R[rs] zimm R[rt]
32'b00111100000????????????????????? // LUI 0 uimm R[rt]
32'b01000000000??????????00000000??? // MFC0 0 CP0 R[rd]
32'b01000000100??????????00000000??? // MTC0 0 R[rt] CP0
32'b01000010000000000000000000011000 // ERET
32'b100000?????????????????????????? // LB R[rs] simm R[rt]
32'b100001?????????????????????????? // LH R[rs] simm R[rt]
32'b100011?????????????????????????? // LW R[rs] simm R[rt]
32'b100100?????????????????????????? // LBU R[rs] simm R[rt]
32'b100101?????????????????????????? // LHU R[rs] simm R[rt]
32'b101000?????????????????????????? // SB R[rs] simm
32'b101001?????????????????????????? // SH R[rs] simm
32'b101011?????????????????????????? // SW R[rs] simm

View File

@ -1,42 +0,0 @@
ctrl.ERET = inst[30] & inst[25]
ctrl.SYSCALL = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[0]
ctrl.BREAK = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & inst[0]
ctrl.PFCtrl.BJJR = ~inst[26] & (~inst[27] & (~inst[28] & ~inst[30] & ~inst[31] & ~inst[29] & inst[3] & ~inst[4] & ~inst[5] & ~inst[2] | inst[28] & ~inst[31] & ~inst[29]) | inst[27] & ~inst[29]) | inst[26] & ~inst[29] & ~inst[31]
ctrl.PFCtrl.BJR = (~inst[26] & (~inst[28] & ~inst[30] & ~inst[29] & ~inst[31] & ~inst[27] & inst[3] & ~inst[4] & ~inst[5] & ~inst[2] | inst[28] & ~inst[29] & ~inst[31]) | inst[26] & ~inst[29] & ~inst[31] & (~inst[27] | inst[28]))
ctrl.PFCtrl.BE = ~inst[31] & ~inst[29] & inst[28] & ~inst[27]
ctrl.DCtrl.DP0 = ~inst[31]
ctrl.DCtrl.DP1 = ~inst[30] & (~inst[26] & (~inst[29] & (~inst[28] & (~inst[31] & (~inst[27] & ~inst[4] | inst[27]) | inst[31]) | inst[28]) | inst[29]) | inst[26]) | inst[30] & inst[25]
ctrl.DCtrl.UI = inst[28] & inst[29] & inst[27] & inst[26]
ctrl.DCtrl.IX = ~inst[28]
ctrl.ECtrl.SA
{'SA': '~inst[31] & ~inst[29] & ~inst[26] & ~inst[30] & ~inst[28] & ~inst[27] & ~inst[5] & ~inst[4] & ~inst[3] & ~inst[2]', 'RS': '(~inst[31] & (~inst[29] & ~inst[26] & ~inst[30] & ~inst[28] & ~inst[27] & (~inst[5] & (~inst[4] & ~inst[3] & inst[2] | inst[4] & inst[3]) | inst[5]) | inst[29] & (~inst[28] | inst[28] & (~inst[27] | inst[27] & ~inst[26]))) | inst[31])'
ctrl.ECtrl.SB
{'RT': '~inst[29] & ~inst[31] & ~inst[26] & ~inst[30] & ~inst[28] & ~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])', '8': '~inst[29] & ~inst[31] & (~inst[26] & (~inst[30] & (~inst[28] & (~inst[27] & ~inst[5] & (~inst[1] & (~inst[0] & (~inst[3] & inst[4] | inst[3] & ~inst[4]) | inst[0] & (~inst[4] | inst[4] & ~inst[3])) | inst[1] & inst[4] & ~inst[3]) | inst[27]) | inst[28]) | inst[30]) | inst[26])', 'IMM': '(~inst[29] & inst[31] | inst[29])'}
ctrl.ECtrl.OP[8:1]
{'SR': '~inst[31] & ~inst[26] & ~inst[28] & ~inst[27] & ~inst[30] & ~inst[29] & ~inst[5] & ~inst[3] & (~inst[1] & ~inst[2] | inst[1])', 'SL': '~inst[31] & ~inst[26] & ~inst[28] & ~inst[27] & ~inst[30] & ~inst[29] & ~inst[5] & ~inst[3] & ~inst[1] & inst[2]', 'ADD': '(~inst[31] & (~inst[26] & ~inst[28] & ~inst[27] & (~inst[30] & (~inst[29] & (~inst[5] & inst[3] | inst[5] & ~inst[2] & ~inst[3]) | inst[29]) | inst[30]) | inst[26] & (~inst[29] | inst[29] & (~inst[28] & ~inst[27] | inst[28] & inst[27]))) | inst[31])', 'SLT': '~inst[31] & ~inst[26] & ~inst[28] & (~inst[27] & ~inst[30] & ~inst[29] & inst[5] & ~inst[2] & inst[3] & ~inst[0] | inst[27])', 'SLTU': '~inst[31] & (~inst[26] & ~inst[28] & ~inst[27] & ~inst[30] & ~inst[29] & inst[5] & ~inst[2] & inst[3] & inst[0] | inst[26] & inst[29] & ~inst[28] & inst[27])', 'AND': '~inst[31] & ~inst[26] & (~inst[28] & ~inst[27] & ~inst[30] & ~inst[29] & inst[5] & inst[2] & ~inst[0] & ~inst[1] | inst[28] & ~inst[27])', 'XOR': '~inst[31] & ~inst[26] & (~inst[28] & ~inst[27] & ~inst[30] & ~inst[29] & inst[5] & inst[2] & ~inst[0] & inst[1] | inst[28] & inst[27])', 'OR': '~inst[31] & (~inst[26] & ~inst[28] & ~inst[27] & ~inst[30] & ~inst[29] & inst[5] & inst[2] & inst[0] | inst[26] & inst[29] & inst[28] & ~inst[27])'}
ctrl.ECtrl.OP[0] = ~inst[31] & (~inst[26] & ~inst[30] & (~inst[27] & ~inst[29] & inst[1] & (~inst[5] & inst[0] | inst[5]) | inst[27]) | inst[26] & inst[27] & inst[29] & ~inst[28])'
ctrl.OFA = ~inst[26] & (~inst[29] & ~inst[30] & ~inst[28] & ~inst[31] & ~inst[27] & inst[5] & ~inst[0] & ~inst[2] & ~inst[3] | inst[29] & ~inst[28] & ~inst[31] & ~inst[27])'
ctrl.MCtrl1.MR = inst[31]
ctrl.MCtrl1.MWR = inst[29]
ctrl.MCtrl1.MX = ~inst[28]
RD
{'RD': '~inst[29] & ~inst[31] & ~inst[26]', '31': '~inst[29] & ~inst[31] & inst[26]', 'RT': '(~inst[29] & inst[31] | inst[29])'}
ctrl.WCtrl.RW = (~inst[30] & (~inst[29] & (~inst[31] & ~inst[28] & (~inst[27] & (~inst[26] & (~inst[3] & (~inst[4] | inst[4] & ~inst[0]) | inst[3] & (~inst[5] & ~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[26] & inst[20]) | inst[27] & inst[26]) | inst[31]) | inst[29] & ~inst[31]) | inst[30] & ~inst[25] & ~inst[23])
ctrl.MCtrl0.RS0
{'ALUOut': '~inst[30] & (~inst[29] & (~inst[26] & ~inst[4] | inst[26]) | inst[29])', 'HI': '~inst[30] & ~inst[29] & ~inst[26] & inst[4] & ~inst[1]', 'LO': '~inst[30] & ~inst[29] & ~inst[26] & inst[4] & inst[1]', 'C0': 'inst[30]'}
ctrl.MCtrl0.HW = ~inst[26] & ~inst[29] & ~inst[30] & ~inst[28] & ~inst[27] & inst[4] & (~inst[3] & ~inst[1] & inst[0] | inst[3])
ctrl.MCtrl0.LW = ~inst[26] & ~inst[29] & ~inst[30] & ~inst[28] & ~inst[27] & inst[4] & (~inst[3] & inst[1] & inst[0] | inst[3])'
ctrl.MCtrl0.C0W = inst[30] & inst[23]
ctrl.MCtrl0.HLS
{'RS': '~inst[3]', 'MULT': 'inst[3] & ~inst[1] & ~inst[0]', 'MULTU': 'inst[3] & ~inst[1] & inst[0]', 'DIV': 'inst[3] & inst[1] & ~inst[0]', 'DIVU': 'inst[3] & inst[1] & inst[0]'}

View File

@ -1,57 +0,0 @@
////-------------------------------- DP0 DP1 ALU ALT IMM LUI A B MR SI MW RW RD FC0 FHI FLO C0W HIW LOW
32'b00000000000???????????????000010 1 1 2 0 ? ? sa rt 0 ? 0 1 rd 0 0 0 0 0 0 // SRL
32'b00000000000???????????????000011 1 1 2 1 ? ? sa rt 0 ? 0 1 rd 0 0 0 0 0 0 // SRA
32'b000000???????????????00000000100 1 1 1 ? ? ? sa rt 0 ? 0 1 rd 0 0 0 0 0 0 // SLLV
32'b000000???????????????00000000110 1 1 2 0 ? ? sa rt 0 ? 0 1 rd 0 0 0 0 0 0 // SRLV
32'b000000???????????????00000000111 1 1 2 1 ? ? sa rt 0 ? 0 1 rd 0 0 0 0 0 0 // SRAV
32'b000000?????000000000000000001000 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // JR
32'b000000?????00000?????00000001001 1 1 3 0 ? ? pc 8 0 ? 0 1 rd 0 0 0 0 0 0 // JALR
32'b000000????????????????????001100 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // SYSCALL
32'b000000????????????????????001101 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // BREAK
32'b0000000000000000?????00000010000 1 0 ? ? ? ? ? ? ? ? ? 1 rd 0 1 ? 0 0 0 // MFHI
32'b000000?????000000000000000010001 1 0 ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 1 0 // MTHI
32'b0000000000000000?????00000010010 1 0 ? ? ? ? ? ? ? ? ? 1 rd 0 0 1 0 0 0 // MFLO
32'b000000?????000000000000000010011 1 0 ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 0 1 // MTLO
32'b000000??????????0000000000011000 1 0 ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 2 2 // MULT
32'b000000??????????0000000000011001 1 0 ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 2 2 // MULTU
32'b000000??????????0000000000011010 1 0 ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 3 3 // DIV
32'b000000??????????0000000000011011 1 0 ? ? ? ? ? ? ? ? ? 0 ? ? ? ? 0 3 3 // DIVU
32'b000000???????????????00000100000 1 1 3 0 ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // ADD
32'b000000???????????????00000100001 1 1 3 0 ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // ADDU
32'b000000???????????????00000100010 1 1 3 1 ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // SUB
32'b000000???????????????00000100011 1 1 3 1 ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // SUBU
32'b000000???????????????00000100100 1 1 4 ? ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // AND
32'b000000???????????????00000100101 1 1 5 0 ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // OR
32'b000000???????????????00000100110 1 1 6 ? ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // XOR
32'b000000???????????????00000100111 1 1 5 1 ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // NOR
32'b000000???????????????00000101010 1 1 7 1 ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // SLT
32'b000000???????????????00000101011 1 1 8 1 ? ? rs rt 0 ? 0 1 rd 0 0 0 0 0 0 // SLTU
32'b000001?????00000???????????????? 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // BLTZ
32'b000001?????10000???????????????? 1 1 3 0 ? ? pc 8 0 ? 0 1 31 0 0 0 0 0 0 // BLTZAL
32'b000001?????00001???????????????? 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // BGEZ
32'b000001?????10001???????????????? 1 1 3 0 ? ? pc 8 0 ? 0 1 31 0 0 0 0 0 0 // BGEZAL
32'b000010?????????????????????????? 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // J
32'b000011?????????????????????????? 1 1 3 0 ? ? pc 8 0 ? 0 1 31 0 0 0 0 0 0 // JAL
32'b000100?????????????????????????? 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // BEQ
32'b000101?????????????????????????? 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // BNE
32'b000110?????00000???????????????? 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // BLEZ
32'b000111?????00000???????????????? 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // BGTZ
32'b001000?????????????????????????? 1 1 3 0 1 0 rs imm 0 ? 0 1 rt 0 0 0 0 0 0 // ADDI
32'b001001?????????????????????????? 1 1 3 0 1 0 rs imm 0 ? 0 1 rt 0 0 0 0 0 0 // ADDIU
32'b001010?????????????????????????? 1 1 7 1 1 0 rs imm 0 ? 0 1 rt 0 0 0 0 0 0 // SLTI
32'b001011?????????????????????????? 1 1 8 1 1 0 rs imm 0 ? 0 1 rt 0 0 0 0 0 0 // SLTIU
32'b001100?????????????????????????? 1 1 4 ? 0 0 rs imm 0 ? 0 1 rt 0 0 0 0 0 0 // ANDI
32'b001101?????????????????????????? 1 1 5 0 0 0 rs imm 0 ? 0 1 rt 0 0 0 0 0 0 // ORI
32'b001110?????????????????????????? 1 1 6 ? 0 0 rs imm 0 ? 0 1 rt 0 0 0 0 0 0 // XORI
32'b00111100000????????????????????? 1 1 3 0 ? 1 0 imm 0 ? 0 1 rt 0 0 0 0 0 0 // LUI
32'b01000000000??????????00000000??? 1 0 3 0 ? ? ? ? ? ? ? 1 rd 1 ? ? 0 0 0 // MFC0
32'b01000000100??????????00000000??? 1 0 3 0 ? ? ? ? ? ? ? 0 ? ? ? ? 1 0 0 // MTC0
32'b01000010000000000000000000011000 1 1 ? ? ? ? ? ? 0 ? 0 0 ? ? ? ? 0 0 0 // ERET
32'b100000?????????????????????????? 0 1 3 0 1 0 rs imm 1 1 0 1 rt 0 0 0 0 0 0 // LB
32'b100001?????????????????????????? 0 1 3 0 1 0 rs imm 1 1 0 1 rt 0 0 0 0 0 0 // LH
32'b100011?????????????????????????? 0 1 3 0 1 0 rs imm 1 1 0 1 rt 0 0 0 0 0 0 // LW
32'b100100?????????????????????????? 0 1 3 0 1 0 rs imm 1 0 0 1 rt 0 0 0 0 0 0 // LBU
32'b100101?????????????????????????? 0 1 3 0 1 0 rs imm 1 0 0 1 rt 0 0 0 0 0 0 // LHU
32'b101000?????????????????????????? 0 1 3 0 1 0 rs imm 1 ? 1 0 ? ? ? ? 0 0 0 // SB
32'b101001?????????????????????????? 0 1 3 0 1 0 rs imm 1 ? 1 0 ? ? ? ? 0 0 0 // SH
32'b101011?????????????????????????? 0 1 3 0 1 0 rs imm 1 ? 1 0 ? ? ? ? 0 0 0 // SW

View File

@ -1,58 +0,0 @@
////-------------------------------- ERET SYSCALL BREAK PCS BJRJ JR BJR BE DP0 DP1 UI IX SA SB OP ALT OFA MR MWR MX RD RW RS0 HW LW C0W HLS
32'b00000000000???????????????000000 0 0 0 ? 0 0 0 0 1 1 ? ? SA RT SL 0 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b00000000000???????????????000010 0 0 0 ? 0 0 0 0 1 1 ? ? SA RT SR 0 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b00000000000???????????????000011 0 0 0 ? 0 0 0 0 1 1 ? ? SA RT SR 1 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000000100 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT SL ? 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000000110 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT SR 0 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000000111 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT SR 1 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000?????000000000000000001000 0 0 0 JR 1 1 1 0 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b000000?????00000?????00000001001 0 0 0 JR 1 1 1 0 1 1 ? ? PC 8 ADD 0 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000????????????????????001100 0 1 0 ? 0 0 0 0 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b000000????????????????????001101 0 0 1 ? 0 0 0 0 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b0000000000000000?????00000010000 0 0 0 ? 0 0 0 0 1 0 ? ? PC 8 ? ? 0 ? ? ? RD 1 HI 0 0 0 ?
32'b000000?????000000000000000010001 0 0 0 ? 0 0 0 0 1 0 ? ? PC 8 ? ? 0 ? ? ? ? 0 ? 1 0 0 RS
32'b0000000000000000?????00000010010 0 0 0 ? 0 0 0 0 1 0 ? ? PC 8 ? ? 0 ? ? ? RD 1 LO 0 0 0 ?
32'b000000?????000000000000000010011 0 0 0 ? 0 0 0 0 1 0 ? ? PC 8 ? ? 0 ? ? ? ? 0 ? 0 1 0 RS
32'b000000??????????0000000000011000 0 0 0 ? 0 0 0 0 1 0 ? ? RS RT ? ? 0 ? ? ? ? 0 ? 1 1 0 MULT
32'b000000??????????0000000000011001 0 0 0 ? 0 0 0 0 1 0 ? ? RS RT ? ? 0 ? ? ? ? 0 ? 1 1 0 MULTU
32'b000000??????????0000000000011010 0 0 0 ? 0 0 0 0 1 0 ? ? RS RT ? ? 0 ? ? ? ? 0 ? 1 1 0 DIV
32'b000000??????????0000000000011011 0 0 0 ? 0 0 0 0 1 0 ? ? RS RT ? ? 0 ? ? ? ? 0 ? 1 1 0 DIVU
32'b000000???????????????00000100000 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT ADD 0 1 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000100001 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT ADD 0 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000100010 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT ADD 1 1 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000100011 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT ADD 1 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000100100 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT AND ? 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000100101 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT OR 0 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000100110 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT XOR ? 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000100111 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT OR 1 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000101010 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT SLT 1 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000000???????????????00000101011 0 0 0 ? 0 0 0 0 1 1 ? ? RS RT SLTU 1 0 0 ? ? RD 1 ALUOut 0 0 0 ?
32'b000001?????00000???????????????? 0 0 0 B 1 0 1 0 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b000001?????10000???????????????? 0 0 0 B 1 0 1 0 1 1 ? ? PC 8 ADD 0 0 0 ? ? 31 1 ALUOut 0 0 0 ?
32'b000001?????00001???????????????? 0 0 0 B 1 0 1 0 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b000001?????10001???????????????? 0 0 0 B 1 0 1 0 1 1 ? ? PC 8 ADD 0 0 0 ? ? 31 1 ALUOut 0 0 0 ?
32'b000010?????????????????????????? 0 0 0 J 1 0 0 0 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b000011?????????????????????????? 0 0 0 J 1 0 0 0 1 1 ? ? PC 8 ADD 0 0 0 ? ? 31 1 ALUOut 0 0 0 ?
32'b000100?????????????????????????? 0 0 0 B 1 0 1 1 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b000101?????????????????????????? 0 0 0 B 1 0 1 1 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b000110?????00000???????????????? 0 0 0 B 1 0 1 0 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b000111?????00000???????????????? 0 0 0 B 1 0 1 0 1 1 ? ? PC 8 ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b001000?????????????????????????? 0 0 0 ? 0 0 0 0 1 1 0 1 RS IMM ADD 0 1 0 ? ? RT 1 ALUOut 0 0 0 ?
32'b001001?????????????????????????? 0 0 0 ? 0 0 0 0 1 1 0 1 RS IMM ADD 0 0 0 ? ? RT 1 ALUOut 0 0 0 ?
32'b001010?????????????????????????? 0 0 0 ? 0 0 0 0 1 1 0 1 RS IMM SLT 1 0 0 ? ? RT 1 ALUOut 0 0 0 ?
32'b001011?????????????????????????? 0 0 0 ? 0 0 0 0 1 1 0 1 RS IMM SLTU 1 0 0 ? ? RT 1 ALUOut 0 0 0 ?
32'b001100?????????????????????????? 0 0 0 ? 0 0 0 0 1 1 0 0 RS IMM AND ? 0 0 ? ? RT 1 ALUOut 0 0 0 ?
32'b001101?????????????????????????? 0 0 0 ? 0 0 0 0 1 1 0 0 RS IMM OR 0 0 0 ? ? RT 1 ALUOut 0 0 0 ?
32'b001110?????????????????????????? 0 0 0 ? 0 0 0 0 1 1 0 0 RS IMM XOR ? 0 0 ? ? RT 1 ALUOut 0 0 0 ?
32'b00111100000????????????????????? 0 0 0 ? 0 0 0 0 1 1 1 ? 0 IMM ADD 0 0 0 ? ? RT 1 ALUOut 0 0 0 ?
32'b01000000000??????????00000000??? 0 0 0 ? 0 0 0 0 1 0 ? ? 0 IMM ? ? 0 ? ? ? RT 1 C0 0 0 0 ?
32'b01000000100??????????00000000??? 0 0 0 ? 0 0 0 0 1 0 ? ? 0 IMM ? ? 0 ? ? ? ? 0 ? 0 0 1 ?
32'b01000010000000000000000000011000 1 0 0 ? 0 0 0 0 1 1 ? ? 0 IMM ? ? 0 0 ? ? ? 0 ? 0 0 0 ?
32'b100000?????????????????????????? 0 0 0 ? 0 0 0 0 0 1 0 1 RS IMM ADD 0 0 1 0 1 RT 1 ? ? ? ? ?
32'b100001?????????????????????????? 0 0 0 ? 0 0 0 0 0 1 0 1 RS IMM ADD 0 0 1 0 1 RT 1 ? ? ? ? ?
32'b100011?????????????????????????? 0 0 0 ? 0 0 0 0 0 1 0 1 RS IMM ADD 0 0 1 0 ? RT 1 ? ? ? ? ?
32'b100100?????????????????????????? 0 0 0 ? 0 0 0 0 0 1 0 1 RS IMM ADD 0 0 1 0 0 RT 1 ? ? ? ? ?
32'b100101?????????????????????????? 0 0 0 ? 0 0 0 0 0 1 0 1 RS IMM ADD 0 0 1 0 0 RT 1 ? ? ? ? ?
32'b101000?????????????????????????? 0 0 0 ? 0 0 0 0 0 1 0 1 RS IMM ADD 0 0 1 1 ? ? 0 ? ? ? ? ?
32'b101001?????????????????????????? 0 0 0 ? 0 0 0 0 0 1 0 1 RS IMM ADD 0 0 1 1 ? ? 0 ? ? ? ? ?
32'b101011?????????????????????????? 0 0 0 ? 0 0 0 0 0 1 0 1 RS IMM ADD 0 0 1 1 ? ? 0 ? ? ? ? ?

View File

@ -1,4 +1,4 @@
with open('ctrl.txt') as f:
with open('global.txt') as f:
lines = f.readlines()
title = lines[0].split()
items = [x.split() for x in lines[1:]]

69
tools/global.txt Normal file
View File

@ -0,0 +1,69 @@
////-------------------------------- ERET DP0 DP1
32'b00000000000???????????????000010 0 1 1 // SRL
32'b00000000000???????????????000000 0 1 1 // SLL
32'b00000000000???????????????000011 0 1 1 // SRA
32'b000000???????????????00000000100 0 1 1 // SLLV
32'b000000???????????????00000000110 0 1 1 // SRLV
32'b000000???????????????00000000111 0 1 1 // SRAV
32'b000000?????000000000000000001000 0 1 1 // JR
32'b000000?????00000?????00000001001 0 1 1 // JALR
32'b000000????????????????????001100 0 1 1 // SYSCALL
32'b000000????????????????????001101 0 1 1 // BREAK
32'b0000000000000000?????00000010000 0 1 0 // MFHI
32'b000000?????000000000000000010001 0 1 0 // MTHI
32'b0000000000000000?????00000010010 0 1 0 // MFLO
32'b000000?????000000000000000010011 0 1 0 // MTLO
32'b000000??????????0000000000011000 0 1 0 // MULT
32'b000000??????????0000000000011001 0 1 0 // MULTU
32'b000000??????????0000000000011010 0 1 0 // DIV
32'b000000??????????0000000000011011 0 1 0 // DIVU
32'b000000???????????????00000100000 0 1 1 // ADD
32'b000000???????????????00000100001 0 1 1 // ADDU
32'b000000???????????????00000100010 0 1 1 // SUB
32'b000000???????????????00000100011 0 1 1 // SUBU
32'b000000???????????????00000100100 0 1 1 // AND
32'b000000???????????????00000100101 0 1 1 // OR
32'b000000???????????????00000100110 0 1 1 // XOR
32'b000000???????????????00000100111 0 1 1 // NOR
32'b000000???????????????00000101010 0 1 1 // SLT
32'b000000???????????????00000101011 0 1 1 // SLTU
32'b000001?????00000???????????????? 0 1 1 // BLTZ
32'b000001?????10000???????????????? 0 1 1 // BLTZAL
32'b000001?????00001???????????????? 0 1 1 // BGEZ
32'b000001?????10001???????????????? 0 1 1 // BGEZAL
32'b000010?????????????????????????? 0 1 1 // J
32'b000011?????????????????????????? 0 1 1 // JAL
32'b000100?????????????????????????? 0 1 1 // BEQ
32'b000101?????????????????????????? 0 1 1 // BNE
32'b000110?????00000???????????????? 0 1 1 // BLEZ
32'b000111?????00000???????????????? 0 1 1 // BGTZ
32'b001000?????????????????????????? 0 1 1 // ADDI
32'b001001?????????????????????????? 0 1 1 // ADDIU
32'b001010?????????????????????????? 0 1 1 // SLTI
32'b001011?????????????????????????? 0 1 1 // SLTIU
32'b001100?????????????????????????? 0 1 1 // ANDI
32'b001101?????????????????????????? 0 1 1 // ORI
32'b001110?????????????????????????? 0 1 1 // XORI
32'b00111100000????????????????????? 0 1 1 // LUI
32'b01000000000??????????00000000??? 0 1 0 // MFC0
32'b01000000100??????????00000000??? 0 1 0 // MTC0
32'b01000010000000000000000000000001 0 0 1 // TLBR
32'b01000010000000000000000000000010 0 0 1 // TLBWI
32'b01000010000000000000000000001000 0 0 1 // TLBP
32'b01000010000000000000000000011000 1 1 1 // ERET
32'b011100???????????????00000000010 0 1 0 // MUL
32'b100000?????????????????????????? 0 0 1 // LB
32'b100001?????????????????????????? 0 0 1 // LH
32'b100011?????????????????????????? 0 0 1 // LW
32'b100100?????????????????????????? 0 0 1 // LBU
32'b100101?????????????????????????? 0 0 1 // LHU
32'b101000?????????????????????????? 0 0 1 // SB
32'b101001?????????????????????????? 0 0 1 // SH
32'b101011?????????????????????????? 0 0 1 // SW
32'b101111?????00000???????????????? 0 0 1 // I-Cache Index Invalid
32'b101111?????01000???????????????? 0 0 1 // I-Cache Index Store Tag
32'b101111?????10000???????????????? 0 0 1 // I-Cache Hit Invalid
32'b101111?????00001???????????????? 0 0 1 // D-Cache Index Writeback Invalid
32'b101111?????01001???????????????? 0 0 1 // D-Cache Index Store Tag
32'b101111?????10001???????????????? 0 0 1 // D-Cache Hit Invalid
32'b101111?????10101???????????????? 0 0 1 // D-Cache Hit Writeback Invalid

View File

@ -1,16 +0,0 @@
///------ HandShake_out1.readygo HandShake_out2.readygo out1 out2 HandShake_in1.allowin HandShake_in2.allowin en1 en2 en3 en4 di1 di2 di3 di4
6'b000000 0 0 qi1 qi2 1 1 1 1 0 0 in1 in2 ? ?
6'b000010 0 0 qi1 qi2 1 1 1 1 0 0 in1 in2 ? ?
6'b000011 0 0 qi1 qi2 1 1 1 1 0 0 in1 in2 ? ?
6'b000100 0 0 qi1 qi2 1 0 0 1 1 0 ? in1 in2 ?
6'b000110 1 0 qi1 qi2 1 1 1 1 0 0 in1 in2 ? ?
6'b000111 1 0 qi1 qi2 1 1 1 1 0 0 in1 in2 ? ?
6'b001100 0 0 qi1 qi2 0 0 0 0 1 1 ? ? in1 in2
6'b001110 1 0 qi1 qi2 1 0 1 1 1 0 qi2 in1 in2 ?
6'b001111 1 1 qi1 qi2 1 1 1 1 0 0 in1 in2 ? ?
6'b011100 0 0 qi1 qi2 0 0 0 0 0 1 ? ? ? in1
6'b011110 1 0 qi1 qi2 0 0 1 1 1 1 qi2 qi3 in1 in2
6'b011111 1 1 qi1 qi2 1 0 1 1 1 0 qi3 in1 in2 ?
6'b111100 0 0 qi1 qi2 0 0 0 0 0 0 ? ? ? ?
6'b111110 1 0 qi1 qi2 0 0 1 1 1 1 qi2 qi3 qi4 in1
6'b111111 1 1 qi1 qi2 0 0 1 1 1 1 qi3 qi4 in1 in2

View File

@ -1,21 +0,0 @@
///------ en3 en4
6'b000000 0 0
6'b000001 0 0
6'b000010 0 0
6'b000011 0 0
6'b000100 1 0
6'b000101 0 0
6'b000110 0 0
6'b000111 0 0
6'b001100 1 1
6'b001101 0 0
6'b001110 1 0
6'b001111 0 0
6'b011100 0 1
6'b011101 0 0
6'b011110 1 1
6'b011111 1 0
6'b111100 0 0
6'b111101 0 0
6'b111110 1 1
6'b111111 1 1

View File

@ -1,19 +0,0 @@
assign ctrl.ERET = inst[30] & inst[25];
assign ctrl.SYSCALL = ~inst[26] & ~inst[29] & ~inst[30] & ~inst[28] & ~inst[31] & ~inst[27] & inst[2] & inst[3] & ~inst[0];
assign ctrl.BREAK = ~inst[26] & ~inst[29] & ~inst[30] & ~inst[28] & ~inst[31] & ~inst[27] & inst[2] & inst[3] & inst[0];
assign ctrl.PFCtrl.BJRJ = ~inst[26] & (~inst[27] & (~inst[28] & ~inst[30] & ~inst[31] & ~inst[29] & inst[3] & ~inst[4] & ~inst[5] & ~inst[2] | inst[28] & ~inst[31] & ~inst[29]) | inst[27] & ~inst[29]) | inst[26] & ~inst[29] & ~inst[31];
assign ctrl.PFCtrl.BJR = ~inst[26] & (~inst[28] & ~inst[30] & ~inst[29] & ~inst[31] & ~inst[27] & inst[3] & ~inst[4] & ~inst[5] & ~inst[2] | inst[28] & ~inst[29] & ~inst[31]) | inst[26] & ~inst[29] & ~inst[31] & (~inst[27] | inst[27] & inst[28]);
assign ctrl.PFCtrl.BE = inst[28] & ~inst[29] & ~inst[31] & ~inst[27];
assign ctrl.DCtrl.DP0 = ~inst[31];
assign ctrl.DCtrl.DP1 = ~inst[30] & (~inst[26] & (~inst[29] & (~inst[28] & (~inst[31] & (~inst[27] & ~inst[4] | inst[27]) | inst[31]) | inst[28]) | inst[29]) | inst[26]) | inst[30] & inst[25];
assign ctrl.DCtrl.UI = inst[28] & inst[27] & inst[26];
assign ctrl.DCtrl.IX = ~inst[28] | inst[28] & inst[31];
assign ctrl.ECtrl.ALT = ~inst[31] & (~inst[26] & (~inst[27] & ~inst[29] & inst[1] & (~inst[5] & inst[0] | inst[5]) | inst[27]) | inst[26] & inst[27] & inst[29] & ~inst[28]);
assign ctrl.OFA = ~inst[26] & (~inst[29] & ~inst[30] & ~inst[28] & ~inst[31] & ~inst[27] & inst[5] & ~inst[0] & ~inst[2] & ~inst[3] | inst[29] & ~inst[28] & ~inst[31] & ~inst[27]);
assign ctrl.MCtrl1.MR = inst[31];
assign ctrl.MCtrl1.MWR = inst[29];
assign ctrl.MCtrl1.MX = ~inst[28];
assign ctrl.WCtrl.RW = ~inst[30] & (~inst[29] & (~inst[31] & ~inst[28] & (~inst[27] & (~inst[26] & (~inst[3] & (~inst[4] | inst[4] & ~inst[0]) | inst[3] & (~inst[5] & ~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[26] & inst[20]) | inst[27] & inst[26]) | inst[31]) | inst[29] & ~inst[31]) | inst[30] & ~inst[25] & ~inst[23];
assign ctrl.MCtrl0.HW = ~inst[26] & ~inst[29] & ~inst[30] & ~inst[28] & ~inst[27] & inst[4] & (~inst[3] & ~inst[1] & inst[0] | inst[3]);
assign ctrl.MCtrl0.LW = ~inst[26] & ~inst[29] & ~inst[30] & ~inst[28] & ~inst[27] & inst[4] & (~inst[3] & inst[1] & inst[0] | inst[3]);
assign ctrl.MCtrl0.C0W = inst[30] & inst[23];

View File

@ -1,88 +0,0 @@
SA
'SA': '~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & (~inst[4] & ~inst[3] & ~inst[2] & ~inst[1] | ~inst[4] & ~inst[3] & ~inst[2] & inst[1])'
'RS': '~inst[30] & (~inst[29] & (~inst[31] & ~inst[26] & ~inst[28] & ~inst[27] & (~inst[5] & (~inst[1] & (~inst[4] & ~inst[3] & inst[2] | inst[4] & inst[3]) | inst[1] & (~inst[3] & ~inst[4] & inst[2] | inst[3])) | inst[5]) | inst[31]) | inst[29] & (~inst[28] | inst[28] & (~inst[27] | inst[27] & ~inst[26])))'
'PC': '~inst[30] & ~inst[29] & ~inst[31] & (~inst[26] & (~inst[28] & (~inst[27] & ~inst[5] & (~inst[1] & (~inst[4] & inst[3] | inst[4] & ~inst[3]) | inst[1] & ~inst[3] & inst[4]) | inst[27]) | inst[28]) | inst[26])'
'0': '(~inst[30] & inst[29] & inst[28] & inst[27] & inst[26] | inst[30])'
2'b11 & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & ~inst[3] & ~inst[2])
| 2'b10 & (~inst[30] & (~inst[29] & (~inst[26] & ~inst[28] & ~inst[27] & ((~inst[1] & (~inst[4] & ~inst[3] & inst[2] | inst[4] & inst[3]) | inst[1] & (~inst[4] & inst[2] | inst[3])) | inst[5]) | inst[31]) | inst[29] & (~inst[28] | ~inst[27] | ~inst[26])))
| 2'b01 & (~inst[31] & ~inst[30] & ~inst[29] & (((~inst[5] & (~inst[1] & (~inst[4] & inst[3] | inst[4] & ~inst[3]) | inst[1] & ~inst[3] & inst[4]) | inst[27]) | inst[28]) | inst[26]))
| 2'b00 & (inst[29] & inst[28] & inst[27] & inst[26] | inst[30])
'SA': 2'b11
'RS': 2'b10
'PC': 2'b01
'0' : 2'b00
SA
{'SA': '~[30] & ~[29] & ~[31] & ~[26] & ~[28] & ~[27] & ~[5] & (~[1] & ~[4] & ~[3] & ~[2] | [1] & ~[3] & ~[4] & ~[2])', 'RS': '~[30] & (~[29] & (~[31] & ~[26] & ~[28] & ~[27] & (~[5] & (~[1] & (~[4] & ~[3] & [2] | [4] & [3]) | [1] & (~[3] & ~[4] & [2] | [3])) | [5]) | [31]) | [29] & (~[28] | [28] & (~[27] | [27] & ~[26])))', 'PC': '~[30] & ~[29] & ~[31] & (~[26] & (~[28] & (~[27] & ~[5] & (~[1] & (~[4] & [3] | [4] & ~[3]) | [1] & ~[3] & [4]) | [27]) | [28]) | [26])', '0': '(~[30] & [29] & [28] & [27] & [26] | [30])'}
1
{'0': '~[29] & ~[31] & (~[26] & (~[28] & ~[30] & (~[27] & ~[5] & (~[2] & (~[3] | [3] & ~[4]) | [2] & [3]) | [27]) | [28]) | [26])', '1': '(~[29] & (~[31] & ~[26] & ~[28] & (~[30] & ~[27] & (~[5] & (~[2] & [3] & [4] | [2] & ~[3]) | [5]) | [30]) | [31]) | [29])'}
0
{'0': '(~[30] & ~[31] & (~[29] & ~[26] & ~[28] & ~[27] & ~[5] & ~[4] & ~[2] & ~[3] | [29] & [28] & [27] & [26]) | [30])', '1': '~[30] & (~[31] & (~[29] & (~[26] & (~[28] & (~[27] & (~[5] & (~[4] & (~[2] & [3] | [2]) | [4]) | [5]) | [27]) | [28]) | [26]) | [29] & (~[28] | [28] & (~[27] | [27] & ~[26]))) | [31])'}
{((~inst[26] & ~inst[28] & (~inst[27] & ((~inst[2] & inst[3] & inst[4] | inst[2] & ~inst[3]) | inst[5]) | inst[30]) | inst[31]) | inst[29]),~inst[30] & ((~inst[29] & (inst[3] | inst[2] | inst[4] | inst[5] | inst[27] | inst[28] | inst[26]) | inst[29] & (~inst[28] | ~inst[27] | ~inst[26])) | inst[31])}
SB
'RT': '~inst[29] & ~inst[31] & ~inst[26] & ~inst[30] & ~inst[28] & ~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])'
'8': '~inst[29] & ~inst[31] & (~inst[26] & ~inst[30] & (~inst[28] & (~inst[27] & ~inst[5] & (~inst[1] & (~inst[0] & (~inst[3] & inst[4] | inst[3] & ~inst[4]) | inst[0] & (~inst[4] | inst[4] & ~inst[3])) | inst[1] & inst[4] & ~inst[3]) | inst[27]) | inst[28]) | inst[26])'
'IMM': '(~inst[29] & (~inst[31] & ~inst[26] & inst[30] | inst[31]) | inst[29])'
2'b10 & (~inst[29] & ~inst[31] & ~inst[26] & ~inst[30] & ~inst[28] & ~inst[27] & ((~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]))
| 2'b01 & (~inst[29] & ~inst[31] & (~inst[30] & ((~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[3]) | inst[27]) | inst[28]) | inst[26]))
| 2'b00 & (inst[30] & ~inst[26] | inst[31] | inst[29])
RT: 10
8: 01
IMM:00
SB
{'RT': '~[29] & ~[31] & ~[26] & ~[30] & ~[28] & ~[27] & (~[5] & (~[1] & (~[0] & (~[3] & ~[4] | [3] & [4]) | [0] & [4] & [3]) | [1] & (~[4] | [4] & [3])) | [5])', '8': '~[29] & ~[31] & (~[26] & ~[30] & (~[28] & (~[27] & ~[5] & (~[1] & (~[0] & (~[3] & [4] | [3] & ~[4]) | [0] & (~[4] | [4] & ~[3])) | [1] & [4] & ~[3]) | [27]) | [28]) | [26])', 'IMM': '(~[29] & (~[31] & ~[26] & [30] | [31]) | [29])'}
1
{'0': '~[26] & ~[29] & ~[30] & ~[28] & ~[31] & ~[27] & (~[5] & (~[1] & (~[0] & (~[3] & ~[4] | [3] & [4]) | [0] & [4] & [3]) | [1] & (~[4] | [4] & [3])) | [5])', '1': '(~[26] & (~[29] & (~[30] & (~[28] & (~[31] & (~[27] & ~[5] & (~[1] & (~[0] & (~[3] & [4] | [3] & ~[4]) | [0] & (~[4] | [4] & ~[3])) | [1] & [4] & ~[3]) | [27]) | [31]) | [28]) | [30]) | [29]) | [26])'}
0
{'0': '~[29] & ~[31] & ~[30]', '1': '(~[29] & (~[31] & [30] | [31]) | [29])'}
{(~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[3]) | inst[27] | inst[31] | inst[28] | inst[30] | inst[29] | inst[26]),((inst[30] | inst[31]) | inst[29])}
OP
assign ctrl.ECtrl.OP.f_sr = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[3] & (~inst[2] | inst[1]);
assign ctrl.ECtrl.OP.f_sl = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[3] & inst[2] & ~inst[1];
assign ctrl.ECtrl.OP.f_add = ((~inst[26] & ~inst[28] & ~inst[27] & ((~inst[5] & inst[3] | inst[5] & ~inst[3] & ~inst[2]) | inst[29]) | inst[26] & (~inst[29] | (~inst[28] & ~inst[27] | inst[28] & inst[27]))) | inst[31]);
assign ctrl.ECtrl.OP.f_slt = ~inst[31] & ~inst[26] & ~inst[28] & (~inst[29] & inst[5] & inst[3] & ~inst[2] & ~inst[0] | inst[27]);
assign ctrl.ECtrl.OP.f_sltu = ~inst[31] & (~inst[26] & ~inst[28] & ~inst[27] & ~inst[29] & inst[5] & ~inst[2] & inst[3] & inst[0] | inst[26] & inst[29] & ~inst[28] & inst[27]);
assign ctrl.ECtrl.OP.f_ans = ~inst[31] & ~inst[26] & (~inst[28] & ~inst[27] & ~inst[29] & inst[5] & inst[2] & ~inst[0] & ~inst[1] | inst[28] & ~inst[27]);
assign ctrl.ECtrl.OP.f_xor = ~inst[31] & ~inst[26] & (~inst[28] & ~inst[27] & ~inst[29] & inst[5] & inst[2] & ~inst[0] & inst[1] | inst[28] & inst[27]);
assign ctrl.ECtrl.OP.f_or = ~inst[31] & (~inst[26] & ~inst[28] & ~inst[27] & ~inst[29] & inst[5] & inst[2] & inst[0] | inst[26] & inst[29] & inst[28] & ~inst[27]);
RD
'RD': '~inst[31] & ~inst[29] & ~inst[26]'
'31': '~inst[31] & ~inst[29] & inst[26]'
'RT': 'inst[31] | inst[29]'
{inst[31] | inst[29], inst[26]}
RT: 1?
RD: 00
31: 01
RS0
{'ALUOut': '~[30] & (~[29] & (~[26] & ~[4] | [26]) | [29])', 'HI': '~[30] & ~[29] & ~[26] & [4] & ~[1]', 'LO': '~[30] & ~[29] & ~[26] & [4] & [1]', 'C0': '[30]'}
0
{'1': '(~[29] & ~[28] & (~[26] & ~[4] | [26]) | [29])', '0': '~[29] & (~[28] & ~[26] & [4] | [28])'}
1
{'0': '~[30] & (~[29] & (~[26] & (~[4] | [4] & [1]) | [26]) | [29])', '1': }
{(~inst[29] & ~inst[26] & inst[4] & ~inst[1] | inst[30]),(~inst[28] & (~inst[4] | inst[26]) | inst[29])}
HLS
{'RS': '~inst[3]', 'MULT': 'inst[3] & ~inst[1] & ~inst[0]', 'MULTU': 'inst[3] & ~inst[1] & inst[0]', 'DIV': 'inst[3] & inst[1] & ~inst[0]', 'DIVU': 'inst[3] & inst[1] & inst[0]'}

View File

@ -1,6 +0,0 @@
RS0
{'ALUOut': '~[30] & (~[29] & (~[26] & ~[4] | [26]) | [29])', 'HI': '~[30] & ~[29] & ~[26] & [4] & ~[1]', 'LO': '~[30] & ~[29] & ~[26] & [4] & [1]', 'C0': '[30]'}
1
{'1': '(~[29] & (~[26] & ~[4] | [26]) | [29])', '0': '~[29] & ~[26] & [4]'}
0
{'0': '~[30] & (~[29] & (~[26] & (~[4] | [4] & [1]) | [26]) | [29])', '1': '(~[30] & ~[29] & ~[26] & [4] & ~[1] | [30])'}

69
tools/tlb.txt Normal file
View File

@ -0,0 +1,69 @@
////-------------------------------- TLBR TLBWI TLBP
32'b00000000000???????????????000000 0 0 0 // SLL
32'b00000000000???????????????000010 0 0 0 // SRL
32'b00000000000???????????????000011 0 0 0 // SRA
32'b000000???????????????00000000100 0 0 0 // SLLV
32'b000000???????????????00000000110 0 0 0 // SRLV
32'b000000???????????????00000000111 0 0 0 // SRAV
32'b000000?????000000000000000001000 0 0 0 // JR
32'b000000?????00000?????00000001001 0 0 0 // JALR
32'b000000????????????????????001100 0 0 0 // SYSCALL
32'b000000????????????????????001101 0 0 0 // BREAK
32'b0000000000000000?????00000010000 0 0 0 // MFHI
32'b000000?????000000000000000010001 0 0 0 // MTHI
32'b0000000000000000?????00000010010 0 0 0 // MFLO
32'b000000?????000000000000000010011 0 0 0 // MTLO
32'b000000??????????0000000000011000 0 0 0 // MULT
32'b000000??????????0000000000011001 0 0 0 // MULTU
32'b000000??????????0000000000011010 0 0 0 // DIV
32'b000000??????????0000000000011011 0 0 0 // DIVU
32'b000000???????????????00000100000 0 0 0 // ADD
32'b000000???????????????00000100001 0 0 0 // ADDU
32'b000000???????????????00000100010 0 0 0 // SUB
32'b000000???????????????00000100011 0 0 0 // SUBU
32'b000000???????????????00000100100 0 0 0 // AND
32'b000000???????????????00000100101 0 0 0 // OR
32'b000000???????????????00000100110 0 0 0 // XOR
32'b000000???????????????00000100111 0 0 0 // NOR
32'b000000???????????????00000101010 0 0 0 // SLT
32'b000000???????????????00000101011 0 0 0 // SLTU
32'b000001?????00000???????????????? 0 0 0 // BLTZ
32'b000001?????10000???????????????? 0 0 0 // BLTZAL
32'b000001?????00001???????????????? 0 0 0 // BGEZ
32'b000001?????10001???????????????? 0 0 0 // BGEZAL
32'b000010?????????????????????????? 0 0 0 // J
32'b000011?????????????????????????? 0 0 0 // JAL
32'b000100?????????????????????????? 0 0 0 // BEQ
32'b000101?????????????????????????? 0 0 0 // BNE
32'b000110?????00000???????????????? 0 0 0 // BLEZ
32'b000111?????00000???????????????? 0 0 0 // BGTZ
32'b001000?????????????????????????? 0 0 0 // ADDI
32'b001001?????????????????????????? 0 0 0 // ADDIU
32'b001010?????????????????????????? 0 0 0 // SLTI
32'b001011?????????????????????????? 0 0 0 // SLTIU
32'b001100?????????????????????????? 0 0 0 // ANDI
32'b001101?????????????????????????? 0 0 0 // ORI
32'b001110?????????????????????????? 0 0 0 // XORI
32'b00111100000????????????????????? 0 0 0 // LUI
32'b01000000000??????????00000000??? 0 0 0 // MFC0
32'b01000000100??????????00000000??? 0 0 0 // MTC0
32'b01000010000000000000000000000001 1 0 0 // TLBR
32'b01000010000000000000000000000010 0 1 0 // TLBWI
32'b01000010000000000000000000001000 0 0 1 // TLBP
32'b01000010000000000000000000011000 0 0 0 // ERET
32'b011100???????????????00000000010 0 0 0 // MUL
32'b100000?????????????????????????? 0 0 0 // LB
32'b100001?????????????????????????? 0 0 0 // LH
32'b100011?????????????????????????? 0 0 0 // LW
32'b100100?????????????????????????? 0 0 0 // LBU
32'b100101?????????????????????????? 0 0 0 // LHU
32'b101000?????????????????????????? 0 0 0 // SB
32'b101001?????????????????????????? 0 0 0 // SH
32'b101011?????????????????????????? 0 0 0 // SW
32'b101111?????00000???????????????? 0 0 0 // I-Cache Index Invalid
32'b101111?????01000???????????????? 0 0 0 // I-Cache Index Store Tag
32'b101111?????10000???????????????? 0 0 0 // I-Cache Hit Invalid
32'b101111?????00001???????????????? 0 0 0 // D-Cache Index Writeback Invalid
32'b101111?????01001???????????????? 0 0 0 // D-Cache Index Store Tag
32'b101111?????10001???????????????? 0 0 0 // D-Cache Hit Invalid
32'b101111?????10101???????????????? 0 0 0 // D-Cache Hit Writeback Invalid