mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Merge branch 'main' of https://github.com/openhwgroup/cvw
This commit is contained in:
commit
4f59bd492d
@ -116,7 +116,7 @@ sed -i 's/--isa=rv64ic/--isa=rv64iac/' rv64i_m/privilege/Makefile.include
|
|||||||
# Wally needs Verilator 5.0 or later.
|
# Wally needs Verilator 5.0 or later.
|
||||||
# Verilator needs to be built from scratch to get the latest version
|
# Verilator needs to be built from scratch to get the latest version
|
||||||
# apt-get install verilator installs version 4.028 as of 6/8/23
|
# apt-get install verilator installs version 4.028 as of 6/8/23
|
||||||
sudo apt-get install -y perl g++ ccache help2man libgoogle-perftools-dev numactl perl-doc zlibc zlib1g
|
sudo apt-get install -y perl g++ ccache help2man libgoogle-perftools-dev numactl perl-doc zlib1g
|
||||||
sudo apt-get install -y libfl2 libfl-dev # Ubuntu only (ignore if gives error)
|
sudo apt-get install -y libfl2 libfl-dev # Ubuntu only (ignore if gives error)
|
||||||
cd $RISCV
|
cd $RISCV
|
||||||
git clone https://github.com/verilator/verilator # Only first time
|
git clone https://github.com/verilator/verilator # Only first time
|
||||||
@ -127,7 +127,7 @@ git pull # Make sure git repository is up-to-date
|
|||||||
git checkout master # Use development branch (e.g. recent bug fixes)
|
git checkout master # Use development branch (e.g. recent bug fixes)
|
||||||
autoconf # Create ./configure script
|
autoconf # Create ./configure script
|
||||||
./configure # Configure and create Makefile
|
./configure # Configure and create Makefile
|
||||||
make -j NUM_THREADS # Build Verilator itself (if error, try just 'make')
|
make -j ${NUM_THREADS} # Build Verilator itself (if error, try just 'make')
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
||||||
# Sail (https://github.com/riscv/sail-riscv)
|
# Sail (https://github.com/riscv/sail-riscv)
|
||||||
|
|||||||
@ -15,6 +15,8 @@ all: riscoftests memfiles coveragetests
|
|||||||
# Link Linux test vectors
|
# Link Linux test vectors
|
||||||
#cd ../tests/linux-testgen/linux-testvectors/;./tvLinker.sh
|
#cd ../tests/linux-testgen/linux-testvectors/;./tvLinker.sh
|
||||||
|
|
||||||
|
wally-riscv-arch-test: wallyriscoftests memfiles
|
||||||
|
|
||||||
coverage:
|
coverage:
|
||||||
#make -C ../tests/coverage --jobs
|
#make -C ../tests/coverage --jobs
|
||||||
#iter-elf.bash --cover --search ../tests/coverage
|
#iter-elf.bash --cover --search ../tests/coverage
|
||||||
@ -50,6 +52,10 @@ riscoftests:
|
|||||||
# Builds riscv-arch-test 64 and 32-bit versions and builds wally-riscv-arch-test 64 and 32-bit versions
|
# Builds riscv-arch-test 64 and 32-bit versions and builds wally-riscv-arch-test 64 and 32-bit versions
|
||||||
make -C ../tests/riscof/
|
make -C ../tests/riscof/
|
||||||
|
|
||||||
|
wallyriscoftests:
|
||||||
|
# Builds riscv-arch-test 64 and 32-bit versions and builds wally-riscv-arch-test 64 and 32-bit versions
|
||||||
|
make -C ../tests/riscof/ wally-riscv-arch-test
|
||||||
|
|
||||||
memfiles:
|
memfiles:
|
||||||
make -f makefile-memfile wally-sim-files --jobs
|
make -f makefile-memfile wally-sim-files --jobs
|
||||||
|
|
||||||
|
|||||||
@ -26,7 +26,7 @@
|
|||||||
--override cpu/Zicboz=T
|
--override cpu/Zicboz=T
|
||||||
--override cmomp_bytes=64 # Zic64b
|
--override cmomp_bytes=64 # Zic64b
|
||||||
--override cmoz_bytes=64 # Zic64b
|
--override cmoz_bytes=64 # Zic64b
|
||||||
--override lr_sc_grain=64 # Za64rs
|
--override lr_sc_grain=8 # Za64rs requires <=64; we use native word size
|
||||||
|
|
||||||
# 64 KiB continuous huge pages supported
|
# 64 KiB continuous huge pages supported
|
||||||
--override cpu/Svpbmt=T
|
--override cpu/Svpbmt=T
|
||||||
@ -56,8 +56,8 @@
|
|||||||
|
|
||||||
# Enable SVADU hardware update of A/D bits when menvcfg.ADUE=1
|
# Enable SVADU hardware update of A/D bits when menvcfg.ADUE=1
|
||||||
--override cpu/Svadu=T
|
--override cpu/Svadu=T
|
||||||
--override cpu/updatePTEA=F
|
#--override cpu/updatePTEA=F
|
||||||
--override cpu/updatePTED=F
|
#--override cpu/updatePTED=F
|
||||||
|
|
||||||
|
|
||||||
# THIS NEEDS FIXING to 16
|
# THIS NEEDS FIXING to 16
|
||||||
@ -81,12 +81,12 @@
|
|||||||
#
|
#
|
||||||
--callcommand refRoot/cpu/setPMA -lo 0x0000000000 -hi 0x7FFFFFFFFF -attributes " ------ ---- " # INITIAL
|
--callcommand refRoot/cpu/setPMA -lo 0x0000000000 -hi 0x7FFFFFFFFF -attributes " ------ ---- " # INITIAL
|
||||||
--callcommand refRoot/cpu/setPMA -lo 0x0000001000 -hi 0x0000001FFF -attributes " r-x-A- 1248 " # BOOTROM
|
--callcommand refRoot/cpu/setPMA -lo 0x0000001000 -hi 0x0000001FFF -attributes " r-x-A- 1248 " # BOOTROM
|
||||||
--callcommand refRoot/cpu/setPMA -lo 0x0000012100 -hi 0x000001211F -attributes " rw--A- --48 " # SDC
|
--callcommand refRoot/cpu/setPMA -lo 0x0000012100 -hi 0x000001211F -attributes " rw-aA- --48 " # SDC
|
||||||
--callcommand refRoot/cpu/setPMA -lo 0x0002000000 -hi 0x000200FFFF -attributes " rw--A- 1248 " # CLINT
|
--callcommand refRoot/cpu/setPMA -lo 0x0002000000 -hi 0x000200FFFF -attributes " rw-aA- 1248 " # CLINT
|
||||||
--callcommand refRoot/cpu/setPMA -lo 0x000C000000 -hi 0x000FFFFFFF -attributes " rw--A- --4- " # PLIC
|
--callcommand refRoot/cpu/setPMA -lo 0x000C000000 -hi 0x000FFFFFFF -attributes " rw-aA- --4- " # PLIC
|
||||||
--callcommand refRoot/cpu/setPMA -lo 0x0010000000 -hi 0x0010000007 -attributes " rw--A- 1--- " # UART0 error - 0x10000000 - 0x100000FF
|
--callcommand refRoot/cpu/setPMA -lo 0x0010000000 -hi 0x0010000007 -attributes " rw-aA- 1--- " # UART0 error - 0x10000000 - 0x100000FF
|
||||||
--callcommand refRoot/cpu/setPMA -lo 0x0010060000 -hi 0x00100600FF -attributes " rw--A- --4- " # GPIO error - 0x10069000 - 0x100600FF
|
--callcommand refRoot/cpu/setPMA -lo 0x0010060000 -hi 0x00100600FF -attributes " rw-aA- --4- " # GPIO error - 0x10069000 - 0x100600FF
|
||||||
--callcommand refRoot/cpu/setPMA -lo 0x0010040000 -hi 0x0010040FFF -attributes " rw--A- --4- " # SPI error - 0x10040000 - 0x10040FFF
|
--callcommand refRoot/cpu/setPMA -lo 0x0010040000 -hi 0x0010040FFF -attributes " rw-aA- --4- " # SPI error - 0x10040000 - 0x10040FFF
|
||||||
--callcommand refRoot/cpu/setPMA -lo 0x0080000000 -hi 0x008FFFFFFF -attributes " rwx--- 1248 " # UNCORE_RAM
|
--callcommand refRoot/cpu/setPMA -lo 0x0080000000 -hi 0x008FFFFFFF -attributes " rwx--- 1248 " # UNCORE_RAM
|
||||||
|
|
||||||
# Enable the Imperas instruction coverage
|
# Enable the Imperas instruction coverage
|
||||||
|
|||||||
@ -40,16 +40,20 @@ module lrsc import cvw::*; #(parameter cvw_t P) (
|
|||||||
output logic SquashSCW // Squash the store conditional by not allowing rf write
|
output logic SquashSCW // Squash the store conditional by not allowing rf write
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// reservation set size is XLEN for Wally
|
||||||
|
localparam RESERVATION_SET_SIZE_IN_BYTES = P.XLEN/8;
|
||||||
|
localparam RESERVATION_SET_ADDRESS_BITS = $clog2(RESERVATION_SET_SIZE_IN_BYTES); // 2 for rv32, 3 for rv64
|
||||||
|
|
||||||
// possible bug: *** double check if PreLSURWM needs to be flushed by ignorerequest.
|
// possible bug: *** double check if PreLSURWM needs to be flushed by ignorerequest.
|
||||||
// Handle atomic load reserved / store conditional
|
// Handle atomic load reserved / store conditional
|
||||||
logic [P.PA_BITS-1:2] ReservationPAdrW;
|
logic [P.PA_BITS-1:RESERVATION_SET_ADDRESS_BITS] ReservationPAdrW;
|
||||||
logic ReservationValidM, ReservationValidW;
|
logic ReservationValidM, ReservationValidW;
|
||||||
logic lrM, scM, WriteAdrMatchM;
|
logic lrM, scM, WriteAdrMatchM;
|
||||||
logic SquashSCM;
|
logic SquashSCM;
|
||||||
|
|
||||||
assign lrM = MemReadM & LSUAtomicM[0];
|
assign lrM = MemReadM & LSUAtomicM[0];
|
||||||
assign scM = PreLSURWM[0] & LSUAtomicM[0];
|
assign scM = PreLSURWM[0] & LSUAtomicM[0];
|
||||||
assign WriteAdrMatchM = PreLSURWM[0] & (PAdrM[P.PA_BITS-1:2] == ReservationPAdrW) & ReservationValidW;
|
assign WriteAdrMatchM = PreLSURWM[0] & (PAdrM[P.PA_BITS-1:RESERVATION_SET_ADDRESS_BITS] == ReservationPAdrW) & ReservationValidW;
|
||||||
assign SquashSCM = scM & ~WriteAdrMatchM;
|
assign SquashSCM = scM & ~WriteAdrMatchM;
|
||||||
assign LSURWM = SquashSCM ? 2'b00 : PreLSURWM;
|
assign LSURWM = SquashSCM ? 2'b00 : PreLSURWM;
|
||||||
always_comb begin // ReservationValidM (next value of valid reservation)
|
always_comb begin // ReservationValidM (next value of valid reservation)
|
||||||
@ -59,7 +63,7 @@ module lrsc import cvw::*; #(parameter cvw_t P) (
|
|||||||
else ReservationValidM = ReservationValidW; // otherwise don't change valid
|
else ReservationValidM = ReservationValidW; // otherwise don't change valid
|
||||||
end
|
end
|
||||||
|
|
||||||
flopenr #(P.PA_BITS-2) resadrreg(clk, reset, lrM & ~StallW, PAdrM[P.PA_BITS-1:2], ReservationPAdrW); // could drop clear on this one but not valid
|
flopenr #(P.PA_BITS-RESERVATION_SET_ADDRESS_BITS) resadrreg(clk, reset, lrM & ~StallW, PAdrM[P.PA_BITS-1:RESERVATION_SET_ADDRESS_BITS], ReservationPAdrW); // could drop clear on this one but not valid
|
||||||
flopenr #(1) resvldreg(clk, reset, ~StallW, ReservationValidM, ReservationValidW);
|
flopenr #(1) resvldreg(clk, reset, ~StallW, ReservationValidM, ReservationValidW);
|
||||||
flopenr #(1) squashreg(clk, reset, ~StallW, SquashSCM, SquashSCW);
|
flopenr #(1) squashreg(clk, reset, ~StallW, SquashSCM, SquashSCW);
|
||||||
endmodule
|
endmodule
|
||||||
|
|||||||
@ -90,6 +90,7 @@ module tlb import cvw::*; #(parameter cvw_t P,
|
|||||||
logic Misaligned;
|
logic Misaligned;
|
||||||
logic MegapageMisaligned;
|
logic MegapageMisaligned;
|
||||||
logic PTE_N; // NAPOT page table entry
|
logic PTE_N; // NAPOT page table entry
|
||||||
|
logic NAPOT4; // pte.ppn[3:0] = 1000, indicating 64 KiB continuous NAPOT region
|
||||||
|
|
||||||
if(P.XLEN == 32) begin
|
if(P.XLEN == 32) begin
|
||||||
assign MegapageMisaligned = |(PPN[9:0]); // must have zero PPN0
|
assign MegapageMisaligned = |(PPN[9:0]); // must have zero PPN0
|
||||||
@ -105,10 +106,11 @@ module tlb import cvw::*; #(parameter cvw_t P,
|
|||||||
end
|
end
|
||||||
|
|
||||||
assign VPN = VAdr[P.VPN_BITS+11:12];
|
assign VPN = VAdr[P.VPN_BITS+11:12];
|
||||||
|
assign NAPOT4 = (PPN[3:0] == 4'b1000); // 64 KiB contiguous region with pte.napot_bits = 4
|
||||||
|
|
||||||
tlbcontrol #(P, ITLB) tlbcontrol(.SATP_MODE, .VAdr, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_PBMTE, .ENVCFG_ADUE,
|
tlbcontrol #(P, ITLB) tlbcontrol(.SATP_MODE, .VAdr, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_PBMTE, .ENVCFG_ADUE,
|
||||||
.PrivilegeModeW, .ReadAccess, .WriteAccess, .CMOp, .DisableTranslation, .TLBFlush,
|
.PrivilegeModeW, .ReadAccess, .WriteAccess, .CMOp, .DisableTranslation, .TLBFlush,
|
||||||
.PTEAccessBits, .CAMHit, .Misaligned,
|
.PTEAccessBits, .CAMHit, .Misaligned, .NAPOT4,
|
||||||
.TLBMiss, .TLBHit, .TLBPageFault,
|
.TLBMiss, .TLBHit, .TLBPageFault,
|
||||||
.UpdateDA, .SV39Mode, .Translate, .PTE_N, .PBMemoryType);
|
.UpdateDA, .SV39Mode, .Translate, .PTE_N, .PBMemoryType);
|
||||||
|
|
||||||
|
|||||||
@ -41,6 +41,7 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
|||||||
input logic [11:0] PTEAccessBits,
|
input logic [11:0] PTEAccessBits,
|
||||||
input logic CAMHit,
|
input logic CAMHit,
|
||||||
input logic Misaligned,
|
input logic Misaligned,
|
||||||
|
input logic NAPOT4, // pte.ppn[3:0] = 1000, indicating 64 KiB continuous NAPOT region
|
||||||
output logic TLBMiss,
|
output logic TLBMiss,
|
||||||
output logic TLBHit,
|
output logic TLBHit,
|
||||||
output logic TLBPageFault,
|
output logic TLBPageFault,
|
||||||
@ -85,9 +86,9 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
|||||||
|
|
||||||
// check if reserved, N, or PBMT bits are malformed w in RV64
|
// check if reserved, N, or PBMT bits are malformed w in RV64
|
||||||
assign BadPBMT = PTE_PBMT != 0 & (~(P.SVPBMT_SUPPORTED & ENVCFG_PBMTE) |
|
assign BadPBMT = PTE_PBMT != 0 & (~(P.SVPBMT_SUPPORTED & ENVCFG_PBMTE) |
|
||||||
{PTE_X, PTE_W, PTE_R} == 3'b000) | PTE_PBMT == 3; // PBMT must be zero if not supported or for non-leaf PTEs;
|
{PTE_X, PTE_W, PTE_R} == 3'b000) | PTE_PBMT == 3; // PBMT must be zero if not supported or for non-leaf PTEs;
|
||||||
assign BadNAPOT = PTE_N & ~P.SVNAPOT_SUPPORTED; // N must be be 0 if CVNAPOT is not supported
|
assign BadNAPOT = PTE_N & (~P.SVNAPOT_SUPPORTED | ~NAPOT4); // N must be be 0 if CVNAPOT is not supported or not 64 KiB contiguous region
|
||||||
assign BadReserved = PTE_RESERVED; // Reserved bits must be zero
|
assign BadReserved = PTE_RESERVED; // Reserved bits must be zero
|
||||||
|
|
||||||
// Check whether the access is allowed, page faulting if not.
|
// Check whether the access is allowed, page faulting if not.
|
||||||
if (ITLB == 1) begin:itlb // Instruction TLB fault checking
|
if (ITLB == 1) begin:itlb // Instruction TLB fault checking
|
||||||
|
|||||||
@ -296,6 +296,12 @@ write_file -format ddc -hierarchy -o $filename
|
|||||||
set filename [format "%s%s%s%s" $outputDir "/mapped/" $my_design ".sdf"]
|
set filename [format "%s%s%s%s" $outputDir "/mapped/" $my_design ".sdf"]
|
||||||
write_sdf $filename
|
write_sdf $filename
|
||||||
|
|
||||||
|
# Write SPEF file in case need more precision power exploration for TSMC28psyn
|
||||||
|
if {$tech == "tsmc28psyn"} {
|
||||||
|
set filename [format "%s%s%s%s" $outputDir "/mapped/" $my_toplevel ".spef"]
|
||||||
|
redirect $filename { write_parasitics }
|
||||||
|
}
|
||||||
|
|
||||||
# QoR
|
# QoR
|
||||||
set filename [format "%s%s" $outputDir "/reports/qor.rep"]
|
set filename [format "%s%s" $outputDir "/reports/qor.rep"]
|
||||||
redirect $filename { report_qor }
|
redirect $filename { report_qor }
|
||||||
|
|||||||
@ -88,7 +88,6 @@ module testbenchfp;
|
|||||||
logic OldFDivBusyE;
|
logic OldFDivBusyE;
|
||||||
logic reset = 1'b0;
|
logic reset = 1'b0;
|
||||||
logic [$clog2(P.NF+2)-1:0] XZeroCnt, YZeroCnt;
|
logic [$clog2(P.NF+2)-1:0] XZeroCnt, YZeroCnt;
|
||||||
logic [P.DURLEN-1:0] Dur;
|
|
||||||
|
|
||||||
// in-between FMA signals
|
// in-between FMA signals
|
||||||
logic Mult;
|
logic Mult;
|
||||||
@ -145,11 +144,9 @@ module testbenchfp;
|
|||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
// Information displayed for user on what is simulating
|
// Information displayed for user on what is simulating
|
||||||
//$display("\nThe start of simulation...");
|
// $display("\nThe start of simulation...");
|
||||||
//$display("This simulation for TEST is %s", TEST);
|
// $display("This simulation for TEST is %s", TEST);
|
||||||
//$display("This simulation for TEST is of the operand size of %s", TEST_SIZE);
|
// $display("This simulation for TEST is of the operand size of %s", TEST_SIZE);
|
||||||
|
|
||||||
// $display("FPDUR %d %d DIVN %d LOGR %d RK %d RADIX %d DURLEN %d", FPDUR, DIVN, LOGR, RK, RADIX, DURLEN);
|
|
||||||
|
|
||||||
if (P.Q_SUPPORTED & (TEST_SIZE == "QP" | TEST_SIZE == "all")) begin // if Quad percision is supported
|
if (P.Q_SUPPORTED & (TEST_SIZE == "QP" | TEST_SIZE == "all")) begin // if Quad percision is supported
|
||||||
if (TEST === "cvtint" | TEST === "all") begin // if testing integer conversion
|
if (TEST === "cvtint" | TEST === "all") begin // if testing integer conversion
|
||||||
@ -781,19 +778,19 @@ module testbenchfp;
|
|||||||
end
|
end
|
||||||
else if (UnitVal === `CVTFPUNIT) begin
|
else if (UnitVal === `CVTFPUNIT) begin
|
||||||
case (OpCtrlVal[1:0])
|
case (OpCtrlVal[1:0])
|
||||||
4'b11: begin // quad
|
2'b11: begin // quad
|
||||||
AnsNaN = &Ans[P.Q_LEN-2:P.NF]&(|Ans[P.Q_NF-1:0]);
|
AnsNaN = &Ans[P.Q_LEN-2:P.NF]&(|Ans[P.Q_NF-1:0]);
|
||||||
ResNaN = &Res[P.Q_LEN-2:P.NF]&(|Res[P.Q_NF-1:0]);
|
ResNaN = &Res[P.Q_LEN-2:P.NF]&(|Res[P.Q_NF-1:0]);
|
||||||
end
|
end
|
||||||
4'b01: begin // double
|
2'b01: begin // double
|
||||||
AnsNaN = &Ans[P.D_LEN-2:P.D_NF]&(|Ans[P.D_NF-1:0]);
|
AnsNaN = &Ans[P.D_LEN-2:P.D_NF]&(|Ans[P.D_NF-1:0]);
|
||||||
ResNaN = &Res[P.D_LEN-2:P.D_NF]&(|Res[P.D_NF-1:0]);
|
ResNaN = &Res[P.D_LEN-2:P.D_NF]&(|Res[P.D_NF-1:0]);
|
||||||
end
|
end
|
||||||
4'b00: begin // single
|
2'b00: begin // single
|
||||||
AnsNaN = &Ans[P.S_LEN-2:P.S_NF]&(|Ans[P.S_NF-1:0]);
|
AnsNaN = &Ans[P.S_LEN-2:P.S_NF]&(|Ans[P.S_NF-1:0]);
|
||||||
ResNaN = &Res[P.S_LEN-2:P.S_NF]&(|Res[P.S_NF-1:0]);
|
ResNaN = &Res[P.S_LEN-2:P.S_NF]&(|Res[P.S_NF-1:0]);
|
||||||
end
|
end
|
||||||
4'b10: begin // half
|
2'b10: begin // half
|
||||||
AnsNaN = &Ans[P.H_LEN-2:P.H_NF]&(|Ans[P.H_NF-1:0]);
|
AnsNaN = &Ans[P.H_LEN-2:P.H_NF]&(|Ans[P.H_NF-1:0]);
|
||||||
ResNaN = &Res[P.H_LEN-2:P.H_NF]&(|Res[P.H_NF-1:0]);
|
ResNaN = &Res[P.H_LEN-2:P.H_NF]&(|Res[P.H_NF-1:0]);
|
||||||
end
|
end
|
||||||
@ -801,19 +798,19 @@ module testbenchfp;
|
|||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
case (FmtVal)
|
case (FmtVal)
|
||||||
4'b11: begin // quad
|
2'b11: begin // quad
|
||||||
AnsNaN = &Ans[P.Q_LEN-2:P.Q_NF]&(|Ans[P.Q_NF-1:0]);
|
AnsNaN = &Ans[P.Q_LEN-2:P.Q_NF]&(|Ans[P.Q_NF-1:0]);
|
||||||
ResNaN = &Res[P.Q_LEN-2:P.Q_NF]&(|Res[P.Q_NF-1:0]);
|
ResNaN = &Res[P.Q_LEN-2:P.Q_NF]&(|Res[P.Q_NF-1:0]);
|
||||||
end
|
end
|
||||||
4'b01: begin // double
|
2'b01: begin // double
|
||||||
AnsNaN = &Ans[P.D_LEN-2:P.D_NF]&(|Ans[P.D_NF-1:0]);
|
AnsNaN = &Ans[P.D_LEN-2:P.D_NF]&(|Ans[P.D_NF-1:0]);
|
||||||
ResNaN = &Res[P.D_LEN-2:P.D_NF]&(|Res[P.D_NF-1:0]);
|
ResNaN = &Res[P.D_LEN-2:P.D_NF]&(|Res[P.D_NF-1:0]);
|
||||||
end
|
end
|
||||||
4'b00: begin // single
|
2'b00: begin // single
|
||||||
AnsNaN = &Ans[P.S_LEN-2:P.S_NF]&(|Ans[P.S_NF-1:0]);
|
AnsNaN = &Ans[P.S_LEN-2:P.S_NF]&(|Ans[P.S_NF-1:0]);
|
||||||
ResNaN = &Res[P.S_LEN-2:P.S_NF]&(|Res[P.S_NF-1:0]);
|
ResNaN = &Res[P.S_LEN-2:P.S_NF]&(|Res[P.S_NF-1:0]);
|
||||||
end
|
end
|
||||||
4'b10: begin // half
|
2'b10: begin // half
|
||||||
AnsNaN = &Ans[P.H_LEN-2:P.H_NF]&(|Ans[P.H_NF-1:0]);
|
AnsNaN = &Ans[P.H_LEN-2:P.H_NF]&(|Ans[P.H_NF-1:0]);
|
||||||
ResNaN = &Res[P.H_LEN-2:P.H_NF]&(|Res[P.H_NF-1:0]);
|
ResNaN = &Res[P.H_LEN-2:P.H_NF]&(|Res[P.H_NF-1:0]);
|
||||||
end
|
end
|
||||||
@ -854,22 +851,22 @@ module testbenchfp;
|
|||||||
// arbitrary value and can be changed, if needed.
|
// arbitrary value and can be changed, if needed.
|
||||||
case (FmtVal)
|
case (FmtVal)
|
||||||
// QP
|
// QP
|
||||||
4'b11: begin
|
2'b11: begin
|
||||||
repeat (20)
|
repeat (20)
|
||||||
@(posedge clk);
|
@(posedge clk);
|
||||||
end
|
end
|
||||||
// HP
|
// HP
|
||||||
4'b10: begin
|
2'b10: begin
|
||||||
repeat (14)
|
repeat (14)
|
||||||
@(posedge clk);
|
@(posedge clk);
|
||||||
end
|
end
|
||||||
// DP
|
// DP
|
||||||
4'b01: begin
|
2'b01: begin
|
||||||
repeat (18)
|
repeat (18)
|
||||||
@(posedge clk);
|
@(posedge clk);
|
||||||
end
|
end
|
||||||
// SP
|
// SP
|
||||||
4'b00: begin
|
2'b00: begin
|
||||||
repeat (16)
|
repeat (16)
|
||||||
@(posedge clk);
|
@(posedge clk);
|
||||||
end
|
end
|
||||||
@ -886,22 +883,22 @@ module testbenchfp;
|
|||||||
// - when 2 or more NaNs are inputed the NaN that is propigated doesn't matter
|
// - when 2 or more NaNs are inputed the NaN that is propigated doesn't matter
|
||||||
if (UnitVal !== `CVTFPUNIT & UnitVal !== `CVTINTUNIT)
|
if (UnitVal !== `CVTFPUNIT & UnitVal !== `CVTINTUNIT)
|
||||||
case (FmtVal)
|
case (FmtVal)
|
||||||
4'b11: NaNGood = (((P.IEEE754==0)&AnsNaN&(Res === {1'b0, {P.Q_NE+1{1'b1}}, {P.Q_NF-1{1'b0}}})) |
|
2'b11: NaNGood = (((P.IEEE754==0)&AnsNaN&(Res === {1'b0, {P.Q_NE+1{1'b1}}, {P.Q_NF-1{1'b0}}})) |
|
||||||
(AnsFlg[4]&(Res[P.Q_LEN-2:0] === {{P.Q_NE+1{1'b1}}, {P.Q_NF-1{1'b0}}})) |
|
(AnsFlg[4]&(Res[P.Q_LEN-2:0] === {{P.Q_NE+1{1'b1}}, {P.Q_NF-1{1'b0}}})) |
|
||||||
(XNaN&(Res[P.Q_LEN-2:0] === {X[P.Q_LEN-2:P.Q_NF],1'b1,X[P.Q_NF-2:0]})) |
|
(XNaN&(Res[P.Q_LEN-2:0] === {X[P.Q_LEN-2:P.Q_NF],1'b1,X[P.Q_NF-2:0]})) |
|
||||||
(YNaN&(Res[P.Q_LEN-2:0] === {Y[P.Q_LEN-2:P.Q_NF],1'b1,Y[P.Q_NF-2:0]})) |
|
(YNaN&(Res[P.Q_LEN-2:0] === {Y[P.Q_LEN-2:P.Q_NF],1'b1,Y[P.Q_NF-2:0]})) |
|
||||||
(ZNaN&(Res[P.Q_LEN-2:0] === {Z[P.Q_LEN-2:P.Q_NF],1'b1,Z[P.Q_NF-2:0]})));
|
(ZNaN&(Res[P.Q_LEN-2:0] === {Z[P.Q_LEN-2:P.Q_NF],1'b1,Z[P.Q_NF-2:0]})));
|
||||||
4'b01: NaNGood = (((P.IEEE754==0)&AnsNaN&(Res[P.D_LEN-1:0] === {1'b0, {P.D_NE+1{1'b1}}, {P.D_NF-1{1'b0}}})) |
|
2'b01: NaNGood = (((P.IEEE754==0)&AnsNaN&(Res[P.D_LEN-1:0] === {1'b0, {P.D_NE+1{1'b1}}, {P.D_NF-1{1'b0}}})) |
|
||||||
(AnsFlg[4]&(Res[P.D_LEN-2:0] === {{P.D_NE+1{1'b1}}, {P.D_NF-1{1'b0}}})) |
|
(AnsFlg[4]&(Res[P.D_LEN-2:0] === {{P.D_NE+1{1'b1}}, {P.D_NF-1{1'b0}}})) |
|
||||||
(XNaN&(Res[P.D_LEN-2:0] === {X[P.D_LEN-2:P.D_NF],1'b1,X[P.D_NF-2:0]})) |
|
(XNaN&(Res[P.D_LEN-2:0] === {X[P.D_LEN-2:P.D_NF],1'b1,X[P.D_NF-2:0]})) |
|
||||||
(YNaN&(Res[P.D_LEN-2:0] === {Y[P.D_LEN-2:P.D_NF],1'b1,Y[P.D_NF-2:0]})) |
|
(YNaN&(Res[P.D_LEN-2:0] === {Y[P.D_LEN-2:P.D_NF],1'b1,Y[P.D_NF-2:0]})) |
|
||||||
(ZNaN&(Res[P.D_LEN-2:0] === {Z[P.D_LEN-2:P.D_NF],1'b1,Z[P.D_NF-2:0]})));
|
(ZNaN&(Res[P.D_LEN-2:0] === {Z[P.D_LEN-2:P.D_NF],1'b1,Z[P.D_NF-2:0]})));
|
||||||
4'b00: NaNGood = (((P.IEEE754==0)&AnsNaN&(Res[P.S_LEN-1:0] === {1'b0, {P.S_NE+1{1'b1}}, {P.S_NF-1{1'b0}}})) |
|
2'b00: NaNGood = (((P.IEEE754==0)&AnsNaN&(Res[P.S_LEN-1:0] === {1'b0, {P.S_NE+1{1'b1}}, {P.S_NF-1{1'b0}}})) |
|
||||||
(AnsFlg[4]&(Res[P.S_LEN-2:0] === {{P.S_NE+1{1'b1}}, {P.S_NF-1{1'b0}}})) |
|
(AnsFlg[4]&(Res[P.S_LEN-2:0] === {{P.S_NE+1{1'b1}}, {P.S_NF-1{1'b0}}})) |
|
||||||
(XNaN&(Res[P.S_LEN-2:0] === {X[P.S_LEN-2:P.S_NF],1'b1,X[P.S_NF-2:0]})) |
|
(XNaN&(Res[P.S_LEN-2:0] === {X[P.S_LEN-2:P.S_NF],1'b1,X[P.S_NF-2:0]})) |
|
||||||
(YNaN&(Res[P.S_LEN-2:0] === {Y[P.S_LEN-2:P.S_NF],1'b1,Y[P.S_NF-2:0]})) |
|
(YNaN&(Res[P.S_LEN-2:0] === {Y[P.S_LEN-2:P.S_NF],1'b1,Y[P.S_NF-2:0]})) |
|
||||||
(ZNaN&(Res[P.S_LEN-2:0] === {Z[P.S_LEN-2:P.S_NF],1'b1,Z[P.S_NF-2:0]})));
|
(ZNaN&(Res[P.S_LEN-2:0] === {Z[P.S_LEN-2:P.S_NF],1'b1,Z[P.S_NF-2:0]})));
|
||||||
4'b10: NaNGood = (((P.IEEE754==0)&AnsNaN&(Res[P.H_LEN-1:0] === {1'b0, {P.H_NE+1{1'b1}}, {P.H_NF-1{1'b0}}})) |
|
2'b10: NaNGood = (((P.IEEE754==0)&AnsNaN&(Res[P.H_LEN-1:0] === {1'b0, {P.H_NE+1{1'b1}}, {P.H_NF-1{1'b0}}})) |
|
||||||
(AnsFlg[4]&(Res[P.H_LEN-2:0] === {{P.H_NE+1{1'b1}}, {P.H_NF-1{1'b0}}})) |
|
(AnsFlg[4]&(Res[P.H_LEN-2:0] === {{P.H_NE+1{1'b1}}, {P.H_NF-1{1'b0}}})) |
|
||||||
(XNaN&(Res[P.H_LEN-2:0] === {X[P.H_LEN-2:P.H_NF],1'b1,X[P.H_NF-2:0]})) |
|
(XNaN&(Res[P.H_LEN-2:0] === {X[P.H_LEN-2:P.H_NF],1'b1,X[P.H_NF-2:0]})) |
|
||||||
(YNaN&(Res[P.H_LEN-2:0] === {Y[P.H_LEN-2:P.H_NF],1'b1,Y[P.H_NF-2:0]})) |
|
(YNaN&(Res[P.H_LEN-2:0] === {Y[P.H_LEN-2:P.H_NF],1'b1,Y[P.H_NF-2:0]})) |
|
||||||
@ -967,14 +964,6 @@ module testbenchfp;
|
|||||||
|
|
||||||
// Testfloat outputs 800... for both the largest integer values for both positive and negitive numbers but
|
// Testfloat outputs 800... for both the largest integer values for both positive and negitive numbers but
|
||||||
// the riscv spec specifies 2^31-1 for positive values out of range and NaNs ie 7fff...
|
// the riscv spec specifies 2^31-1 for positive values out of range and NaNs ie 7fff...
|
||||||
|
|
||||||
// Note: Went through and determined that this is not needed with new module additions
|
|
||||||
// Just needs to check flags against TestFloat (left just in case (remove after check one more time))
|
|
||||||
// else if ((UnitVal === `CVTINTUNIT) &
|
|
||||||
// ~(((WriteIntVal&~OpCtrlVal[0]&AnsFlg[4]&Xs&(Res[P.XLEN-1:0] === (P.XLEN)'(0))) |
|
|
||||||
// (WriteIntVal&OpCtrlVal[0]&AnsFlg[4]&(~Xs|XNaN)&OpCtrlVal[1]&(Res[P.XLEN-1:0] === {1'b0, {P.XLEN-1{1'b1}}})) |
|
|
||||||
// (WriteIntVal&OpCtrlVal[0]&AnsFlg[4]&(~Xs|XNaN)&~OpCtrlVal[1]&(Res[P.XLEN-1:0] === {{P.XLEN-32{1'b0}}, 1'b0, {31{1'b1}}})) |
|
|
||||||
// (~(WriteIntVal&~OpCtrlVal[0]&AnsFlg[4]&Xs&~XNaN)&(Res === Ans | NaNGood | NaNGood === 1'bx))) & (ResFlg === AnsFlg | AnsFlg === 5'bx))) begin
|
|
||||||
else if ((UnitVal === `CVTINTUNIT) &
|
else if ((UnitVal === `CVTINTUNIT) &
|
||||||
~((ResFlg === AnsFlg | AnsFlg === 5'bx))) begin
|
~((ResFlg === AnsFlg | AnsFlg === 5'bx))) begin
|
||||||
errors += 1;
|
errors += 1;
|
||||||
@ -995,8 +984,14 @@ module testbenchfp;
|
|||||||
// incemet the operation if all the rounding modes have been tested
|
// incemet the operation if all the rounding modes have been tested
|
||||||
if (FrmNum === 4) OpCtrlNum += 1;
|
if (FrmNum === 4) OpCtrlNum += 1;
|
||||||
// increment the rounding mode or loop back to rne
|
// increment the rounding mode or loop back to rne
|
||||||
if (FrmNum < 4) FrmNum += 1;
|
if (FrmNum < 4)
|
||||||
else FrmNum = 0;
|
FrmNum += 1;
|
||||||
|
else begin
|
||||||
|
FrmNum = 0;
|
||||||
|
// Add some time as a buffer between tests at the end of each test
|
||||||
|
repeat (10)
|
||||||
|
@(posedge clk);
|
||||||
|
end
|
||||||
// if no more Tests - finish
|
// if no more Tests - finish
|
||||||
if (Tests[TestNum] === "") begin
|
if (Tests[TestNum] === "") begin
|
||||||
$display("\nAll Tests completed with %d errors\n", errors);
|
$display("\nAll Tests completed with %d errors\n", errors);
|
||||||
@ -1034,7 +1029,6 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
);
|
);
|
||||||
|
|
||||||
localparam Q_LEN = 32'd128;
|
localparam Q_LEN = 32'd128;
|
||||||
//`include "parameter-defs.vh"
|
|
||||||
|
|
||||||
logic XEn;
|
logic XEn;
|
||||||
logic YEn;
|
logic YEn;
|
||||||
@ -1113,7 +1107,6 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
if (OpCtrl[0])
|
if (OpCtrl[0])
|
||||||
case (Fmt)
|
case (Fmt)
|
||||||
2'b11: begin // quad
|
2'b11: begin // quad
|
||||||
#20;
|
|
||||||
X = TestVector[8+2*(P.Q_LEN)-1:8+(P.Q_LEN)];
|
X = TestVector[8+2*(P.Q_LEN)-1:8+(P.Q_LEN)];
|
||||||
Ans = TestVector[8+(P.Q_LEN-1):8];
|
Ans = TestVector[8+(P.Q_LEN-1):8];
|
||||||
if (~clk) #5;
|
if (~clk) #5;
|
||||||
@ -1121,7 +1114,6 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
DivStart = 1'b0;
|
DivStart = 1'b0;
|
||||||
end
|
end
|
||||||
2'b01: if (P.D_SUPPORTED) begin // double
|
2'b01: if (P.D_SUPPORTED) begin // double
|
||||||
#20;
|
|
||||||
X = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+2*(P.D_LEN)-1:8+(P.D_LEN)]};
|
X = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+2*(P.D_LEN)-1:8+(P.D_LEN)]};
|
||||||
Ans = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+(P.D_LEN-1):8]};
|
Ans = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+(P.D_LEN-1):8]};
|
||||||
if (~clk) #5;
|
if (~clk) #5;
|
||||||
@ -1129,7 +1121,6 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
DivStart = 1'b0;
|
DivStart = 1'b0;
|
||||||
end
|
end
|
||||||
2'b00: if (P.S_SUPPORTED) begin // single
|
2'b00: if (P.S_SUPPORTED) begin // single
|
||||||
#20;
|
|
||||||
X = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+2*(P.S_LEN)-1:8+1*(P.S_LEN)]};
|
X = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+2*(P.S_LEN)-1:8+1*(P.S_LEN)]};
|
||||||
Ans = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+(P.S_LEN-1):8]};
|
Ans = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+(P.S_LEN-1):8]};
|
||||||
if (~clk) #5;
|
if (~clk) #5;
|
||||||
@ -1137,7 +1128,6 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
DivStart = 1'b0;
|
DivStart = 1'b0;
|
||||||
end
|
end
|
||||||
2'b10: begin // half
|
2'b10: begin // half
|
||||||
#20;
|
|
||||||
X = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+2*(P.H_LEN)-1:8+(P.H_LEN)]};
|
X = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+2*(P.H_LEN)-1:8+(P.H_LEN)]};
|
||||||
Ans = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+(P.H_LEN-1):8]};
|
Ans = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+(P.H_LEN-1):8]};
|
||||||
if (~clk) #5;
|
if (~clk) #5;
|
||||||
@ -1148,7 +1138,6 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
else
|
else
|
||||||
case (Fmt)
|
case (Fmt)
|
||||||
2'b11: begin // quad
|
2'b11: begin // quad
|
||||||
#20;
|
|
||||||
X = TestVector[8+3*(P.Q_LEN)-1:8+2*(P.Q_LEN)];
|
X = TestVector[8+3*(P.Q_LEN)-1:8+2*(P.Q_LEN)];
|
||||||
Y = TestVector[8+2*(P.Q_LEN)-1:8+(P.Q_LEN)];
|
Y = TestVector[8+2*(P.Q_LEN)-1:8+(P.Q_LEN)];
|
||||||
Ans = TestVector[8+(P.Q_LEN-1):8];
|
Ans = TestVector[8+(P.Q_LEN-1):8];
|
||||||
@ -1157,7 +1146,6 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
DivStart = 1'b0;
|
DivStart = 1'b0;
|
||||||
end
|
end
|
||||||
2'b01: if (P.D_SUPPORTED) begin // double
|
2'b01: if (P.D_SUPPORTED) begin // double
|
||||||
#20;
|
|
||||||
X = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+3*(P.D_LEN)-1:8+2*(P.D_LEN)]};
|
X = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+3*(P.D_LEN)-1:8+2*(P.D_LEN)]};
|
||||||
Y = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+2*(P.D_LEN)-1:8+(P.D_LEN)]};
|
Y = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+2*(P.D_LEN)-1:8+(P.D_LEN)]};
|
||||||
Ans = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+(P.D_LEN-1):8]};
|
Ans = {{P.FLEN-P.D_LEN{1'b1}}, TestVector[8+(P.D_LEN-1):8]};
|
||||||
@ -1166,7 +1154,6 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
DivStart = 1'b0;
|
DivStart = 1'b0;
|
||||||
end
|
end
|
||||||
2'b00: if (P.S_SUPPORTED) begin // single
|
2'b00: if (P.S_SUPPORTED) begin // single
|
||||||
#20;
|
|
||||||
X = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+3*(P.S_LEN)-1:8+2*(P.S_LEN)]};
|
X = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+3*(P.S_LEN)-1:8+2*(P.S_LEN)]};
|
||||||
Y = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+2*(P.S_LEN)-1:8+1*(P.S_LEN)]};
|
Y = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+2*(P.S_LEN)-1:8+1*(P.S_LEN)]};
|
||||||
Ans = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+(P.S_LEN-1):8]};
|
Ans = {{P.FLEN-P.S_LEN{1'b1}}, TestVector[8+(P.S_LEN-1):8]};
|
||||||
@ -1175,7 +1162,6 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
DivStart = 1'b0;
|
DivStart = 1'b0;
|
||||||
end
|
end
|
||||||
2'b10: begin // half
|
2'b10: begin // half
|
||||||
#20;
|
|
||||||
X = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+3*(P.H_LEN)-1:8+2*(P.H_LEN)]};
|
X = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+3*(P.H_LEN)-1:8+2*(P.H_LEN)]};
|
||||||
Y = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+2*(P.H_LEN)-1:8+(P.H_LEN)]};
|
Y = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+2*(P.H_LEN)-1:8+(P.H_LEN)]};
|
||||||
Ans = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+(P.H_LEN-1):8]};
|
Ans = {{P.FLEN-P.H_LEN{1'b1}}, TestVector[8+(P.H_LEN-1):8]};
|
||||||
@ -1403,11 +1389,11 @@ module readvectors import cvw::*; #(parameter cvw_t P) (
|
|||||||
assign XEn = ~((Unit == `CVTINTUNIT)&OpCtrl[2]);
|
assign XEn = ~((Unit == `CVTINTUNIT)&OpCtrl[2]);
|
||||||
assign YEn = ~((Unit == `CVTINTUNIT)|(Unit == `CVTFPUNIT)|((Unit == `DIVUNIT)&OpCtrl[0]));
|
assign YEn = ~((Unit == `CVTINTUNIT)|(Unit == `CVTFPUNIT)|((Unit == `DIVUNIT)&OpCtrl[0]));
|
||||||
assign ZEn = (Unit == `FMAUNIT);
|
assign ZEn = (Unit == `FMAUNIT);
|
||||||
// Will fix with better activation - for now, this works (jes)
|
|
||||||
assign FPUActive = 1'b1;
|
assign FPUActive = 1'b1;
|
||||||
|
|
||||||
unpack #(P) unpack(.X, .Y, .Z, .Fmt(ModFmt), .FPUActive, .Xs, .Ys, .Zs, .Xe, .Ye, .Ze,
|
unpack #(P) unpack(.X, .Y, .Z, .Fmt(ModFmt), .FPUActive, .Xs, .Ys, .Zs, .Xe, .Ye, .Ze,
|
||||||
.Xm, .Ym, .Zm, .XNaN, .YNaN, .ZNaN, .XSNaN, .YSNaN, .ZSNaN,
|
.Xm, .Ym, .Zm, .XNaN, .YNaN, .ZNaN, .XSNaN, .YSNaN, .ZSNaN,
|
||||||
.XSubnorm, .XZero, .YZero, .ZZero, .XInf, .YInf, .ZInf,
|
.XSubnorm, .XZero, .YZero, .ZZero, .XInf, .YInf, .ZInf,
|
||||||
.XEn, .YEn, .ZEn, .XExpMax, .XPostBox);
|
.XEn, .YEn, .ZEn, .XExpMax, .XPostBox);
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|||||||
@ -108,6 +108,10 @@ beef0aa0 # Test 11.3.1.3.7(b): check successful read/write when D=0 and SVADU=1
|
|||||||
00000000
|
00000000
|
||||||
BEEF0660 # Test 11.3.1.3.9: NAPOT read
|
BEEF0660 # Test 11.3.1.3.9: NAPOT read
|
||||||
0550DEAD
|
0550DEAD
|
||||||
|
0000000d # Test 11.3.1.3.9: page fault on malformed NAPOT PTE
|
||||||
|
00000000
|
||||||
|
00000bad
|
||||||
|
00000000
|
||||||
0000000f # Test 11.3.1.3.10: PBMT; write page fault because menvcfg.PBMTE = 0
|
0000000f # Test 11.3.1.3.10: PBMT; write page fault because menvcfg.PBMTE = 0
|
||||||
00000000
|
00000000
|
||||||
00000009 # ecall from going to M mode from S mode
|
00000009 # ecall from going to M mode from S mode
|
||||||
|
|||||||
@ -48,7 +48,7 @@ RVMODEL_BOOT
|
|||||||
|
|
||||||
# Testcase 1: Do an unsuccessful load-reserved / store conditional word operation
|
# Testcase 1: Do an unsuccessful load-reserved / store conditional word operation
|
||||||
addi x6, x6, 24
|
addi x6, x6, 24
|
||||||
addi x30, x31, 4
|
addi x30, x31, 8 # 8 bytes later (reservation set size is 8 bytes)
|
||||||
li x11, 43
|
li x11, 43
|
||||||
lr.w x10, (x30)
|
lr.w x10, (x30)
|
||||||
sc.w x12, x11, (x31) # should fail because not reserved
|
sc.w x12, x11, (x31) # should fail because not reserved
|
||||||
@ -59,7 +59,7 @@ RVMODEL_BOOT
|
|||||||
|
|
||||||
# Testcase 2: Do a successful load-reserved / store conditional doubleword operation
|
# Testcase 2: Do a successful load-reserved / store conditional doubleword operation
|
||||||
addi x6, x6, 24
|
addi x6, x6, 24
|
||||||
addi x31, x30, 4
|
addi x31, x30, 8
|
||||||
li x11, 44
|
li x11, 44
|
||||||
lr.d x10, (x31)
|
lr.d x10, (x31)
|
||||||
sc.d x12, x11, (x31)
|
sc.d x12, x11, (x31)
|
||||||
|
|||||||
@ -86,22 +86,23 @@ test_cases:
|
|||||||
.8byte 0x0000000080018040, 0x20000000200800DF, write64_test# Vaddr 0x8000, Paddr = 0x80200000, PBMT = 1
|
.8byte 0x0000000080018040, 0x20000000200800DF, write64_test# Vaddr 0x8000, Paddr = 0x80200000, PBMT = 1
|
||||||
.8byte 0x0000000080018048, 0x40000000200800DF, write64_test# Vaddr 0x9000, Paddr = 0x80200000, PMBT = 2
|
.8byte 0x0000000080018048, 0x40000000200800DF, write64_test# Vaddr 0x9000, Paddr = 0x80200000, PMBT = 2
|
||||||
.8byte 0x0000000080018050, 0x60000000200800DF, write64_test# Vaddr 0xA000, Paddr = 0x80200000, PMBT = 3
|
.8byte 0x0000000080018050, 0x60000000200800DF, write64_test# Vaddr 0xA000, Paddr = 0x80200000, PMBT = 3
|
||||||
.8byte 0x0000000080018080, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x0000000080018080, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x0000000080018088, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x0000000080018088, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x0000000080018090, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x0000000080018090, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x0000000080018098, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x0000000080018098, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180A0, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180A0, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180A8, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180A8, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180B0, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180B0, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180B8, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180B8, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180C0, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180C0, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180C8, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180C8, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180D0, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180D0, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180D8, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180D8, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180E0, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180E0, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180E8, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180E8, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180F0, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180F0, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
.8byte 0x00000000800180F8, 0x80000000200800DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
.8byte 0x00000000800180F8, 0x80000000200820DF, write64_test# Vaddr 0x10000, Paddr = 0x80200000, NAPOT
|
||||||
|
.8byte 0x0000000080018150, 0x80000000200800DF, write64_test# Vaddr 0x20000, Paddr = 0x80200000, NAPOT malformed with ppn[3] =0
|
||||||
|
|
||||||
# Level 0 page table B
|
# Level 0 page table B
|
||||||
.8byte 0x0000000080016FF8, 0x00000000200804CF, write64_test# Vaddr 0xFFFFFFFFFFFFF000, Paddr 0x80201000 aligned kilopage
|
.8byte 0x0000000080016FF8, 0x00000000200804CF, write64_test# Vaddr 0xFFFFFFFFFFFFF000, Paddr 0x80201000 aligned kilopage
|
||||||
@ -208,7 +209,7 @@ test_cases:
|
|||||||
|
|
||||||
# Now set ADUE bit
|
# Now set ADUE bit
|
||||||
.8byte 0x0, 0x0, goto_m_mode # change to M mode, 0x9 written to output
|
.8byte 0x0, 0x0, goto_m_mode # change to M mode, 0x9 written to output
|
||||||
.8byte 0x0, 0x2000000000000000, write_menvcfg # set menvcfg.ADUE = 1
|
.8byte 0x0, 0x2000000000000000, write_menvcfg # set menvcfg.HADE = 1
|
||||||
.8byte 0x0, 0x0, goto_s_mode # change to S mode, 0xb written to output
|
.8byte 0x0, 0x0, goto_s_mode # change to S mode, 0xb written to output
|
||||||
|
|
||||||
# Since SVADU is 1, there are no faults when A/D=0
|
# Since SVADU is 1, there are no faults when A/D=0
|
||||||
@ -226,6 +227,9 @@ test_cases:
|
|||||||
# test 11.3.1.3.9 NAPOT read
|
# test 11.3.1.3.9 NAPOT read
|
||||||
.8byte 0x1A400, 0x0550DEADBEEF0660, read64_test # read from NAPOT 64 KiB page
|
.8byte 0x1A400, 0x0550DEADBEEF0660, read64_test # read from NAPOT 64 KiB page
|
||||||
|
|
||||||
|
# test 11.3.1.3.9 NAPOT read
|
||||||
|
.8byte 0x2A400, 0x0550DEADBEEF0660, read64_test # read from NAPOT 64 KiB page with malformed PTE should page fault
|
||||||
|
|
||||||
# test 11.3.1.3.10 PBMT checks
|
# test 11.3.1.3.10 PBMT checks
|
||||||
.8byte 0x8040, 0x1212343456567878, write64_test # Write fault with PBMT when menvcfg.PBMTE = 0
|
.8byte 0x8040, 0x1212343456567878, write64_test # Write fault with PBMT when menvcfg.PBMTE = 0
|
||||||
.8byte 0x0, 0x0, goto_m_mode # change to M mode, 0x9 written to output
|
.8byte 0x0, 0x0, goto_m_mode # change to M mode, 0x9 written to output
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user