diff --git a/config/derivlist.txt b/config/derivlist.txt index ad76d9f17..1ed046a6a 100644 --- a/config/derivlist.txt +++ b/config/derivlist.txt @@ -108,8 +108,10 @@ D_SUPPORTED 0 deriv syn_rv64gc_noMulDiv syn_rv64gc_noFPU M_SUPPORTED 0 +ZMMUL_SUPPORTED 0 deriv syn_sram_rv64gc_noMulDiv syn_sram_rv64gc_noFPU M_SUPPORTED 0 +ZMMUL_SUPPORTED 0 deriv syn_rv64gc_noAtomic syn_rv64gc_noMulDiv ZAAMO_SUPPORTED 0 diff --git a/config/rv32e/config.vh b/config/rv32e/config.vh index 5c2d5c755..4ec0123d1 100644 --- a/config/rv32e/config.vh +++ b/config/rv32e/config.vh @@ -44,6 +44,7 @@ localparam logic ZICCLSM_SUPPORTED = 0; // Misaligned loads/stores localparam logic ZICOND_SUPPORTED = 0; // Integer conditional operations // Multiplication & division extensions +// M implies (and in the configuration file requires) Zmmul localparam logic M_SUPPORTED = 0; localparam logic ZMMUL_SUPPORTED = 0; diff --git a/config/rv32gc/config.vh b/config/rv32gc/config.vh index 4e9c8571c..c861759d9 100644 --- a/config/rv32gc/config.vh +++ b/config/rv32gc/config.vh @@ -44,8 +44,9 @@ localparam logic ZICCLSM_SUPPORTED = 0; // Misaligned loads/stores localparam logic ZICOND_SUPPORTED = 1; // Integer conditional operations // Multiplication & division extensions +// M implies (and in the configuration file requires) Zmmul localparam logic M_SUPPORTED = 1; -localparam logic ZMMUL_SUPPORTED = 0; +localparam logic ZMMUL_SUPPORTED = 1; // Atomic extensions // A extension is Zaamo + Zalrsc diff --git a/config/rv32i/config.vh b/config/rv32i/config.vh index f864d5cee..01818afc2 100644 --- a/config/rv32i/config.vh +++ b/config/rv32i/config.vh @@ -44,6 +44,7 @@ localparam logic ZICCLSM_SUPPORTED = 0; // Misaligned loads/stores localparam logic ZICOND_SUPPORTED = 0; // Integer conditional operations // Multiplication & division extensions +// M implies (and in the configuration file requires) Zmmul localparam logic M_SUPPORTED = 0; localparam logic ZMMUL_SUPPORTED = 0; diff --git a/config/rv32imc/config.vh b/config/rv32imc/config.vh index b14e213ea..05a8fd242 100644 --- a/config/rv32imc/config.vh +++ b/config/rv32imc/config.vh @@ -44,8 +44,9 @@ localparam logic ZICCLSM_SUPPORTED = 0; // Misaligned loads/stores localparam logic ZICOND_SUPPORTED = 0; // Integer conditional operations // Multiplication & division extensions +// M implies (and in the configuration file requires) Zmmul localparam logic M_SUPPORTED = 1; -localparam logic ZMMUL_SUPPORTED = 0; +localparam logic ZMMUL_SUPPORTED = 1; // Atomic extensions // A extension is Zaamo + Zalrsc diff --git a/config/rv64gc/config.vh b/config/rv64gc/config.vh index 04294f6cf..b8ed8dc47 100644 --- a/config/rv64gc/config.vh +++ b/config/rv64gc/config.vh @@ -44,8 +44,9 @@ localparam logic ZICCLSM_SUPPORTED = 1; // Misaligned loads/stores localparam logic ZICOND_SUPPORTED = 1; // Integer conditional operations // Multiplication & division extensions +// M implies (and in the configuration file requires) Zmmul localparam logic M_SUPPORTED = 1; -localparam logic ZMMUL_SUPPORTED = 0; +localparam logic ZMMUL_SUPPORTED = 1; // Atomic extensions // A extension is Zaamo + Zalrsc diff --git a/config/rv64i/config.vh b/config/rv64i/config.vh index 1567315c3..94360877f 100644 --- a/config/rv64i/config.vh +++ b/config/rv64i/config.vh @@ -44,6 +44,7 @@ localparam logic ZICCLSM_SUPPORTED = 0; // Misaligned loads/stores localparam logic ZICOND_SUPPORTED = 0; // Integer conditional operations // Multiplication & division extensions +// M implies (and in the configuration file requires) Zmmul localparam logic M_SUPPORTED = 0; localparam logic ZMMUL_SUPPORTED = 0; diff --git a/src/wally/wallypipelinedcore.sv b/src/wally/wallypipelinedcore.sv index 348ed6872..9cc6686fc 100644 --- a/src/wally/wallypipelinedcore.sv +++ b/src/wally/wallypipelinedcore.sv @@ -314,7 +314,7 @@ module wallypipelinedcore import cvw::*; #(parameter cvw_t P) ( end // multiply/divide unit - if (P.M_SUPPORTED | P.ZMMUL_SUPPORTED) begin:mdu + if (P.ZMMUL_SUPPORTED) begin:mdu mdu #(P) mdu(.clk, .reset, .StallM, .StallW, .FlushE, .FlushM, .FlushW, .ForwardedSrcAE, .ForwardedSrcBE, .Funct3E, .Funct3M, .IntDivE, .W64E, .MDUActiveE, diff --git a/testbench/common/riscvassertions.sv b/testbench/common/riscvassertions.sv index 4df466a55..61fef5d14 100644 --- a/testbench/common/riscvassertions.sv +++ b/testbench/common/riscvassertions.sv @@ -54,7 +54,7 @@ module riscvassertions import cvw::*; #(parameter cvw_t P); assert (P.DCACHE_SUPPORTED || (P.A_SUPPORTED == 0)) else $fatal(1, "Atomic extension (A) requires cache on Wally."); assert (P.IDIV_ON_FPU == 0 || P.F_SUPPORTED) else $fatal(1, "IDIV on FPU needs F_SUPPORTED"); assert (P.SSTC_SUPPORTED == 0 || (P.S_SUPPORTED)) else $fatal(1, "SSTC requires S_SUPPORTED"); - assert ((P.ZMMUL_SUPPORTED == 0) || (P.M_SUPPORTED ==0)) else $fatal(1, "At most one of ZMMUL_SUPPORTED and M_SUPPORTED can be enabled"); + assert ((P.M_SUPPORTED == 0) || (P.ZMMUL_SUPPORTED == 1)) else $fatal(1, "M requires ZMMUL"); assert ((P.ZICNTR_SUPPORTED == 0) || (P.ZICSR_SUPPORTED == 1)) else $fatal(1, "ZICNTR_SUPPORTED requires ZICSR_SUPPORTED"); assert ((P.ZIHPM_SUPPORTED == 0) || (P.ZICNTR_SUPPORTED == 1)) else $fatal(1, "ZIPHM_SUPPORTED requires ZICNTR_SUPPORTED"); assert ((P.ZICBOM_SUPPORTED == 0) || (P.DCACHE_SUPPORTED == 1)) else $fatal(1, "ZICBOM requires DCACHE_SUPPORTED"); @@ -64,7 +64,7 @@ module riscvassertions import cvw::*; #(parameter cvw_t P); assert ((P.ZCB_SUPPORTED == 0) || (P.M_SUPPORTED == 1 && (P.ZBA_SUPPORTED == 1 || P.XLEN == 32) && P.ZBB_SUPPORTED == 1)) else $fatal(1, "ZCB requires M and ZBB (and also ZBA for RV64)"); assert ((P.ZCA_SUPPORTED == 1) || (P.ZCD_SUPPORTED == 0 && P.ZCF_SUPPORTED == 0 && P.ZCB_SUPPORTED == 0)) else $fatal(1, "ZCB, ZCF, or ZCD requires ZCA"); assert ((P.ZCF_SUPPORTED == 0) || ((P.F_SUPPORTED == 1) && (P.XLEN == 32))) else $fatal(1, "ZCF requires F and XLEN == 32"); - assert ((P.ZCD_SUPPORTED == 0) || (P.D_SUPPORTED == 1)) else $fatal(1, "ZCD requires D"); + assert ((P.ZCD_SUPPORTED == 0) || (P.D_SUPPORTED == 1)) else $fatal(1, "ZCD requires D"); assert ((P.LLEN == P.XLEN) || (P.DCACHE_SUPPORTED)) else $fatal(1, "LLEN > XLEN (D on RV32 or Q on RV64) requires data cache"); end