mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Merge branch 'main' of github.com:davidharrishmc/riscv-wally into main
This commit is contained in:
commit
5a6ad32688
@ -1 +1 @@
|
|||||||
Subproject commit be67c99bd461742aa1c100bcc0732657faae2230
|
Subproject commit effd553a6a91ed9b0ba251796a8a44505a45174f
|
@ -78,6 +78,9 @@
|
|||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000000001000
|
`define RESET_VECTOR 64'h0000000000001000
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Addresses
|
// Peripheral Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -79,6 +79,9 @@
|
|||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000000001000
|
`define RESET_VECTOR 64'h0000000000001000
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Addresses
|
// Peripheral Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -80,6 +80,9 @@
|
|||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 32'h80000000
|
`define RESET_VECTOR 32'h80000000
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Addresses
|
// Peripheral Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -78,6 +78,9 @@
|
|||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 32'h80000000
|
`define RESET_VECTOR 32'h80000000
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Addresses
|
// Peripheral Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -80,6 +80,9 @@
|
|||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 32'h80000000
|
`define RESET_VECTOR 32'h80000000
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Addresses
|
// Peripheral Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -78,6 +78,9 @@
|
|||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 32'h80000000
|
`define RESET_VECTOR 32'h80000000
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Addresses
|
// Peripheral Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -82,6 +82,9 @@
|
|||||||
// Bus Interface width
|
// Bus Interface width
|
||||||
`define AHBW 64
|
`define AHBW 64
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Addresses
|
// Peripheral Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -84,6 +84,9 @@
|
|||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file?
|
// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file?
|
||||||
`define BOOTROM_SUPPORTED 1'b1
|
`define BOOTROM_SUPPORTED 1'b1
|
||||||
`define BOOTROM_BASE 56'h00001000 // spec had been 0x1000 to 0x2FFF, but dh truncated to 0x1000 to 0x1FFF because upper half seems to be all zeros and this is easier for decoder
|
`define BOOTROM_BASE 56'h00001000 // spec had been 0x1000 to 0x2FFF, but dh truncated to 0x1000 to 0x1FFF because upper half seems to be all zeros and this is easier for decoder
|
||||||
|
@ -82,6 +82,9 @@
|
|||||||
// Bus Interface width
|
// Bus Interface width
|
||||||
`define AHBW 64
|
`define AHBW 64
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Physiccal Addresses
|
// Peripheral Physiccal Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -82,6 +82,9 @@
|
|||||||
// Bus Interface width
|
// Bus Interface width
|
||||||
`define AHBW 64
|
`define AHBW 64
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Physiccal Addresses
|
// Peripheral Physiccal Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -82,6 +82,9 @@
|
|||||||
// Bus Interface width
|
// Bus Interface width
|
||||||
`define AHBW 64
|
`define AHBW 64
|
||||||
|
|
||||||
|
// WFI Timeout Wait
|
||||||
|
`define WFI_TIMEOUT_BIT 20
|
||||||
|
|
||||||
// Peripheral Physiccal Addresses
|
// Peripheral Physiccal Addresses
|
||||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||||
|
@ -52,14 +52,14 @@ if {$2 eq "buildroot" || $2 eq "buildroot-checkpoint"} {
|
|||||||
#vsim -coverage -lib work_$2 workopt_$2
|
#vsim -coverage -lib work_$2 workopt_$2
|
||||||
|
|
||||||
# power add generates the logging necessary for saif generation.
|
# power add generates the logging necessary for saif generation.
|
||||||
power add -r /dut/core/*
|
# power add -r /dut/core/*
|
||||||
run -all
|
run -all
|
||||||
power off -r /dut/core/*
|
# power off -r /dut/core/*
|
||||||
}
|
}
|
||||||
|
|
||||||
#coverage report -file wally-pipelined-coverage.txt
|
#coverage report -file wally-pipelined-coverage.txt
|
||||||
# These aren't doing anything helpful
|
# These aren't doing anything helpful
|
||||||
#coverage report -memory
|
#coverage report -memory
|
||||||
#profile report -calltree -file wally-pipelined-calltree.rpt -cutoff 2
|
#profile report -calltree -file wally-pipelined-calltree.rpt -cutoff 2
|
||||||
power report -all -bsaif power.saif
|
#power report -all -bsaif power.saif
|
||||||
quit
|
quit
|
||||||
|
@ -30,11 +30,17 @@ module cvtfp (
|
|||||||
logic [31:0] DSRes; // double to single precision result
|
logic [31:0] DSRes; // double to single precision result
|
||||||
|
|
||||||
|
|
||||||
|
// add support for all formats
|
||||||
|
// consider reordering code blocks so upconverting is in one region of the file
|
||||||
|
// and downconverting is in the other region.
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// LZC
|
// LZC: Leading Zero Counter
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// *** consider sharing this with fcvtint
|
||||||
|
// *** emphasize parallel structure between the two
|
||||||
|
// *** add a priorityencoder module to generic (similar to priorityonehot) and use it
|
||||||
|
|
||||||
// LZC - find the first 1 in the input's mantissa
|
// LZC - find the first 1 in the input's mantissa
|
||||||
logic [8:0] i,NormCnt;
|
logic [8:0] i,NormCnt;
|
||||||
|
@ -62,6 +62,10 @@ module fcvt (
|
|||||||
// fcvt.d.lu = 110
|
// fcvt.d.lu = 110
|
||||||
// {long, unsigned, to int}
|
// {long, unsigned, to int}
|
||||||
|
|
||||||
|
// *** revisit this module, explain in more depth
|
||||||
|
// should the int to fp and fp to int paths be separated?
|
||||||
|
// add support for all formats
|
||||||
|
|
||||||
// calculate signals based off the input and output's size
|
// calculate signals based off the input and output's size
|
||||||
assign Res64 = (FOpCtrlE[0]&FOpCtrlE[2]) | (FmtE&~FOpCtrlE[0]);
|
assign Res64 = (FOpCtrlE[0]&FOpCtrlE[2]) | (FmtE&~FOpCtrlE[0]);
|
||||||
assign In64 = (~FOpCtrlE[0]&FOpCtrlE[2]) | (FmtE&FOpCtrlE[0]);
|
assign In64 = (~FOpCtrlE[0]&FOpCtrlE[2]) | (FmtE&FOpCtrlE[0]);
|
||||||
|
@ -40,9 +40,9 @@ module alu #(parameter WIDTH=32) (
|
|||||||
logic [WIDTH-1:0] CondInvB, Shift, SLT, SLTU, FullResult;
|
logic [WIDTH-1:0] CondInvB, Shift, SLT, SLTU, FullResult;
|
||||||
logic Carry, Neg;
|
logic Carry, Neg;
|
||||||
logic LT, LTU;
|
logic LT, LTU;
|
||||||
logic Overflow;
|
|
||||||
logic W64, SubArith, ALUOp;
|
logic W64, SubArith, ALUOp;
|
||||||
logic [2:0] ALUFunct;
|
logic [2:0] ALUFunct;
|
||||||
|
logic Asign, Bsign;
|
||||||
|
|
||||||
// Extract control signals
|
// Extract control signals
|
||||||
// W64 indicates RV64 W-suffix instructions acting on lower 32-bit word
|
// W64 indicates RV64 W-suffix instructions acting on lower 32-bit word
|
||||||
@ -57,12 +57,13 @@ module alu #(parameter WIDTH=32) (
|
|||||||
// Shifts
|
// Shifts
|
||||||
shifter sh(.A, .Amt(B[`LOG_XLEN-1:0]), .Right(Funct3[2]), .Arith(SubArith), .W64, .Y(Shift));
|
shifter sh(.A, .Amt(B[`LOG_XLEN-1:0]), .Right(Funct3[2]), .Arith(SubArith), .W64, .Y(Shift));
|
||||||
|
|
||||||
// condition code flags based on subtract output
|
// condition code flags based on subtract output Sum = A-B
|
||||||
// Overflow occurs when the numbers being subtracted have the opposite sign
|
// Overflow occurs when the numbers being subtracted have the opposite sign
|
||||||
// and the result has the opposite sign of A
|
// and the result has the opposite sign of A
|
||||||
assign Overflow = (A[WIDTH-1] ^ B[WIDTH-1]) & (A[WIDTH-1] ^ Sum[WIDTH-1]);
|
|
||||||
assign Neg = Sum[WIDTH-1];
|
assign Neg = Sum[WIDTH-1];
|
||||||
assign LT = Neg ^ Overflow;
|
assign Asign = A[WIDTH-1];
|
||||||
|
assign Bsign = B[WIDTH-1];
|
||||||
|
assign LT = Asign & ~Bsign | Asign & Neg | ~Bsign & Neg; // simplified from Overflow = Asign & Bsign & Asign & Neg; LT = Neg ^ Overflow
|
||||||
assign LTU = ~Carry;
|
assign LTU = ~Carry;
|
||||||
|
|
||||||
// SLT
|
// SLT
|
||||||
|
@ -33,7 +33,8 @@
|
|||||||
|
|
||||||
module privdec (
|
module privdec (
|
||||||
input logic [31:20] InstrM,
|
input logic [31:20] InstrM,
|
||||||
input logic PrivilegedM, IllegalIEUInstrFaultM, IllegalCSRAccessM, IllegalFPUInstrM, TrappedSRETM,
|
input logic PrivilegedM, IllegalIEUInstrFaultM, IllegalCSRAccessM, IllegalFPUInstrM,
|
||||||
|
input logic TrappedSRETM, WFITimeoutM,
|
||||||
input logic [1:0] PrivilegeModeW,
|
input logic [1:0] PrivilegeModeW,
|
||||||
input logic STATUS_TSR,
|
input logic STATUS_TSR,
|
||||||
output logic IllegalInstrFaultM,
|
output logic IllegalInstrFaultM,
|
||||||
@ -51,7 +52,6 @@ module privdec (
|
|||||||
assign wfiM = PrivilegedM & (InstrM[31:20] == 12'b000100000101);
|
assign wfiM = PrivilegedM & (InstrM[31:20] == 12'b000100000101);
|
||||||
assign sfencevmaM = PrivilegedM & (InstrM[31:25] == 7'b0001001); // *** & (PrivilegedModeW == `M_MODE | ~STATUS_TVM); // *** does this work in U mode?
|
assign sfencevmaM = PrivilegedM & (InstrM[31:25] == 7'b0001001); // *** & (PrivilegedModeW == `M_MODE | ~STATUS_TVM); // *** does this work in U mode?
|
||||||
assign IllegalPrivilegedInstrM = PrivilegedM & ~(sretM|mretM|ecallM|ebreakM|wfiM|sfencevmaM);
|
assign IllegalPrivilegedInstrM = PrivilegedM & ~(sretM|mretM|ecallM|ebreakM|wfiM|sfencevmaM);
|
||||||
assign IllegalInstrFaultM = (IllegalIEUInstrFaultM & IllegalFPUInstrM) | IllegalPrivilegedInstrM | IllegalCSRAccessM | TrappedSRETM; // *** generalize this for other instructions
|
assign IllegalInstrFaultM = (IllegalIEUInstrFaultM & IllegalFPUInstrM) | IllegalPrivilegedInstrM | IllegalCSRAccessM |
|
||||||
|
TrappedSRETM | WFITimeoutM; // *** generalize this for other instructions
|
||||||
// *** initially, wfi is nop
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -104,6 +104,7 @@ module privileged (
|
|||||||
logic [11:0] MIP_REGW, MIE_REGW, SIP_REGW, SIE_REGW;
|
logic [11:0] MIP_REGW, MIE_REGW, SIP_REGW, SIE_REGW;
|
||||||
logic md;
|
logic md;
|
||||||
logic StallMQ;
|
logic StallMQ;
|
||||||
|
logic WFITimeoutM;
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
@ -114,24 +115,6 @@ module privileged (
|
|||||||
assign md = CauseM[`XLEN-1] ? MIDELEG_REGW[CauseM[3:0]] : MEDELEG_REGW[CauseM[`LOG_XLEN-1:0]];
|
assign md = CauseM[`XLEN-1] ? MIDELEG_REGW[CauseM[3:0]] : MEDELEG_REGW[CauseM[`LOG_XLEN-1:0]];
|
||||||
|
|
||||||
// PrivilegeMode FSM
|
// PrivilegeMode FSM
|
||||||
/* -----\/----- EXCLUDED -----\/-----
|
|
||||||
always_comb begin
|
|
||||||
TrappedSRETM = 0;
|
|
||||||
if (mretM) NextPrivilegeModeM = STATUS_MPP;
|
|
||||||
else if (sretM)
|
|
||||||
if (STATUS_TSR & PrivilegeModeW == `S_MODE) begin
|
|
||||||
TrappedSRETM = 1;
|
|
||||||
NextPrivilegeModeM = PrivilegeModeW;
|
|
||||||
end else NextPrivilegeModeM = {1'b0, STATUS_SPP};
|
|
||||||
else if (TrapM) begin // Change privilege based on DELEG registers (see 3.1.8)
|
|
||||||
if (`S_SUPPORTED & md & (PrivilegeModeW == `U_MODE | PrivilegeModeW == `S_MODE))
|
|
||||||
NextPrivilegeModeM = `S_MODE;
|
|
||||||
else NextPrivilegeModeM = `M_MODE;
|
|
||||||
end else NextPrivilegeModeM = PrivilegeModeW;
|
|
||||||
end
|
|
||||||
|
|
||||||
-----/\----- EXCLUDED -----/\----- */
|
|
||||||
|
|
||||||
always_comb begin
|
always_comb begin
|
||||||
if (TrapM) begin // Change privilege based on DELEG registers (see 3.1.8)
|
if (TrapM) begin // Change privilege based on DELEG registers (see 3.1.8)
|
||||||
if (`S_SUPPORTED & md & (PrivilegeModeW == `U_MODE | PrivilegeModeW == `S_MODE))
|
if (`S_SUPPORTED & md & (PrivilegeModeW == `U_MODE | PrivilegeModeW == `S_MODE))
|
||||||
@ -149,14 +132,21 @@ module privileged (
|
|||||||
|
|
||||||
flopenl #(2) privmodereg(clk, reset, ~StallW, NextPrivilegeModeM, `M_MODE, PrivilegeModeW);
|
flopenl #(2) privmodereg(clk, reset, ~StallW, NextPrivilegeModeM, `M_MODE, PrivilegeModeW);
|
||||||
|
|
||||||
// *** WFI could be implemented here and depends on TW
|
///////////////////////////////////////////
|
||||||
|
// WFI timeout Privileged Spec 3.1.6.5
|
||||||
|
///////////////////////////////////////////
|
||||||
|
if (`U_SUPPORTED) begin
|
||||||
|
logic [`WFI_TIMEOUT_BIT:0] WFICount;
|
||||||
|
floprc #(`WFI_TIMEOUT_BIT+1) wficountreg(clk, reset, ~wfiM, WFICount+1, WFICount); // count while in WFI
|
||||||
|
assign WFITimeoutM = STATUS_TW & PrivilegeModeW != `M_MODE & WFICount[`WFI_TIMEOUT_BIT];
|
||||||
|
end else assign WFITimeoutM = 0;
|
||||||
|
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
// decode privileged instructions
|
// decode privileged instructions
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
|
||||||
privdec pmd(.InstrM(InstrM[31:20]),
|
privdec pmd(.InstrM(InstrM[31:20]),
|
||||||
.PrivilegedM, .IllegalIEUInstrFaultM, .IllegalCSRAccessM, .IllegalFPUInstrM, .TrappedSRETM,
|
.PrivilegedM, .IllegalIEUInstrFaultM, .IllegalCSRAccessM, .IllegalFPUInstrM, .TrappedSRETM, .WFITimeoutM,
|
||||||
.PrivilegeModeW, .STATUS_TSR, .IllegalInstrFaultM,
|
.PrivilegeModeW, .STATUS_TSR, .IllegalInstrFaultM,
|
||||||
.sretM, .mretM, .ecallM, .ebreakM, .wfiM, .sfencevmaM);
|
.sretM, .mretM, .ecallM, .ebreakM, .wfiM, .sfencevmaM);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user