mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-03 10:15:19 +00:00
Merge pull request #532 from davidharrishmc/dev
Lint fix and WALLY-lrsc fix to pass ImperasDV
This commit is contained in:
commit
872b830801
@ -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
|
||||||
|
1
src/cache/cachefsm.sv
vendored
1
src/cache/cachefsm.sv
vendored
@ -79,6 +79,7 @@ module cachefsm import cvw::*; #(parameter cvw_t P,
|
|||||||
logic CMOWriteback;
|
logic CMOWriteback;
|
||||||
logic CMOZeroNoEviction;
|
logic CMOZeroNoEviction;
|
||||||
logic StallConditions;
|
logic StallConditions;
|
||||||
|
logic StoreHazard;
|
||||||
|
|
||||||
typedef enum logic [3:0]{STATE_READY, // hit states
|
typedef enum logic [3:0]{STATE_READY, // hit states
|
||||||
// miss states
|
// miss states
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user