mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Merge pull request #849 from davidharrishmc/dev
lint cleanup and divider optimization
This commit is contained in:
commit
e1fc44a5bf
@ -12,7 +12,7 @@ NC='\033[0m' # No Color
|
|||||||
fails=0
|
fails=0
|
||||||
|
|
||||||
if [ "$1" == "--nightly" ]; then
|
if [ "$1" == "--nightly" ]; then
|
||||||
configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i) # fdqh_rv64gc
|
configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i)
|
||||||
derivconfigs=`ls $WALLY/config/deriv`
|
derivconfigs=`ls $WALLY/config/deriv`
|
||||||
for entry in $derivconfigs
|
for entry in $derivconfigs
|
||||||
do
|
do
|
||||||
@ -21,7 +21,7 @@ if [ "$1" == "--nightly" ]; then
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i ) # add fdqh_rv64gc when working
|
configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i fdqh_rv64gc)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for config in ${configs[@]}; do
|
for config in ${configs[@]}; do
|
||||||
|
@ -388,10 +388,23 @@ VIRTMEM_SUPPORTED 0
|
|||||||
|
|
||||||
deriv nodcache_rv32gc rv32gc
|
deriv nodcache_rv32gc rv32gc
|
||||||
DCACHE_SUPPORTED 0
|
DCACHE_SUPPORTED 0
|
||||||
|
D_SUPPORTED 0
|
||||||
|
ZALRSC_SUPPORTED 0
|
||||||
|
ZAAMO_SUPPORTED 0
|
||||||
|
ZICBOM_SUPPORTED 0
|
||||||
|
ZICBOZ_SUPPORTED 0
|
||||||
|
VIRTMEM_SUPPORTED 0
|
||||||
|
|
||||||
|
# nocache_rv32gc must also disable several features incompatible with no cache
|
||||||
deriv nocache_rv32gc rv32gc
|
deriv nocache_rv32gc rv32gc
|
||||||
ICACHE_SUPPORTED 0
|
ICACHE_SUPPORTED 0
|
||||||
DCACHE_SUPPORTED 0
|
DCACHE_SUPPORTED 0
|
||||||
|
D_SUPPORTED 0
|
||||||
|
ZALRSC_SUPPORTED 0
|
||||||
|
ZAAMO_SUPPORTED 0
|
||||||
|
ZICBOM_SUPPORTED 0
|
||||||
|
ZICBOZ_SUPPORTED 0
|
||||||
|
VIRTMEM_SUPPORTED 0
|
||||||
|
|
||||||
deriv noicache_rv64gc rv64gc
|
deriv noicache_rv64gc rv64gc
|
||||||
ICACHE_SUPPORTED 0
|
ICACHE_SUPPORTED 0
|
||||||
|
@ -61,7 +61,6 @@ module fdivsqrt import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [P.DIVb+3:0] D; // Iterator Divisor
|
logic [P.DIVb+3:0] D; // Iterator Divisor
|
||||||
logic [P.DIVb:0] FirstU, FirstUM; // Intermediate result values
|
logic [P.DIVb:0] FirstU, FirstUM; // Intermediate result values
|
||||||
logic [P.DIVb+1:0] FirstC; // Step tracker
|
logic [P.DIVb+1:0] FirstC; // Step tracker
|
||||||
logic Firstun; // Quotient selection
|
|
||||||
logic WZeroE; // Early termination flag
|
logic WZeroE; // Early termination flag
|
||||||
logic [P.DURLEN-1:0] CyclesE; // FSM cycles
|
logic [P.DURLEN-1:0] CyclesE; // FSM cycles
|
||||||
logic SpecialCaseM; // Divide by zero, square root of negative, etc.
|
logic SpecialCaseM; // Divide by zero, square root of negative, etc.
|
||||||
@ -89,11 +88,11 @@ module fdivsqrt import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
fdivsqrtiter #(P) fdivsqrtiter( // CSA Iterator
|
fdivsqrtiter #(P) fdivsqrtiter( // CSA Iterator
|
||||||
.clk, .IFDivStartE, .FDivBusyE, .SqrtE, .X, .D,
|
.clk, .IFDivStartE, .FDivBusyE, .SqrtE, .X, .D,
|
||||||
.FirstU, .FirstUM, .FirstC, .Firstun, .FirstWS(WS), .FirstWC(WC));
|
.FirstU, .FirstUM, .FirstC, .FirstWS(WS), .FirstWC(WC));
|
||||||
|
|
||||||
fdivsqrtpostproc #(P) fdivsqrtpostproc( // Postprocessor
|
fdivsqrtpostproc #(P) fdivsqrtpostproc( // Postprocessor
|
||||||
.clk, .reset, .StallM, .WS, .WC, .D, .FirstU, .FirstUM, .FirstC,
|
.clk, .reset, .StallM, .WS, .WC, .D, .FirstU, .FirstUM, .FirstC,
|
||||||
.SqrtE, .Firstun, .SqrtM, .SpecialCaseM,
|
.SqrtE, .SqrtM, .SpecialCaseM,
|
||||||
.UmM, .WZeroE, .DivStickyM,
|
.UmM, .WZeroE, .DivStickyM,
|
||||||
// Int-specific
|
// Int-specific
|
||||||
.IntNormShiftM, .ALTBM, .AsM, .BsM, .BZeroM, .W64M, .RemOpM(Funct3M[1]), .AM,
|
.IntNormShiftM, .ALTBM, .AsM, .BsM, .BZeroM, .W64M, .RemOpM(Funct3M[1]), .AM,
|
||||||
|
@ -35,7 +35,6 @@ module fdivsqrtiter import cvw::*; #(parameter cvw_t P) (
|
|||||||
input logic [P.DIVb+3:0] X, D, // Q4.DIVb
|
input logic [P.DIVb+3:0] X, D, // Q4.DIVb
|
||||||
output logic [P.DIVb:0] FirstU, FirstUM, // U1.DIVb
|
output logic [P.DIVb:0] FirstU, FirstUM, // U1.DIVb
|
||||||
output logic [P.DIVb+1:0] FirstC, // Q2.DIVb
|
output logic [P.DIVb+1:0] FirstC, // Q2.DIVb
|
||||||
output logic Firstun,
|
|
||||||
output logic [P.DIVb+3:0] FirstWS, FirstWC // Q4.DIVb
|
output logic [P.DIVb+3:0] FirstWS, FirstWC // Q4.DIVb
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -119,6 +118,5 @@ module fdivsqrtiter import cvw::*; #(parameter cvw_t P) (
|
|||||||
assign FirstU = U[0];
|
assign FirstU = U[0];
|
||||||
assign FirstUM = UM[0];
|
assign FirstUM = UM[0];
|
||||||
assign FirstC = C[0];
|
assign FirstC = C[0];
|
||||||
assign Firstun = un[0];
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ module fdivsqrtpostproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
input logic [P.DIVb:0] FirstU, FirstUM, // U1.DIVb
|
input logic [P.DIVb:0] FirstU, FirstUM, // U1.DIVb
|
||||||
input logic [P.DIVb+1:0] FirstC, // Q2.DIVb
|
input logic [P.DIVb+1:0] FirstC, // Q2.DIVb
|
||||||
input logic SqrtE,
|
input logic SqrtE,
|
||||||
input logic Firstun, SqrtM, SpecialCaseM,
|
input logic SqrtM, SpecialCaseM,
|
||||||
input logic [P.XLEN-1:0] AM, // U/Q(XLEN.0)
|
input logic [P.XLEN-1:0] AM, // U/Q(XLEN.0)
|
||||||
input logic RemOpM, ALTBM, BZeroM, AsM, BsM, W64M,
|
input logic RemOpM, ALTBM, BZeroM, AsM, BsM, W64M,
|
||||||
input logic [P.DIVBLEN-1:0] IntNormShiftM,
|
input logic [P.DIVBLEN-1:0] IntNormShiftM,
|
||||||
@ -71,7 +71,7 @@ module fdivsqrtpostproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
mux2 #(P.DIVb+4) fzeromux(FZeroDivE, FZeroSqrtE, SqrtE, FZeroE);
|
mux2 #(P.DIVb+4) fzeromux(FZeroDivE, FZeroSqrtE, SqrtE, FZeroE);
|
||||||
csa #(P.DIVb+4) fadd(WS, WC, FZeroE, 1'b0, WSF, WCF); // compute {WCF, WSF} = {WS + WC + FZero};
|
csa #(P.DIVb+4) fadd(WS, WC, FZeroE, 1'b0, WSF, WCF); // compute {WCF, WSF} = {WS + WC + FZero};
|
||||||
aplusbeq0 #(P.DIVb+4) wcfpluswsfeq0(WCF, WSF, wfeq0E);
|
aplusbeq0 #(P.DIVb+4) wcfpluswsfeq0(WCF, WSF, wfeq0E);
|
||||||
assign WZeroE = weq0E|(wfeq0E & Firstun);
|
assign WZeroE = weq0E | wfeq0E;
|
||||||
end else begin
|
end else begin
|
||||||
assign WZeroE = weq0E;
|
assign WZeroE = weq0E;
|
||||||
end
|
end
|
||||||
|
@ -233,8 +233,9 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
flopen #(P.XLEN) srcareg(clk, IFDivStartE, AE, AM);
|
flopen #(P.XLEN) srcareg(clk, IFDivStartE, AE, AM);
|
||||||
if (P.XLEN==64)
|
if (P.XLEN==64)
|
||||||
flopen #(1) w64reg(clk, IFDivStartE, W64E, W64M);
|
flopen #(1) w64reg(clk, IFDivStartE, W64E, W64M);
|
||||||
|
else assign W64M = 0;
|
||||||
end else
|
end else
|
||||||
assign {ALTBM, W64M, AsM, BsM, BZeroM, AM, IntNormShiftM} = 0;
|
assign {ALTBM, W64M, AsM, BsM, BZeroM, AM, IntNormShiftM} = '0;
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
@ -134,6 +134,7 @@ module postprocess import cvw::*; #(parameter cvw_t P) (
|
|||||||
assign OutFmt = IntToFp|~CvtOp ? Fmt : (OpCtrl[1:0] == P.FMT);
|
assign OutFmt = IntToFp|~CvtOp ? Fmt : (OpCtrl[1:0] == P.FMT);
|
||||||
else if (P.FPSIZES == 3 | P.FPSIZES == 4)
|
else if (P.FPSIZES == 3 | P.FPSIZES == 4)
|
||||||
assign OutFmt = IntToFp|~CvtOp ? Fmt : OpCtrl[1:0];
|
assign OutFmt = IntToFp|~CvtOp ? Fmt : OpCtrl[1:0];
|
||||||
|
else assign OutFmt = 0; // FPSIZES = 1
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Normalization
|
// Normalization
|
||||||
|
@ -38,11 +38,14 @@ module zknde64 import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
if (P.ZKND_SUPPORTED) // ZKND supports aes64ds, aes64dsm, aes64im
|
if (P.ZKND_SUPPORTED) // ZKND supports aes64ds, aes64dsm, aes64im
|
||||||
aes64d aes64d(.rs1(A), .rs2(B), .finalround(ZKNSelect[2]), .aes64im(ZKNSelect[3]), .result(aes64dRes)); // decode AES
|
aes64d aes64d(.rs1(A), .rs2(B), .finalround(ZKNSelect[2]), .aes64im(ZKNSelect[3]), .result(aes64dRes)); // decode AES
|
||||||
|
else assign aes64dRes = '0;
|
||||||
if (P.ZKNE_SUPPORTED) begin // ZKNE supports aes64es, aes64esm
|
if (P.ZKNE_SUPPORTED) begin // ZKNE supports aes64es, aes64esm
|
||||||
aes64e aes64e(.rs1(A), .rs2(B), .finalround(ZKNSelect[2]), .Sbox0Out, .SboxEIn, .result(aes64eRes));
|
aes64e aes64e(.rs1(A), .rs2(B), .finalround(ZKNSelect[2]), .Sbox0Out, .SboxEIn, .result(aes64eRes));
|
||||||
mux2 #(32) sboxmux(SboxEIn, SboxKIn, ZKNSelect[1], Sbox0In);
|
mux2 #(32) sboxmux(SboxEIn, SboxKIn, ZKNSelect[1], Sbox0In);
|
||||||
end else
|
end else begin
|
||||||
|
assign aes64eRes = '0;
|
||||||
assign Sbox0In = SboxKIn;
|
assign Sbox0In = SboxKIn;
|
||||||
|
end
|
||||||
|
|
||||||
// One S Box is always needed for aes64ks1i and is also needed for aes64e if that is supported. Put it at the top level to allow sharing
|
// One S Box is always needed for aes64ks1i and is also needed for aes64e if that is supported. Put it at the top level to allow sharing
|
||||||
aessbox32 sbox(Sbox0In, Sbox0Out); // Substitute bytes of value obtained for tmp2 using Rijndael sbox
|
aessbox32 sbox(Sbox0In, Sbox0Out); // Substitute bytes of value obtained for tmp2 using Rijndael sbox
|
||||||
|
@ -144,7 +144,6 @@ module lsu import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
logic DTLBMissM; // DTLB miss causes HPTW walk
|
logic DTLBMissM; // DTLB miss causes HPTW walk
|
||||||
logic DTLBWriteM; // Writes PTE and PageType to DTLB
|
logic DTLBWriteM; // Writes PTE and PageType to DTLB
|
||||||
logic DataUpdateDAM; // DTLB hit needs to update dirty or access bits
|
|
||||||
logic LSULoadAccessFaultM; // Load acces fault
|
logic LSULoadAccessFaultM; // Load acces fault
|
||||||
logic LSUStoreAmoAccessFaultM; // Store access fault
|
logic LSUStoreAmoAccessFaultM; // Store access fault
|
||||||
logic IgnoreRequestTLB; // On either ITLB or DTLB miss, ignore miss so HPTW can handle
|
logic IgnoreRequestTLB; // On either ITLB or DTLB miss, ignore miss so HPTW can handle
|
||||||
@ -194,7 +193,7 @@ module lsu import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
if(P.VIRTMEM_SUPPORTED) begin : hptw
|
if(P.VIRTMEM_SUPPORTED) begin : hptw
|
||||||
hptw #(P) hptw(.clk, .reset, .MemRWM, .AtomicM, .ITLBMissOrUpdateAF, .ITLBWriteF,
|
hptw #(P) hptw(.clk, .reset, .MemRWM, .AtomicM, .ITLBMissOrUpdateAF, .ITLBWriteF,
|
||||||
.DTLBMissOrUpdateDAM, .DTLBWriteM, .DataUpdateDAM,
|
.DTLBMissOrUpdateDAM, .DTLBWriteM,
|
||||||
.FlushW, .DCacheBusStallM, .SATP_REGW, .PCSpillF,
|
.FlushW, .DCacheBusStallM, .SATP_REGW, .PCSpillF,
|
||||||
.STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_ADUE, .PrivilegeModeW,
|
.STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_ADUE, .PrivilegeModeW,
|
||||||
.ReadDataM(ReadDataM[P.XLEN-1:0]), // ReadDataM is LLEN, but HPTW only needs XLEN
|
.ReadDataM(ReadDataM[P.XLEN-1:0]), // ReadDataM is LLEN, but HPTW only needs XLEN
|
||||||
@ -236,6 +235,8 @@ module lsu import cvw::*; #(parameter cvw_t P) (
|
|||||||
if(P.ZICSR_SUPPORTED == 1) begin : dmmu
|
if(P.ZICSR_SUPPORTED == 1) begin : dmmu
|
||||||
logic DisableTranslation; // During HPTW walk or D$ flush disable virtual memory address translation
|
logic DisableTranslation; // During HPTW walk or D$ flush disable virtual memory address translation
|
||||||
logic WriteAccessM;
|
logic WriteAccessM;
|
||||||
|
logic DataUpdateDAM; // DTLB hit needs to update dirty or access bits
|
||||||
|
|
||||||
assign DisableTranslation = SelHPTW | FlushDCacheM;
|
assign DisableTranslation = SelHPTW | FlushDCacheM;
|
||||||
assign WriteAccessM = PreLSURWM[0];
|
assign WriteAccessM = PreLSURWM[0];
|
||||||
mmu #(.P(P), .TLB_ENTRIES(P.DTLB_ENTRIES), .IMMU(0))
|
mmu #(.P(P), .TLB_ENTRIES(P.DTLB_ENTRIES), .IMMU(0))
|
||||||
@ -245,7 +246,7 @@ module lsu import cvw::*; #(parameter cvw_t P) (
|
|||||||
.PhysicalAddress(PAdrM), .TLBMiss(DTLBMissM), .Cacheable(CacheableM), .Idempotent(), .SelTIM(SelDTIM),
|
.PhysicalAddress(PAdrM), .TLBMiss(DTLBMissM), .Cacheable(CacheableM), .Idempotent(), .SelTIM(SelDTIM),
|
||||||
.InstrAccessFaultF(), .LoadAccessFaultM(LSULoadAccessFaultM),
|
.InstrAccessFaultF(), .LoadAccessFaultM(LSULoadAccessFaultM),
|
||||||
.StoreAmoAccessFaultM(LSUStoreAmoAccessFaultM), .InstrPageFaultF(), .LoadPageFaultM(LSULoadPageFaultM),
|
.StoreAmoAccessFaultM(LSUStoreAmoAccessFaultM), .InstrPageFaultF(), .LoadPageFaultM(LSULoadPageFaultM),
|
||||||
.StoreAmoPageFaultM(LSUStoreAmoPageFaultM),
|
.StoreAmoPageFaultM(LSUStoreAmoPageFaultM),
|
||||||
.LoadMisalignedFaultM, .StoreAmoMisalignedFaultM,
|
.LoadMisalignedFaultM, .StoreAmoMisalignedFaultM,
|
||||||
.UpdateDA(DataUpdateDAM), .CMOpM(CMOpM),
|
.UpdateDA(DataUpdateDAM), .CMOpM(CMOpM),
|
||||||
.AtomicAccessM(|LSUAtomicM), .ExecuteAccessF(1'b0),
|
.AtomicAccessM(|LSUAtomicM), .ExecuteAccessF(1'b0),
|
||||||
|
@ -49,7 +49,6 @@ module hptw import cvw::*; #(parameter cvw_t P) (
|
|||||||
input logic ITLBMissOrUpdateAF,
|
input logic ITLBMissOrUpdateAF,
|
||||||
input logic DTLBMissOrUpdateDAM,
|
input logic DTLBMissOrUpdateDAM,
|
||||||
input logic FlushW,
|
input logic FlushW,
|
||||||
input logic DataUpdateDAM,
|
|
||||||
output logic [P.XLEN-1:0] PTE, // page table entry to TLBs
|
output logic [P.XLEN-1:0] PTE, // page table entry to TLBs
|
||||||
output logic [1:0] PageType, // page type to TLBs
|
output logic [1:0] PageType, // page type to TLBs
|
||||||
output logic ITLBWriteF, DTLBWriteM, // write TLB with new entry
|
output logic ITLBWriteF, DTLBWriteM, // write TLB with new entry
|
||||||
|
@ -110,6 +110,7 @@ module testbench;
|
|||||||
logic Validate;
|
logic Validate;
|
||||||
logic SelectTest;
|
logic SelectTest;
|
||||||
logic TestComplete;
|
logic TestComplete;
|
||||||
|
logic PrevPCZero;
|
||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
// look for arguments passed to simulation, or use defaults
|
// look for arguments passed to simulation, or use defaults
|
||||||
@ -354,15 +355,6 @@ module testbench;
|
|||||||
$display("Benchmark: coremark is done.");
|
$display("Benchmark: coremark is done.");
|
||||||
$stop;
|
$stop;
|
||||||
end
|
end
|
||||||
if (P.ZICSR_SUPPORTED & dut.core.ifu.PCM == 0 & dut.core.ifu.InstrM == 0 & dut.core.ieu.InstrValidM) begin
|
|
||||||
$display("Program fetched illegal instruction 0x00000000 from address 0x00000000. Might be fault with no fault handler.");
|
|
||||||
//$stop; // presently wally32/64priv tests trigger this for reasons not yet understood.
|
|
||||||
end
|
|
||||||
|
|
||||||
// modifications 4/3/24 kunlin & harris to speed up Verilator
|
|
||||||
// For some reason, Verilator runs ~100x slower when these SelectTest and Validate codes are in the posedge clk block
|
|
||||||
//end // added
|
|
||||||
//always @(posedge SelectTest) // added
|
|
||||||
if(SelectTest) begin
|
if(SelectTest) begin
|
||||||
if (riscofTest) begin
|
if (riscofTest) begin
|
||||||
memfilename = {pathname, tests[test], "/ref/ref.elf.memfile"};
|
memfilename = {pathname, tests[test], "/ref/ref.elf.memfile"};
|
||||||
@ -402,6 +394,7 @@ module testbench;
|
|||||||
always @(posedge Validate) // added
|
always @(posedge Validate) // added
|
||||||
`endif
|
`endif
|
||||||
if(Validate) begin
|
if(Validate) begin
|
||||||
|
if (PrevPCZero) totalerrors = totalerrors + 1; // error if PC is stuck at zero
|
||||||
if (TEST == "buildroot")
|
if (TEST == "buildroot")
|
||||||
$fclose(uartoutfile);
|
$fclose(uartoutfile);
|
||||||
if (TEST == "embench") begin
|
if (TEST == "embench") begin
|
||||||
@ -632,8 +625,10 @@ module testbench;
|
|||||||
loggers (clk, reset, DCacheFlushStart, DCacheFlushDone, memfilename, TEST);
|
loggers (clk, reset, DCacheFlushStart, DCacheFlushDone, memfilename, TEST);
|
||||||
|
|
||||||
// track the current function or global label
|
// track the current function or global label
|
||||||
FunctionName #(P) FunctionName(.reset(reset_ext | TestBenchReset),
|
if (DEBUG > 0 | ((PrintHPMCounters | BPRED_LOGGER) & P.ZICNTR_SUPPORTED)) begin : FunctionName
|
||||||
.clk(clk), .ProgramAddrMapFile(ProgramAddrMapFile), .ProgramLabelMapFile(ProgramLabelMapFile));
|
FunctionName #(P) FunctionName(.reset(reset_ext | TestBenchReset),
|
||||||
|
.clk(clk), .ProgramAddrMapFile(ProgramAddrMapFile), .ProgramLabelMapFile(ProgramLabelMapFile));
|
||||||
|
end
|
||||||
|
|
||||||
// Append UART output to file for tests
|
// Append UART output to file for tests
|
||||||
if (P.UART_SUPPORTED) begin: uart_logger
|
if (P.UART_SUPPORTED) begin: uart_logger
|
||||||
@ -652,10 +647,16 @@ module testbench;
|
|||||||
// 1. jump to self loop (0x0000006f)
|
// 1. jump to self loop (0x0000006f)
|
||||||
// 2. a store word writes to the address "tohost"
|
// 2. a store word writes to the address "tohost"
|
||||||
// 3. or PC is stuck at 0
|
// 3. or PC is stuck at 0
|
||||||
always_comb begin
|
|
||||||
TestComplete = ((InstrM == 32'h6f) & dut.core.InstrValidM ) |
|
|
||||||
((dut.core.lsu.IEUAdrM == ProgramAddrLabelArray["tohost"] & dut.core.lsu.IEUAdrM != 0) & InstrMName == "SW" ) |
|
always @(posedge clk) begin
|
||||||
(FunctionName.PCM == 4 & dut.core.ieu.c.InstrValidM);
|
// if (reset) PrevPCZero <= 0;
|
||||||
|
// else if (dut.core.InstrValidM) PrevPCZero <= (FunctionName.PCM == 0 & dut.core.ifu.InstrM == 0);
|
||||||
|
TestComplete <= ((InstrM == 32'h6f) & dut.core.InstrValidM ) |
|
||||||
|
((dut.core.lsu.IEUAdrM == ProgramAddrLabelArray["tohost"] & dut.core.lsu.IEUAdrM != 0) & InstrMName == "SW"); // |
|
||||||
|
// (FunctionName.PCM == 0 & dut.core.ifu.InstrM == 0 & dut.core.InstrValidM & PrevPCZero));
|
||||||
|
// if (FunctionName.PCM == 0 & dut.core.ifu.InstrM == 0 & dut.core.InstrValidM & PrevPCZero)
|
||||||
|
// $error("Program fetched illegal instruction 0x00000000 from address 0x00000000 twice in a row. Usually due to fault with no fault handler.");
|
||||||
end
|
end
|
||||||
|
|
||||||
DCacheFlushFSM #(P) DCacheFlushFSM(.clk, .start(DCacheFlushStart), .done(DCacheFlushDone));
|
DCacheFlushFSM #(P) DCacheFlushFSM(.clk, .start(DCacheFlushStart), .done(DCacheFlushDone));
|
||||||
|
Loading…
Reference in New Issue
Block a user