mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Issue #894: trap on floating-point ops with reserved rounding modes
This commit is contained in:
parent
a4a0a10879
commit
f7dd49cc6c
@ -81,6 +81,7 @@ module fctrl import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [1:0] Fmt, Fmt2; // format - before possible reduction
|
logic [1:0] Fmt, Fmt2; // format - before possible reduction
|
||||||
logic SupportedFmt; // is the format supported
|
logic SupportedFmt; // is the format supported
|
||||||
logic SupportedFmt2; // is the source format supported for fp -> fp
|
logic SupportedFmt2; // is the source format supported for fp -> fp
|
||||||
|
logic SupportedRM; // is the rounding mode supported
|
||||||
logic FCvtIntD, FCvtIntM; // convert to integer operation
|
logic FCvtIntD, FCvtIntM; // convert to integer operation
|
||||||
logic ZfaD; // Zfa variants of instructions
|
logic ZfaD; // Zfa variants of instructions
|
||||||
logic ZfaFRoundNXD; // Zfa froundnx instruction
|
logic ZfaFRoundNXD; // Zfa froundnx instruction
|
||||||
@ -93,14 +94,16 @@ module fctrl import cvw::*; #(parameter cvw_t P) (
|
|||||||
(Fmt == 2'b10 & P.ZFH_SUPPORTED) | (Fmt == 2'b11 & P.Q_SUPPORTED));
|
(Fmt == 2'b10 & P.ZFH_SUPPORTED) | (Fmt == 2'b11 & P.Q_SUPPORTED));
|
||||||
assign SupportedFmt2 = (Fmt2 == 2'b00 | (Fmt2 == 2'b01 & P.D_SUPPORTED) |
|
assign SupportedFmt2 = (Fmt2 == 2'b00 | (Fmt2 == 2'b01 & P.D_SUPPORTED) |
|
||||||
(Fmt2 == 2'b10 & P.ZFH_SUPPORTED) | (Fmt2 == 2'b11 & P.Q_SUPPORTED));
|
(Fmt2 == 2'b10 & P.ZFH_SUPPORTED) | (Fmt2 == 2'b11 & P.Q_SUPPORTED));
|
||||||
|
// rounding modes 5 and 6 are reserved. Rounding mode 7 is dynamic, and is reserved if FRM is 5, 6, or 7
|
||||||
|
assign SupportedRM = ~(Funct3D == 3'b101 | Funct3D == 3'b110 | (Funct3D == 3'b111 & (FRM_REGW == 3'b101 | FRM_REGW == 3'b110 | FRM_REGW == 3'b111)));
|
||||||
|
|
||||||
// decode the instruction
|
// decode the instruction
|
||||||
// FRegWrite_FWriteInt_FResSel_PostProcSel_FOpCtrl_FDivStart_IllegalFPUInstr_FCvtInt_Zfa_FroundNX
|
// FRegWrite_FWriteInt_FResSel_PostProcSel_FOpCtrl_FDivStart_IllegalFPUInstr_FCvtInt_Zfa_FroundNX
|
||||||
always_comb
|
always_comb
|
||||||
if (STATUS_FS == 2'b00) // FPU instructions are illegal when FPU is disabled
|
if (STATUS_FS == 2'b00) // FPU instructions are illegal when FPU is disabled
|
||||||
ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0;
|
ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0;
|
||||||
else if (OpD != 7'b0000111 & OpD != 7'b0100111 & ~SupportedFmt)
|
else if (OpD != 7'b0000111 & OpD != 7'b0100111 & (~SupportedFmt | ~SupportedRM))
|
||||||
ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0; // for anything other than loads and stores, check for supported format
|
ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0; // for anything other than loads and stores, check for supported format and rounding mode
|
||||||
else begin
|
else begin
|
||||||
ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0; // default: non-implemented instruction
|
ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0; // default: non-implemented instruction
|
||||||
/* verilator lint_off CASEINCOMPLETE */ // default value above has priority so no other default needed
|
/* verilator lint_off CASEINCOMPLETE */ // default value above has priority so no other default needed
|
||||||
|
Loading…
Reference in New Issue
Block a user