udb 0.1.9 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.data/cfgs/example_rv64_with_overlay.yaml +5 -2
- data/.data/cfgs/mc100-32-full-example.yaml +1 -0
- data/.data/cfgs/profile/README.adoc +10 -0
- data/.data/cfgs/profile/RVA20S64.yaml +26 -6
- data/.data/cfgs/profile/RVA20U64.yaml +18 -4
- data/.data/cfgs/profile/RVA22S64.yaml +27 -7
- data/.data/cfgs/profile/RVA22U64.yaml +18 -4
- data/.data/cfgs/profile/RVA23S64.yaml +61 -7
- data/.data/cfgs/profile/RVA23U64.yaml +36 -4
- data/.data/cfgs/profile/RVB23S64.yaml +27 -7
- data/.data/cfgs/profile/RVB23U64.yaml +18 -4
- data/.data/cfgs/profile/RVI20U32.yaml +10 -4
- data/.data/cfgs/profile/RVI20U64.yaml +10 -4
- data/.data/cfgs/qc_iu.yaml +4 -1
- data/.data/cfgs/rv32-riscv-tests.yaml +2 -1
- data/.data/cfgs/rv32-vector.yaml +2 -1
- data/.data/cfgs/rv64-riscv-tests.yaml +2 -1
- data/.data/cfgs/rv64-vector.yaml +2 -1
- data/.data/spec/custom/isa/qc_iu/csr/Smrnmi/mnepc.yaml +17 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqccmi/qc.itba.yaml +45 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqccmi/qc.itdec.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/csr/jvt.yaml +11 -0
- data/.data/spec/custom/isa/qc_iu/csr/mepc.yaml +16 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqccmi.yaml +219 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqccmt.yaml +127 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmi/qc.cm.ilut.yaml +153 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmt/qc.cm.jalt.yaml +84 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmt/qc.cm.jt.yaml +60 -0
- data/.data/spec/custom/isa/qc_iu/isa/globals.isa +112 -0
- data/.data/spec/schemas/config_schema.json +219 -26
- data/.data/spec/schemas/csr_schema.json +0 -6
- data/.data/spec/schemas/ext_schema.json +80 -24
- data/.data/spec/schemas/inst_schema.json +0 -3
- data/.data/spec/schemas/profile_release_schema.json +1 -1
- data/.data/spec/schemas/profile_schema.json +0 -3
- data/.data/spec/schemas/register_file_schema.json +8 -3
- data/.data/spec/schemas/schema_defs.json +8 -27
- data/.data/spec/std/isa/csr/I/pmpcfg0.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg1.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg10.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg11.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg12.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg13.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg14.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg15.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg2.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg3.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg4.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg5.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg6.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg7.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg8.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg9.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfgN.layout +1 -1
- data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.layout +6 -2
- data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.yaml +6 -2
- data/.data/spec/std/isa/csr/hstatus.yaml +16 -0
- data/.data/spec/std/isa/csr/mcycleh.yaml +1 -1
- data/.data/spec/std/isa/csr/misa.yaml +0 -12
- data/.data/spec/std/isa/csr/mstatus.yaml +38 -0
- data/.data/spec/std/isa/csr/mstatush.yaml +17 -15
- data/.data/spec/std/isa/csr/senvcfg.yaml +16 -0
- data/.data/spec/std/isa/csr/sstatus.yaml +12 -0
- data/.data/spec/std/isa/csr/vsstatus.yaml +24 -0
- data/.data/spec/std/isa/ext/A.yaml +5 -7
- data/.data/spec/std/isa/ext/S.yaml +12 -0
- data/.data/spec/std/isa/ext/Smpmpmt.yaml +52 -0
- data/.data/spec/std/isa/ext/Sv32.yaml +7 -19
- data/.data/spec/std/isa/ext/Sv39.yaml +7 -19
- data/.data/spec/std/isa/ext/Sv48.yaml +4 -20
- data/.data/spec/std/isa/ext/Sv57.yaml +4 -20
- data/.data/spec/std/isa/ext/Svukte.yaml +71 -0
- data/.data/spec/std/isa/ext/Zawrs.yaml +1 -1
- data/.data/spec/std/isa/ext/Zihpm.yaml +0 -12
- data/.data/spec/std/isa/inst/C/c.addi.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.addi16sp.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.addiw.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.andi.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.ldsp.yaml +1 -1
- data/.data/spec/std/isa/inst/C/c.li.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.lui.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.mv.yaml +1 -1
- data/.data/spec/std/isa/inst/C/c.sdsp.yaml +1 -1
- data/.data/spec/std/isa/inst/D/fsgnj.d.yaml +3 -0
- data/.data/spec/std/isa/inst/D/fsgnjn.d.yaml +3 -0
- data/.data/spec/std/isa/inst/D/fsgnjx.d.yaml +3 -0
- data/.data/spec/std/isa/inst/F/fadd.s.yaml +5 -5
- data/.data/spec/std/isa/inst/F/fclass.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fcvt.l.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.lu.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.s.l.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.s.lu.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.s.w.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.s.wu.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.w.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.wu.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fdiv.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/feq.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fle.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fleq.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/flt.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fltq.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/flw.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fmadd.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fmax.s.yaml +6 -6
- data/.data/spec/std/isa/inst/F/fmin.s.yaml +6 -6
- data/.data/spec/std/isa/inst/F/fmsub.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fmul.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fmv.w.x.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fmv.x.w.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fnmadd.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fnmsub.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fsgnj.s.yaml +4 -4
- data/.data/spec/std/isa/inst/F/fsgnjn.s.yaml +3 -3
- data/.data/spec/std/isa/inst/F/fsgnjx.s.yaml +4 -4
- data/.data/spec/std/isa/inst/F/fsqrt.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fsub.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fsw.yaml +1 -1
- data/.data/spec/std/isa/inst/I/addi.yaml +1 -1
- data/.data/spec/std/isa/inst/I/addiw.yaml +1 -1
- data/.data/spec/std/isa/inst/I/andi.yaml +1 -1
- data/.data/spec/std/isa/inst/I/beq.yaml +1 -1
- data/.data/spec/std/isa/inst/I/bge.yaml +4 -2
- data/.data/spec/std/isa/inst/I/bgeu.yaml +3 -0
- data/.data/spec/std/isa/inst/I/blt.yaml +4 -2
- data/.data/spec/std/isa/inst/I/bltu.yaml +3 -0
- data/.data/spec/std/isa/inst/I/bne.yaml +1 -1
- data/.data/spec/std/isa/inst/I/slt.yaml +2 -2
- data/.data/spec/std/isa/inst/I/sltiu.yaml +1 -1
- data/.data/spec/std/isa/inst/I/sltu.yaml +1 -1
- data/.data/spec/std/isa/inst/I/sub.yaml +1 -1
- data/.data/spec/std/isa/inst/I/subw.yaml +1 -1
- data/.data/spec/std/isa/inst/I/xori.yaml +1 -1
- data/.data/spec/std/isa/inst/M/mul.yaml +0 -19
- data/.data/spec/std/isa/inst/Q/fsgnj.q.yaml +1 -1
- data/.data/spec/std/isa/inst/S/sret.yaml +3 -1
- data/.data/spec/std/isa/inst/V/vadd.vv.yaml +1 -5
- data/.data/spec/std/isa/inst/V/vfsgnjn.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vfsgnjx.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vl1re8.v.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vl2re8.v.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vl4re8.v.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vl8re8.v.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vle8.v.yaml +3 -8
- data/.data/spec/std/isa/inst/V/vmand.mm.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmfle.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmflt.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmnand.mm.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsgt.vi.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsgtu.vi.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsle.vi.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsle.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsleu.vi.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsleu.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmslt.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsltu.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmv.v.i.yaml +2 -13
- data/.data/spec/std/isa/inst/V/vmv.x.s.yaml +1 -1
- data/.data/spec/std/isa/inst/V/vmxnor.mm.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmxor.mm.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vnsrl.wx.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vrsub.vx.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vse8.v.yaml +3 -4
- data/.data/spec/std/isa/inst/V/vwadd.vx.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vwaddu.vx.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vxor.vi.yaml +4 -0
- data/.data/spec/std/isa/inst/Zalasr/lSIZE.AQRL.layout +40 -5
- data/.data/spec/std/isa/inst/Zalasr/lb.aq.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lb.aqrl.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/ld.aq.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/ld.aqrl.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lh.aq.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lh.aqrl.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lw.aq.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lw.aqrl.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/sSIZE.AQRL.layout +46 -5
- data/.data/spec/std/isa/inst/Zalasr/sb.aqrl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sb.rl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sd.aqrl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sd.rl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sh.aqrl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sh.rl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sw.aqrl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sw.rl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zbkb/packw.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcd/c.fld.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcd/c.fldsp.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcd/c.fsdsp.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcf/c.flwsp.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcf/c.fswsp.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcmp/cm.pop.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcmp/cm.popret.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcmp/cm.popretz.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcmp/cm.push.yaml +2 -3
- data/.data/spec/std/isa/inst/Zfa/fround.s.yaml +1 -1
- data/.data/spec/std/isa/inst/Zfh/fcvt.h.s.yaml +6 -6
- data/.data/spec/std/isa/inst/Zfh/fcvt.s.h.yaml +5 -5
- data/.data/spec/std/isa/inst/Zfh/flh.yaml +1 -1
- data/.data/spec/std/isa/inst/Zfh/fmv.h.x.yaml +1 -1
- data/.data/spec/std/isa/inst/Zfh/fmv.x.h.yaml +1 -1
- data/.data/spec/std/isa/inst/Zfh/fsh.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrc.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrci.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrs.yaml +2 -2
- data/.data/spec/std/isa/inst/Zicsr/csrrsi.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrw.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrwi.yaml +1 -1
- data/.data/spec/std/isa/isa/builtin_functions.idl +17 -0
- data/.data/spec/std/isa/isa/fp.idl +1 -5
- data/.data/spec/std/isa/isa/globals.isa +45 -14
- data/.data/spec/std/isa/isa/vec.idl +1 -2
- data/.data/spec/std/isa/manual_version/isa/20240411/isa_20240411.yaml +5 -5
- data/.data/spec/std/isa/param/COUNTINHIBIT_EN.yaml +8 -2
- data/.data/spec/std/isa/param/JVT_BASE_MASK.yaml +1 -1
- data/.data/spec/std/isa/param/MCOUNTINHIBIT_IMPLEMENTED.yaml +25 -0
- data/.data/spec/std/isa/param/MTVEC_MODES.yaml +10 -3
- data/.data/spec/std/isa/param/VLEN.yaml +2 -0
- data/.data/spec/std/isa/profile/RVA20S64.yaml +11 -4
- data/.data/spec/std/isa/profile/RVA20U64.yaml +14 -5
- data/.data/spec/std/isa/profile/RVA22S64.yaml +14 -3
- data/.data/spec/std/isa/profile/RVA22U64.yaml +8 -1
- data/.data/spec/std/isa/profile/RVA23S64.yaml +13 -0
- data/.data/spec/std/isa/profile/RVA23U64.yaml +15 -1
- data/.data/spec/std/isa/profile/RVB23S64.yaml +15 -3
- data/.data/spec/std/isa/profile/RVB23U64.yaml +8 -1
- data/.data/spec/std/isa/profile/RVI20U32.yaml +8 -1
- data/.data/spec/std/isa/profile/RVI20U64.yaml +7 -0
- data/.data/spec/std/isa/register_file/F.yaml +3 -2
- data/.data/spec/std/isa/register_file/V.yaml +2 -2
- data/.data/spec/std/isa/register_file/X.yaml +2 -1
- data/lib/udb/architecture.rb +4 -25
- data/lib/udb/cfg_arch.rb +171 -59
- data/lib/udb/cli.rb +10 -1
- data/lib/udb/condition.rb +38 -37
- data/lib/udb/config.rb +72 -6
- data/lib/udb/logic.rb +29 -56
- data/lib/udb/obj/csr.rb +23 -5
- data/lib/udb/obj/csr_field.rb +36 -21
- data/lib/udb/obj/database_obj.rb +2 -5
- data/lib/udb/obj/extension.rb +0 -3
- data/lib/udb/obj/instruction.rb +1 -4
- data/lib/udb/obj/portfolio.rb +75 -20
- data/lib/udb/obj/profile.rb +0 -4
- data/lib/udb/obj/register_file.rb +63 -2
- data/lib/udb/portfolio_design.rb +3 -6
- data/lib/udb/resolver.rb +84 -23
- data/lib/udb/version.rb +1 -1
- data/lib/udb/version_spec.rb +8 -0
- data/lib/udb/z3.rb +23 -0
- data/lib/udb.rb +0 -3
- metadata +25 -37
- data/.data/cfgs/profile/RVA23M64.yaml +0 -159
- data/.data/cfgs/profile/RVB23M64.yaml +0 -149
- data/.data/spec/schemas/proc_cert_class_schema.json +0 -35
- data/.data/spec/schemas/proc_cert_model_schema.json +0 -336
- data/.data/spec/std/isa/proc_cert_class/AC.yaml +0 -13
- data/.data/spec/std/isa/proc_cert_class/MC.yaml +0 -13
- data/.data/spec/std/isa/proc_cert_class/RVI.yaml +0 -16
- data/.data/spec/std/isa/proc_cert_model/AC100.yaml +0 -72
- data/.data/spec/std/isa/proc_cert_model/AC200.yaml +0 -58
- data/.data/spec/std/isa/proc_cert_model/MC100-32.yaml +0 -155
- data/.data/spec/std/isa/proc_cert_model/MC100-64.yaml +0 -21
- data/.data/spec/std/isa/proc_cert_model/MC200-32.yaml +0 -60
- data/.data/spec/std/isa/proc_cert_model/MC200-64.yaml +0 -21
- data/.data/spec/std/isa/proc_cert_model/MC300-32.yaml +0 -40
- data/.data/spec/std/isa/proc_cert_model/MC300-64.yaml +0 -21
- data/.data/spec/std/isa/proc_cert_model/RVI20-32.yaml +0 -39
- data/.data/spec/std/isa/proc_cert_model/RVI20-64.yaml +0 -19
- data/.data/spec/std/isa/profile/RVA23M64.yaml +0 -24
- data/.data/spec/std/isa/profile/RVB23M64.yaml +0 -86
- data/lib/udb/cert_normative_rule.rb +0 -41
- data/lib/udb/obj/certifiable_obj.rb +0 -21
- data/lib/udb/obj/certificate.rb +0 -230
- data/lib/udb/proc_cert_design.rb +0 -77
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
|
2
|
+
# SPDX-License-Identifier: BSD-3-Clause-Clear
|
|
3
|
+
|
|
4
|
+
# yaml-language-server: $schema=../../../../../schemas/inst_schema.json
|
|
5
|
+
|
|
6
|
+
$schema: "inst_schema.json#"
|
|
7
|
+
kind: instruction
|
|
8
|
+
name: qc.cm.ilut
|
|
9
|
+
long_name: Instruction Lookup Table Execute
|
|
10
|
+
description: |
|
|
11
|
+
Fetch and execute the instruction(s) packed in the ILUT entry at index `ilut_index`.
|
|
12
|
+
|
|
13
|
+
The ILUT base address is held in `qc.itba.base` (shifted left by 6 to form a
|
|
14
|
+
64-byte-aligned byte address). The first `qc.itdec.dec` entries are 64-bit
|
|
15
|
+
double entries; all remaining entries are 32-bit single entries.
|
|
16
|
+
|
|
17
|
+
Entry address calculation:
|
|
18
|
+
- If `ilut_index` < `qc.itdec.dec`: `entry_addr = (qc.itba.BASE << 6) + ilut_index * 8`
|
|
19
|
+
- Otherwise: `entry_addr = (qc.itba.BASE << 6) + qc.itdec.DEC * 8 + (ilut_index - qc.itdec.DEC) * 4`
|
|
20
|
+
|
|
21
|
+
Each entry may contain one or two packed RISC-V instructions. The first
|
|
22
|
+
instruction begins at bit 0 of the entry. Its size is determined by the
|
|
23
|
+
standard RISC-V instruction-length encoding (16-bit, 32-bit, or 48-bit).
|
|
24
|
+
If bits remain after the first instruction and the next 16 bits are not
|
|
25
|
+
`c.nop` (16'h0001), a second instruction is present and is also executed.
|
|
26
|
+
|
|
27
|
+
PC-relative instructions (`auipc`, branches, and jumps) are not permitted
|
|
28
|
+
inside ILUT entries. Hardware detects such instructions during decode and
|
|
29
|
+
raises an IllegalInstruction exception.
|
|
30
|
+
|
|
31
|
+
On an exception caused by the second instruction, hardware sets bit 0 of
|
|
32
|
+
`mepc` to indicate that the fault originated from the second instruction
|
|
33
|
+
within the entry.
|
|
34
|
+
|
|
35
|
+
See the Xqccmi extension description for full details on entry layout,
|
|
36
|
+
dual-instruction packing, exception handling, and restrictions.
|
|
37
|
+
definedBy:
|
|
38
|
+
extension:
|
|
39
|
+
name: Xqccmi
|
|
40
|
+
assembly: ilut_index
|
|
41
|
+
encoding:
|
|
42
|
+
match: 001-----------00
|
|
43
|
+
variables:
|
|
44
|
+
- name: ilut_index
|
|
45
|
+
location: 12-2
|
|
46
|
+
access:
|
|
47
|
+
s: always
|
|
48
|
+
u: always
|
|
49
|
+
vs: always
|
|
50
|
+
vu: always
|
|
51
|
+
operation(): |
|
|
52
|
+
# Read the double-entry count (N = number of 64-bit double entries)
|
|
53
|
+
XReg N = {21'b0, CSR[qc.itdec].dec};
|
|
54
|
+
|
|
55
|
+
# Compute the byte address of the ILUT entry
|
|
56
|
+
XReg base_addr = CSR[qc.itba].base << 6;
|
|
57
|
+
XReg entry_addr;
|
|
58
|
+
Boolean is_double;
|
|
59
|
+
|
|
60
|
+
if (ilut_index < N) {
|
|
61
|
+
entry_addr = base_addr + (ilut_index * 8);
|
|
62
|
+
is_double = true;
|
|
63
|
+
} else {
|
|
64
|
+
entry_addr = base_addr + (N * 8) + ((ilut_index - N) * 4);
|
|
65
|
+
is_double = false;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# Translate the entry address (instruction fetch)
|
|
69
|
+
TranslationResult result;
|
|
70
|
+
if (CSR[misa].S == 1) {
|
|
71
|
+
result = translate(entry_addr, MemoryOperation::Fetch, mode(), $encoding);
|
|
72
|
+
} else {
|
|
73
|
+
result.paddr = entry_addr;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# Access check for instruction fetch
|
|
77
|
+
access_check(result.paddr, is_double ? 8 : 4, $pc, MemoryOperation::Fetch, ExceptionCode::InstructionAccessFault, mode());
|
|
78
|
+
|
|
79
|
+
# Read the entry from physical memory.
|
|
80
|
+
# For a 32-bit entry, read 32 bits. For a 64-bit double entry, read two
|
|
81
|
+
# consecutive 32-bit words (entry_lo = bits[31:0], entry_hi = bits[63:32]).
|
|
82
|
+
XReg entry_lo = read_physical_memory(32, result.paddr);
|
|
83
|
+
XReg entry_hi = 32'b0;
|
|
84
|
+
if (is_double) {
|
|
85
|
+
entry_hi = read_physical_memory(32, result.paddr + 4);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
# Determine the size of the first instruction using RISC-V length encoding:
|
|
89
|
+
# bits[1:0] != 2'b11 -> 16-bit instruction
|
|
90
|
+
# bits[1:0] == 2'b11 and bits[4:2] != 3'b111 -> 32-bit instruction
|
|
91
|
+
# bits[1:0] == 2'b11 and bits[4:2] == 3'b111 -> 48-bit instruction
|
|
92
|
+
Boolean has_second_inst = false; # true if this entry contains a second packed instruction
|
|
93
|
+
|
|
94
|
+
if (entry_lo[1:0] != 2'b11) {
|
|
95
|
+
# 16-bit first instruction; second instruction is in entry_lo[31:16]
|
|
96
|
+
Bits<16> second_lo = entry_lo[31:16];
|
|
97
|
+
if (second_lo != 16'h0001) {
|
|
98
|
+
has_second_inst = true;
|
|
99
|
+
}
|
|
100
|
+
} else if (entry_lo[4:2] != 3'b111) {
|
|
101
|
+
# 32-bit first instruction
|
|
102
|
+
if (is_double) {
|
|
103
|
+
# Second instruction starts at entry_hi[15:0]
|
|
104
|
+
Bits<16> second_lo = entry_hi[15:0];
|
|
105
|
+
if (second_lo != 16'h0001) {
|
|
106
|
+
has_second_inst = true;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
# No room for a second instruction in a 32-bit entry after a 32-bit first
|
|
110
|
+
} else {
|
|
111
|
+
# 48-bit first instruction
|
|
112
|
+
if (!is_double) {
|
|
113
|
+
# 48-bit instruction does not fit in a 32-bit entry
|
|
114
|
+
executing_second_inst = false;
|
|
115
|
+
raise_ilut(ExceptionCode::IllegalInstruction, $encoding);
|
|
116
|
+
}
|
|
117
|
+
# No room for a second instruction after a 48-bit first in a 64-bit entry
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# PC-relative instruction check:
|
|
121
|
+
# Hardware detects auipc, branches, and jump instructions during decode
|
|
122
|
+
# and raises an IllegalInstruction exception before any instruction executes.
|
|
123
|
+
# mepc bit 0 reflects which slot contained the forbidden instruction.
|
|
124
|
+
if (is_pc_relative_inst?(entry_lo)) {
|
|
125
|
+
executing_second_inst = false;
|
|
126
|
+
raise_ilut(ExceptionCode::IllegalInstruction, $encoding);
|
|
127
|
+
}
|
|
128
|
+
if (has_second_inst) {
|
|
129
|
+
Bits<32> second_inst;
|
|
130
|
+
if (entry_lo[1:0] != 2'b11) {
|
|
131
|
+
second_inst = {16'b0, entry_lo[31:16]};
|
|
132
|
+
} else {
|
|
133
|
+
second_inst = {16'b0, entry_hi[15:0]};
|
|
134
|
+
}
|
|
135
|
+
if (is_pc_relative_inst?(second_inst)) {
|
|
136
|
+
executing_second_inst = true;
|
|
137
|
+
raise_ilut(ExceptionCode::IllegalInstruction, $encoding);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
# Execute the first instruction from the ILUT entry.
|
|
142
|
+
# IDL cannot express dynamic instruction dispatch; actual execution is implementation-defined.
|
|
143
|
+
# Any exception raised must call raise_ilut() with executing_second_inst = false (mepc bit 0 = 0).
|
|
144
|
+
executing_second_inst = false;
|
|
145
|
+
unpredictable("TO-DO: execute first ILUT instruction");
|
|
146
|
+
|
|
147
|
+
# Execute the second instruction from the ILUT entry, if present.
|
|
148
|
+
# Any exception raised must call raise_ilut() with executing_second_inst = true (mepc bit 0 = 1).
|
|
149
|
+
if (has_second_inst) {
|
|
150
|
+
executing_second_inst = true;
|
|
151
|
+
unpredictable("TO-DO: execute second ILUT instruction");
|
|
152
|
+
executing_second_inst = false;
|
|
153
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
|
2
|
+
# SPDX-License-Identifier: BSD-3-Clause-Clear
|
|
3
|
+
|
|
4
|
+
# yaml-language-server: $schema=../../../../../schemas/inst_schema.json
|
|
5
|
+
|
|
6
|
+
$schema: "inst_schema.json#"
|
|
7
|
+
kind: instruction
|
|
8
|
+
name: qc.cm.jalt
|
|
9
|
+
long_name: Jump Via Table with Link to ra or t0
|
|
10
|
+
description: |
|
|
11
|
+
Read an address from the Jump Vector Table and jump to it, linking to either
|
|
12
|
+
`ra` (x1) or `t0` (x5) depending on bit 0 of the table entry.
|
|
13
|
+
|
|
14
|
+
Bit 0 of the jump table entry is used as metadata:
|
|
15
|
+
|
|
16
|
+
* Bit 0 = 0: save return address in `ra` (x1)
|
|
17
|
+
* Bit 0 = 1: save return address in `t0` (x5)
|
|
18
|
+
|
|
19
|
+
The actual jump target always has bit 0 cleared:
|
|
20
|
+
`target = {entry[XLEN-1:1], 1'b0}`
|
|
21
|
+
|
|
22
|
+
Instruction encoded in the same encoding space as cm.jalt (Zcmt).
|
|
23
|
+
Xqccmt and Zcmt are mutually exclusive extensions.
|
|
24
|
+
definedBy:
|
|
25
|
+
extension:
|
|
26
|
+
name: Xqccmt
|
|
27
|
+
assembly: index_7_5, index_4_0
|
|
28
|
+
encoding:
|
|
29
|
+
match: 101000--------10
|
|
30
|
+
variables:
|
|
31
|
+
- name: index_7_5
|
|
32
|
+
location: 9-7
|
|
33
|
+
not: 0
|
|
34
|
+
- name: index_4_0
|
|
35
|
+
location: 6-2
|
|
36
|
+
access:
|
|
37
|
+
s: always
|
|
38
|
+
u: always
|
|
39
|
+
vs: always
|
|
40
|
+
vu: always
|
|
41
|
+
operation(): |
|
|
42
|
+
# Ensure JVT readable
|
|
43
|
+
check_zcmt_enabled($encoding);
|
|
44
|
+
|
|
45
|
+
if (CSR[jvt].MODE != 0) {
|
|
46
|
+
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# Skip over _this_ 16-bit instruction
|
|
50
|
+
XReg return_addr = $pc + 2;
|
|
51
|
+
|
|
52
|
+
XReg jump_table_base = { CSR[jvt].BASE, 6'b000000 };
|
|
53
|
+
XReg index = { index_7_5, index_4_0 };
|
|
54
|
+
XReg virtual_address = jump_table_base + index `* (xlen() / 8);
|
|
55
|
+
XReg entry;
|
|
56
|
+
TranslationResult result;
|
|
57
|
+
|
|
58
|
+
# TODO: Correct this check when we figure out what MISA can do
|
|
59
|
+
if (CSR[misa].S == 1) {
|
|
60
|
+
result = translate(virtual_address, MemoryOperation::Fetch, mode(), $encoding);
|
|
61
|
+
} else {
|
|
62
|
+
result.paddr = virtual_address;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
# may raise an exception
|
|
66
|
+
access_check(result.paddr, xlen(), $pc, MemoryOperation::Fetch, ExceptionCode::InstructionAccessFault, mode());
|
|
67
|
+
|
|
68
|
+
if (xlen() == 32) {
|
|
69
|
+
entry = read_physical_memory(32, result.paddr);
|
|
70
|
+
} else {
|
|
71
|
+
entry = read_physical_memory(64, result.paddr);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
# Bit 0 of entry is metadata: 0 = link to ra (x1), 1 = link to t0 (x5)
|
|
75
|
+
if (entry[0] == 1'b1) {
|
|
76
|
+
X[5] = return_addr; # t0
|
|
77
|
+
} else {
|
|
78
|
+
X[1] = return_addr; # ra
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# Jump target always has bit 0 cleared
|
|
82
|
+
XReg addr = entry & $signed(2'b10);
|
|
83
|
+
|
|
84
|
+
jump(addr);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
|
2
|
+
# SPDX-License-Identifier: BSD-3-Clause-Clear
|
|
3
|
+
|
|
4
|
+
# yaml-language-server: $schema=../../../../../schemas/inst_schema.json
|
|
5
|
+
|
|
6
|
+
$schema: "inst_schema.json#"
|
|
7
|
+
kind: instruction
|
|
8
|
+
name: qc.cm.jt
|
|
9
|
+
long_name: Jump Via Table
|
|
10
|
+
description: |
|
|
11
|
+
Read an address from the Jump Vector Table and jump to it.
|
|
12
|
+
Instruction encoded in the same encoding space as cm.jt (Zcmt).
|
|
13
|
+
Xqccmt and Zcmt are mutually exclusive extensions.
|
|
14
|
+
definedBy:
|
|
15
|
+
extension:
|
|
16
|
+
name: Xqccmt
|
|
17
|
+
assembly: index
|
|
18
|
+
encoding:
|
|
19
|
+
match: 101000000-----10
|
|
20
|
+
variables:
|
|
21
|
+
- name: index
|
|
22
|
+
location: 6-2
|
|
23
|
+
access:
|
|
24
|
+
s: always
|
|
25
|
+
u: always
|
|
26
|
+
vs: always
|
|
27
|
+
vu: always
|
|
28
|
+
operation(): |
|
|
29
|
+
# Ensure JVT readable
|
|
30
|
+
check_zcmt_enabled($encoding);
|
|
31
|
+
|
|
32
|
+
if (CSR[jvt].MODE != 0) {
|
|
33
|
+
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
XReg jump_table_base = { CSR[jvt].BASE, 6'b000000 };
|
|
37
|
+
XReg virtual_address = jump_table_base + index `* (xlen() / 8);
|
|
38
|
+
XReg addr;
|
|
39
|
+
TranslationResult result;
|
|
40
|
+
|
|
41
|
+
# TODO: Correct this check when we figure out what MISA can do
|
|
42
|
+
if (CSR[misa].S == 1) {
|
|
43
|
+
result = translate(virtual_address, MemoryOperation::Fetch, mode(), $encoding);
|
|
44
|
+
} else {
|
|
45
|
+
result.paddr = virtual_address;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# may raise an exception
|
|
49
|
+
access_check(result.paddr, xlen(), $pc, MemoryOperation::Fetch, ExceptionCode::InstructionAccessFault, mode());
|
|
50
|
+
|
|
51
|
+
if (xlen() == 32) {
|
|
52
|
+
addr = read_physical_memory(32, result.paddr);
|
|
53
|
+
} else {
|
|
54
|
+
addr = read_physical_memory(64, result.paddr);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
# Ensure low-order bit is clear
|
|
58
|
+
addr = addr & $signed(2'b10);
|
|
59
|
+
|
|
60
|
+
jump(addr);
|
|
@@ -58,6 +58,118 @@ builtin function sync_write_after_read_device {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
# Global flag: true while the second packed instruction in an ILUT entry is executing.
|
|
62
|
+
# Set by qc.cm.ilut before executing the second slot; cleared after. Used by raise_ilut()
|
|
63
|
+
# to encode the faulting slot into mepc bit 0.
|
|
64
|
+
Boolean executing_second_inst = false;
|
|
65
|
+
|
|
66
|
+
# Simplified precise-exception raise for qc_iu (M-mode only).
|
|
67
|
+
# Identical to raise_precise except mepc.PC (or mnepc.PC for a double-trap)
|
|
68
|
+
# captures bit 0 from executing_second_inst, allowing the trap handler to
|
|
69
|
+
# distinguish first- vs second-instruction faults within an ILUT entry.
|
|
70
|
+
# This function must be called for any exception raised by an ILUT-executed
|
|
71
|
+
# instruction (first or second slot). The executing_second_inst flag must be set
|
|
72
|
+
# before calling: false for the first instruction, true for the second.
|
|
73
|
+
function raise_ilut {
|
|
74
|
+
arguments ExceptionCode exception_code, XReg tval
|
|
75
|
+
description {
|
|
76
|
+
Raise a precise exception for an ILUT-executed instruction.
|
|
77
|
+
Sets mepc.PC = $pc | (executing_second_inst ? 1 : 0) so that the trap handler
|
|
78
|
+
can determine whether the fault came from the first or second packed
|
|
79
|
+
instruction in the ILUT entry. For a double-trap, sets mnepc.PC instead.
|
|
80
|
+
Only the M-mode handling path is included because qc_iu is M-mode only.
|
|
81
|
+
}
|
|
82
|
+
body {
|
|
83
|
+
Bits<1> slot_bit = executing_second_inst ? 1'b1 : 1'b0;
|
|
84
|
+
|
|
85
|
+
# qc_iu is M-mode only; no S/H/VS/VU delegation logic needed.
|
|
86
|
+
if (implemented?(ExtensionName::Smrnmi) && CSR[mnstatus].NMIE == 1'b0) {
|
|
87
|
+
# Double-trap: use mnepc
|
|
88
|
+
CSR[mnepc].PC = $pc | slot_bit;
|
|
89
|
+
} else {
|
|
90
|
+
CSR[mepc].PC = $pc | slot_bit;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!mtval_readonly?()) {
|
|
94
|
+
CSR[mtval].VALUE = mtval_for(exception_code, tval);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
$pc = {CSR[mtvec].BASE, 2'b00};
|
|
98
|
+
CSR[mcause].INT = 1'b0;
|
|
99
|
+
CSR[mcause].CODE = $bits(exception_code);
|
|
100
|
+
|
|
101
|
+
set_mode(PrivilegeMode::M);
|
|
102
|
+
abort_current_instruction();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function is_pc_relative_inst? {
|
|
107
|
+
returns Boolean
|
|
108
|
+
arguments Bits<32> inst
|
|
109
|
+
description {
|
|
110
|
+
Returns true if +inst+ is a PC-relative instruction (auipc, branch, jump, or
|
|
111
|
+
compressed PC-relative jump (jal/c.j/c.jal), or compressed branch) that is
|
|
112
|
+
forbidden inside an ILUT entry. Register-indirect jumps (jalr, c.jr, c.jalr)
|
|
113
|
+
are NOT PC-relative and are permitted inside ILUT entries.
|
|
114
|
+
For 16-bit compressed instructions, only the lower 16 bits of +inst+ are examined.
|
|
115
|
+
For 48-bit Xqci instructions, only the lower 32 bits are passed here (the upper
|
|
116
|
+
16 bits are in a separate word and are not needed for this check).
|
|
117
|
+
}
|
|
118
|
+
body {
|
|
119
|
+
if (inst[1:0] != 2'b11) {
|
|
120
|
+
# 16-bit compressed instruction: examine only the lower 16 bits
|
|
121
|
+
Bits<16> cinst = inst[15:0];
|
|
122
|
+
# c.j: funct3=101, op=01
|
|
123
|
+
if (cinst[15:13] == 3'b101 && cinst[1:0] == 2'b01) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
# c.jal: funct3=001, op=01
|
|
127
|
+
if (cinst[15:13] == 3'b001 && cinst[1:0] == 2'b01) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
# c.beqz: funct3=110, op=01
|
|
131
|
+
if (cinst[15:13] == 3'b110 && cinst[1:0] == 2'b01) {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
# c.bnez: funct3=111, op=01
|
|
135
|
+
if (cinst[15:13] == 3'b111 && cinst[1:0] == 2'b01) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
} else {
|
|
140
|
+
# 32-bit (or 48-bit) instruction: check opcode field bits[6:0]
|
|
141
|
+
Bits<7> opcode = inst[6:0];
|
|
142
|
+
# auipc
|
|
143
|
+
if (opcode == 7'b0010111) {
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
# jal
|
|
147
|
+
if (opcode == 7'b1101111) {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
# branches
|
|
151
|
+
if (opcode == 7'b1100011) {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
# 48-bit Xqci PC-relative instructions (inst[4:2]==3'b111 indicates 48-bit length)
|
|
155
|
+
if (inst[4:2] == 3'b111) {
|
|
156
|
+
# All Xqci 48-bit PC-relative instructions use opcode 7'b0011111
|
|
157
|
+
if (opcode == 7'b0011111) {
|
|
158
|
+
# qc.e.j / qc.e.jal: funct3=000, inst[24:20]==5'b00000
|
|
159
|
+
if (inst[14:12] == 3'b000 && inst[24:20] == 5'b00000) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
# qc.e.beqi/bnei/blti/bgei/bltui/bgeui: funct3=100, inst[24:23]==2'b11
|
|
163
|
+
if (inst[14:12] == 3'b100 && inst[24:23] == 2'b11) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
61
173
|
function get_and_validate_stack_pointer {
|
|
62
174
|
returns XReg
|
|
63
175
|
arguments XReg sp, Bits<INSTR_ENC_SIZE> encoding
|