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