assert(`PMP_ENTRIES==0||`PMP_ENTRIES==16||`PMP_ENTRIES==64)else$error("Illegal number of PMP entries: PMP_ENTRIES must be 0, 16, or 64");
assert(`S_SUPPORTED||`VIRTMEM_SUPPORTED==0)else$error("Virtual memory requires S mode support");
assert(`IDIV_BITSPERCYCLE==1||`IDIV_BITSPERCYCLE==2||`IDIV_BITSPERCYCLE==4)else$error("Illegal number of divider bits/cycle: IDIV_BITSPERCYCLE must be 1, 2, or 4");
assert(`F_SUPPORTED||~`D_SUPPORTED)else$error("Can't support double fp (D) without supporting float (F)");
assert(`D_SUPPORTED||~`Q_SUPPORTED)else$error("Can't support quad fp (Q) without supporting double (D)");
assert(`F_SUPPORTED||~`ZFH_SUPPORTED)else$error("Can't support half-precision fp (ZFH) without supporting float (F)");
assert(`DCACHE_SUPPORTED||~`F_SUPPORTED||`FLEN<=`XLEN)else$error("Data cache required to support FLEN > XLEN because AHB bus width is XLEN");
assert(`FLEN<=`XLEN||`DCACHE_SUPPORTED||`DTIM_SUPPORTED)else$error("Wally does not support FLEN > XLEN unleses data cache or DTIM is supported");
assert(`DCACHE_WAYSIZEINBYTES<=4096||(!`DCACHE_SUPPORTED)||`VIRTMEM_SUPPORTED==0)else$error("DCACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
assert(`DCACHE_LINELENINBITS>=128||(!`DCACHE_SUPPORTED))else$error("DCACHE_LINELENINBITS must be at least 128 when caches are enabled");
assert(`ICACHE_WAYSIZEINBYTES<=4096||(!`ICACHE_SUPPORTED)||`VIRTMEM_SUPPORTED==0)else$error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
assert(`ICACHE_LINELENINBITS>=32||(!`ICACHE_SUPPORTED))else$error("ICACHE_LINELENINBITS must be at least 32 when caches are enabled");
assert(`ZICSR_SUPPORTED==1||(`PMP_ENTRIES==0&&`VIRTMEM_SUPPORTED==0))else$error("PMP_ENTRIES and VIRTMEM_SUPPORTED must be zero if ZICSR not supported.");
assert(`ZICSR_SUPPORTED==1||(`S_SUPPORTED==0&&`U_SUPPORTED==0))else$error("S and U modes not supported if ZICSR not supported");
assert(`U_SUPPORTED||(`S_SUPPORTED==0))else$error("S mode only supported if U also is supported");
assert(`VIRTMEM_SUPPORTED==0||(`DTIM_SUPPORTED==0&&`IROM_SUPPORTED==0))else$error("Can't simultaneously have virtual memory and DTIM_SUPPORTED/IROM_SUPPORTED because local memories don't translate addresses");
assert((`DCACHE_SUPPORTED==0&&`ICACHE_SUPPORTED==0)||`BUS_SUPPORTED)else$error("Dcache and Icache requires DBUS_SUPPORTED.");
assert(`DCACHE_LINELENINBITS<=`XLEN*16||(!`DCACHE_SUPPORTED))else$error("DCACHE_LINELENINBITS must not exceed 16 words because max AHB burst size is 1");