forked from Github_Repos/cvw
Rename ifu/dmem/ebu signals to match uarch diagram
This commit is contained in:
parent
aee44bb343
commit
d56d7a75a6
@ -28,39 +28,45 @@
|
|||||||
`include "wally-config.vh"
|
`include "wally-config.vh"
|
||||||
|
|
||||||
module dmem (
|
module dmem (
|
||||||
input logic clk, reset,
|
input logic clk, reset,
|
||||||
input logic FlushW,
|
input logic FlushW,
|
||||||
//
|
output logic DataStall,
|
||||||
input logic [1:0] MemRWM,
|
// Memory Stage
|
||||||
output logic [1:0] MemRWdcuoutM,
|
input logic [1:0] MemRWM,
|
||||||
output logic DataMisalignedM,
|
input logic [`XLEN-1:0] MemAdrM,
|
||||||
|
|
||||||
input logic [`XLEN-1:0] DataAdrM,
|
|
||||||
input logic [2:0] Funct3M,
|
input logic [2:0] Funct3M,
|
||||||
input logic [`XLEN-1:0] ReadDataM,
|
input logic [`XLEN-1:0] ReadDataM,
|
||||||
|
input logic [`XLEN-1:0] WriteDataM,
|
||||||
|
output logic [`XLEN-1:0] MemPAdrM,
|
||||||
|
output logic [1:0] MemRWAlignedM,
|
||||||
|
output logic DataMisalignedM,
|
||||||
|
// Writeback Stage
|
||||||
|
input logic MemAckW,
|
||||||
output logic [`XLEN-1:0] ReadDataW,
|
output logic [`XLEN-1:0] ReadDataW,
|
||||||
/* input logic [`XLEN-1:0] WriteDataM, */
|
|
||||||
// faults
|
// faults
|
||||||
input logic DataAccessFaultM,
|
input logic DataAccessFaultM,
|
||||||
output logic LoadMisalignedFaultM, LoadAccessFaultM,
|
output logic LoadMisalignedFaultM, LoadAccessFaultM,
|
||||||
output logic StoreMisalignedFaultM, StoreAccessFaultM
|
output logic StoreMisalignedFaultM, StoreAccessFaultM
|
||||||
);
|
);
|
||||||
|
|
||||||
// Pipeline register
|
// Initially no MMU
|
||||||
|
assign MemPAdrM = MemAdrM;
|
||||||
|
|
||||||
|
// Pipeline register *** AHB data will eventually come back in W anyway
|
||||||
floprc #(`XLEN) ReadDataWReg(clk, reset, FlushW, ReadDataM, ReadDataW);
|
floprc #(`XLEN) ReadDataWReg(clk, reset, FlushW, ReadDataM, ReadDataW);
|
||||||
|
|
||||||
// Determine if an Unaligned access is taking place
|
// Determine if an Unaligned access is taking place
|
||||||
always_comb
|
always_comb
|
||||||
case(Funct3M[1:0])
|
case(Funct3M[1:0])
|
||||||
2'b00: DataMisalignedM = 0; // lb, sb, lbu
|
2'b00: DataMisalignedM = 0; // lb, sb, lbu
|
||||||
2'b01: DataMisalignedM = DataAdrM[0]; // lh, sh, lhu
|
2'b01: DataMisalignedM = MemAdrM[0]; // lh, sh, lhu
|
||||||
2'b10: DataMisalignedM = DataAdrM[1] | DataAdrM[0]; // lw, sw, flw, fsw, lwu
|
2'b10: DataMisalignedM = MemAdrM[1] | MemAdrM[0]; // lw, sw, flw, fsw, lwu
|
||||||
2'b11: DataMisalignedM = |DataAdrM[2:0]; // ld, sd, fld, fsd
|
2'b11: DataMisalignedM = |MemAdrM[2:0]; // ld, sd, fld, fsd
|
||||||
endcase
|
endcase
|
||||||
|
|
||||||
// Squash unaligned data accesses
|
// Squash unaligned data accesses
|
||||||
// *** this is also the place to squash if the cache is hit
|
// *** this is also the place to squash if the cache is hit
|
||||||
assign MemRWdcuoutM = MemRWM & {2{~DataMisalignedM}};
|
assign MemRWAlignedM = MemRWM & {2{~DataMisalignedM}};
|
||||||
|
|
||||||
// Determine if address is valid
|
// Determine if address is valid
|
||||||
assign LoadMisalignedFaultM = DataMisalignedM & MemRWM[1];
|
assign LoadMisalignedFaultM = DataMisalignedM & MemRWM[1];
|
||||||
@ -68,6 +74,8 @@ module dmem (
|
|||||||
assign StoreMisalignedFaultM = DataMisalignedM & MemRWM[0];
|
assign StoreMisalignedFaultM = DataMisalignedM & MemRWM[0];
|
||||||
assign StoreAccessFaultM = DataAccessFaultM & MemRWM[0];
|
assign StoreAccessFaultM = DataAccessFaultM & MemRWM[0];
|
||||||
|
|
||||||
|
// Data stall
|
||||||
|
assign DataStall = 0;
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
@ -35,14 +35,14 @@ module ahblite (
|
|||||||
// Load control
|
// Load control
|
||||||
input logic UnsignedLoadM,
|
input logic UnsignedLoadM,
|
||||||
// Signals from Instruction Cache
|
// Signals from Instruction Cache
|
||||||
input logic [`XLEN-1:0] IPAdrF,
|
input logic [`XLEN-1:0] InstrPAdrF, // *** rename these to match block diagram
|
||||||
input logic IReadF,
|
input logic IReadF,
|
||||||
output logic [`XLEN-1:0] IRData,
|
output logic [`XLEN-1:0] IRData,
|
||||||
// output logic IReady,
|
// output logic IReady,
|
||||||
// Signals from Data Cache
|
// Signals from Data Cache
|
||||||
input logic [`XLEN-1:0] DPAdrM,
|
input logic [`XLEN-1:0] MemPAdrM,
|
||||||
input logic DReadM, DWriteM,
|
input logic DReadM, DWriteM,
|
||||||
input logic [`XLEN-1:0] DWDataM,
|
input logic [`XLEN-1:0] WriteDataM,
|
||||||
input logic [1:0] DSizeM,
|
input logic [1:0] DSizeM,
|
||||||
// Return from bus
|
// Return from bus
|
||||||
output logic [`XLEN-1:0] DRData,
|
output logic [`XLEN-1:0] DRData,
|
||||||
@ -59,8 +59,10 @@ module ahblite (
|
|||||||
output logic [3:0] HPROT,
|
output logic [3:0] HPROT,
|
||||||
output logic [1:0] HTRANS,
|
output logic [1:0] HTRANS,
|
||||||
output logic HMASTLOCK,
|
output logic HMASTLOCK,
|
||||||
|
// Acknowledge
|
||||||
|
output logic InstrAckD, MemAckW
|
||||||
// Stalls
|
// Stalls
|
||||||
output logic InstrStall, DataStall
|
// output logic InstrStall, DataStall
|
||||||
);
|
);
|
||||||
|
|
||||||
logic GrantData;
|
logic GrantData;
|
||||||
@ -83,8 +85,8 @@ module ahblite (
|
|||||||
endgenerate
|
endgenerate
|
||||||
|
|
||||||
// drive bus outputs
|
// drive bus outputs
|
||||||
assign HADDR = GrantData ? DPAdrM[31:0] : IPAdrF[31:0];
|
assign HADDR = GrantData ? MemPAdrM[31:0] : InstrPAdrF[31:0];
|
||||||
assign HWDATA = DWDataM;
|
assign HWDATA = WriteDataM;
|
||||||
//flop #(`XLEN) wdreg(HCLK, DWDataM, HWDATA); // delay HWDATA by 1 cycle per spec; *** assumes AHBW = XLEN
|
//flop #(`XLEN) wdreg(HCLK, DWDataM, HWDATA); // delay HWDATA by 1 cycle per spec; *** assumes AHBW = XLEN
|
||||||
assign HWRITE = DWriteM;
|
assign HWRITE = DWriteM;
|
||||||
assign HSIZE = GrantData ? {1'b0, DSizeM} : ISize;
|
assign HSIZE = GrantData ? {1'b0, DSizeM} : ISize;
|
||||||
@ -102,9 +104,9 @@ module ahblite (
|
|||||||
|
|
||||||
// stalls
|
// stalls
|
||||||
// Stall MEM stage if data is being accessed and bus isn't yet ready
|
// Stall MEM stage if data is being accessed and bus isn't yet ready
|
||||||
assign DataStall = GrantData & ~HREADY;
|
//assign DataStall = GrantData & ~HREADY;
|
||||||
// Stall Fetch stage if instruction should be read but reading data or bus isn't ready
|
// Stall Fetch stage if instruction should be read but reading data or bus isn't ready
|
||||||
assign InstrStall = IReadF & (GrantData | ~HREADY);
|
//assign InstrStall = IReadF & (GrantData | ~HREADY);
|
||||||
|
|
||||||
// *** consider adding memory access faults based on HRESP being high
|
// *** consider adding memory access faults based on HRESP being high
|
||||||
// InstrAccessFaultF, DataAccessFaultM,
|
// InstrAccessFaultF, DataAccessFaultM,
|
||||||
|
@ -48,7 +48,7 @@ module datapath (
|
|||||||
input logic [`XLEN-1:0] ReadDataW,
|
input logic [`XLEN-1:0] ReadDataW,
|
||||||
input logic RetM, TrapM,
|
input logic RetM, TrapM,
|
||||||
output logic [`XLEN-1:0] SrcAM,
|
output logic [`XLEN-1:0] SrcAM,
|
||||||
output logic [`XLEN-1:0] WriteDataM, DataAdrM,
|
output logic [`XLEN-1:0] WriteDataM, MemAdrM,
|
||||||
// Writeback stage signals
|
// Writeback stage signals
|
||||||
input logic FlushW,
|
input logic FlushW,
|
||||||
input logic RegWriteW,
|
input logic RegWriteW,
|
||||||
@ -103,7 +103,7 @@ module datapath (
|
|||||||
// Memory stage pipeline register
|
// Memory stage pipeline register
|
||||||
floprc #(`XLEN) SrcAMReg(clk, reset, FlushM, SrcAE, SrcAM);
|
floprc #(`XLEN) SrcAMReg(clk, reset, FlushM, SrcAE, SrcAM);
|
||||||
floprc #(`XLEN) ALUResultMReg(clk, reset, FlushM, ALUResultE, ALUResultM);
|
floprc #(`XLEN) ALUResultMReg(clk, reset, FlushM, ALUResultE, ALUResultM);
|
||||||
assign DataAdrM = ALUResultM;
|
assign MemAdrM = ALUResultM;
|
||||||
floprc #(`XLEN) WriteDataMReg(clk, reset, FlushM, WriteDataE, WriteDataM);
|
floprc #(`XLEN) WriteDataMReg(clk, reset, FlushM, WriteDataE, WriteDataM);
|
||||||
floprc #(5) RdMEg(clk, reset, FlushM, RdE, RdM);
|
floprc #(5) RdMEg(clk, reset, FlushM, RdE, RdM);
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ module ieu (
|
|||||||
input logic DataMisalignedM,
|
input logic DataMisalignedM,
|
||||||
input logic DataAccessFaultM,
|
input logic DataAccessFaultM,
|
||||||
output logic [1:0] MemRWM,
|
output logic [1:0] MemRWM,
|
||||||
output logic [`XLEN-1:0] DataAdrM, WriteDataM,
|
output logic [`XLEN-1:0] MemAdrM, WriteDataM,
|
||||||
output logic [`XLEN-1:0] SrcAM,
|
output logic [`XLEN-1:0] SrcAM,
|
||||||
output logic [2:0] Funct3M,
|
output logic [2:0] Funct3M,
|
||||||
// Writeback stage
|
// Writeback stage
|
||||||
|
@ -32,6 +32,9 @@ module ifu (
|
|||||||
// Fetch
|
// Fetch
|
||||||
input logic [31:0] InstrF,
|
input logic [31:0] InstrF,
|
||||||
output logic [`XLEN-1:0] PCF,
|
output logic [`XLEN-1:0] PCF,
|
||||||
|
output logic [`XLEN-1:0] InstrPAdrF,
|
||||||
|
// Decode
|
||||||
|
output logic InstrStall,
|
||||||
// Execute
|
// Execute
|
||||||
input logic PCSrcE,
|
input logic PCSrcE,
|
||||||
input logic [`XLEN-1:0] PCTargetE,
|
input logic [`XLEN-1:0] PCTargetE,
|
||||||
@ -60,6 +63,8 @@ module ifu (
|
|||||||
logic [31:0] nop = 32'h00000013; // instruction for NOP
|
logic [31:0] nop = 32'h00000013; // instruction for NOP
|
||||||
|
|
||||||
// *** put memory interface on here, InstrF becomes output
|
// *** put memory interface on here, InstrF becomes output
|
||||||
|
assign InstrStall = 0; // ***
|
||||||
|
assign InstrPAdrF = PCF; // *** no MMU
|
||||||
|
|
||||||
assign PrivilegedChangePCM = RetM | TrapM;
|
assign PrivilegedChangePCM = RetM | TrapM;
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ module privileged (
|
|||||||
input logic LoadMisalignedFaultM, LoadAccessFaultM,
|
input logic LoadMisalignedFaultM, LoadAccessFaultM,
|
||||||
input logic StoreMisalignedFaultM, StoreAccessFaultM,
|
input logic StoreMisalignedFaultM, StoreAccessFaultM,
|
||||||
input logic TimerIntM, ExtIntM, SwIntM,
|
input logic TimerIntM, ExtIntM, SwIntM,
|
||||||
input logic [`XLEN-1:0] InstrMisalignedAdrM, DataAdrM,
|
input logic [`XLEN-1:0] InstrMisalignedAdrM, MemAdrM,
|
||||||
input logic [4:0] SetFflagsM,
|
input logic [4:0] SetFflagsM,
|
||||||
output logic [2:0] FRM_REGW,
|
output logic [2:0] FRM_REGW,
|
||||||
input logic FlushD, FlushE, FlushM, StallD
|
input logic FlushD, FlushE, FlushM, StallD
|
||||||
|
@ -37,7 +37,7 @@ module trap (
|
|||||||
input logic [`XLEN-1:0] MEPC_REGW, SEPC_REGW, UEPC_REGW, UTVEC_REGW, STVEC_REGW, MTVEC_REGW,
|
input logic [`XLEN-1:0] MEPC_REGW, SEPC_REGW, UEPC_REGW, UTVEC_REGW, STVEC_REGW, MTVEC_REGW,
|
||||||
input logic [11:0] MIP_REGW, MIE_REGW,
|
input logic [11:0] MIP_REGW, MIE_REGW,
|
||||||
input logic STATUS_MIE, STATUS_SIE,
|
input logic STATUS_MIE, STATUS_SIE,
|
||||||
input logic [`XLEN-1:0] InstrMisalignedAdrM, DataAdrM,
|
input logic [`XLEN-1:0] InstrMisalignedAdrM, MemAdrM,
|
||||||
input logic [31:0] InstrM,
|
input logic [31:0] InstrM,
|
||||||
output logic TrapM, MTrapM, STrapM, UTrapM, RetM,
|
output logic TrapM, MTrapM, STrapM, UTrapM, RetM,
|
||||||
output logic [`XLEN-1:0] PrivilegedNextPCM, CauseM, NextFaultMtvalM
|
output logic [`XLEN-1:0] PrivilegedNextPCM, CauseM, NextFaultMtvalM
|
||||||
@ -107,11 +107,11 @@ module trap (
|
|||||||
|
|
||||||
always_comb
|
always_comb
|
||||||
if (InstrMisalignedFaultM) NextFaultMtvalM = InstrMisalignedAdrM;
|
if (InstrMisalignedFaultM) NextFaultMtvalM = InstrMisalignedAdrM;
|
||||||
else if (LoadMisalignedFaultM) NextFaultMtvalM = DataAdrM;
|
else if (LoadMisalignedFaultM) NextFaultMtvalM = MemAdrM;
|
||||||
else if (StoreMisalignedFaultM) NextFaultMtvalM = DataAdrM;
|
else if (StoreMisalignedFaultM) NextFaultMtvalM = MemAdrM;
|
||||||
else if (InstrPageFaultM) NextFaultMtvalM = 0; // *** implement
|
else if (InstrPageFaultM) NextFaultMtvalM = 0; // *** implement
|
||||||
else if (LoadPageFaultM) NextFaultMtvalM = DataAdrM;
|
else if (LoadPageFaultM) NextFaultMtvalM = MemAdrM;
|
||||||
else if (StorePageFaultM) NextFaultMtvalM = DataAdrM;
|
else if (StorePageFaultM) NextFaultMtvalM = MemAdrM;
|
||||||
else if (IllegalInstrFaultM) NextFaultMtvalM = {{(`XLEN-32){1'b0}}, InstrM};
|
else if (IllegalInstrFaultM) NextFaultMtvalM = {{(`XLEN-32){1'b0}}, InstrM};
|
||||||
else NextFaultMtvalM = 0;
|
else NextFaultMtvalM = 0;
|
||||||
endmodule
|
endmodule
|
@ -79,11 +79,13 @@ module wallypipelinedhart (
|
|||||||
logic FloatRegWriteW;
|
logic FloatRegWriteW;
|
||||||
|
|
||||||
// bus interface to dmem
|
// bus interface to dmem
|
||||||
logic [1:0] MemRWdcuoutM;
|
logic [1:0] MemRWAlignedM;
|
||||||
logic [2:0] Funct3M;
|
logic [2:0] Funct3M;
|
||||||
logic [`XLEN-1:0] DataAdrM, WriteDataM;
|
logic [`XLEN-1:0] MemAdrM, MemPAdrM, WriteDataM;
|
||||||
logic [`XLEN-1:0] ReadDataM, ReadDataW;
|
logic [`XLEN-1:0] ReadDataM, ReadDataW;
|
||||||
|
logic [`XLEN-1:0] InstrPAdrF;
|
||||||
logic DataStall, InstrStall;
|
logic DataStall, InstrStall;
|
||||||
|
logic InstrAckD, MemAckW;
|
||||||
|
|
||||||
ifu ifu(.*); // instruction fetch unit: PC, branch prediction, instruction cache
|
ifu ifu(.*); // instruction fetch unit: PC, branch prediction, instruction cache
|
||||||
|
|
||||||
@ -91,8 +93,8 @@ module wallypipelinedhart (
|
|||||||
dmem dmem(/*.Funct3M(InstrM[14:12]),*/ .*); // data cache unit
|
dmem dmem(/*.Funct3M(InstrM[14:12]),*/ .*); // data cache unit
|
||||||
|
|
||||||
ahblite ebu( // *** make IRData InstrF
|
ahblite ebu( // *** make IRData InstrF
|
||||||
.IPAdrF(PCF), .IReadF(1'b1), .IRData(), //.IReady(),
|
.IReadF(1'b1), .IRData(), //.IReady(),
|
||||||
.DPAdrM(DataAdrM), .DReadM(MemRWdcuoutM[1]), .DWriteM(MemRWdcuoutM[0]), .DWDataM(WriteDataM),
|
.DReadM(MemRWAlignedM[1]), .DWriteM(MemRWAlignedM[0]),
|
||||||
.DSizeM(Funct3M[1:0]), .DRData(ReadDataM), //.DReady(),
|
.DSizeM(Funct3M[1:0]), .DRData(ReadDataM), //.DReady(),
|
||||||
.UnsignedLoadM(Funct3M[2]),
|
.UnsignedLoadM(Funct3M[2]),
|
||||||
.*);
|
.*);
|
||||||
|
Loading…
Reference in New Issue
Block a user