|
|
@ -109,11 +109,12 @@ class Interface(Record):
|
|
|
|
gpr_width : int
|
|
|
|
gpr_width : int
|
|
|
|
General-purpose register width. Either 32 or 64. Compliance with Power ISA versions above
|
|
|
|
General-purpose register width. Either 32 or 64. Compliance with Power ISA versions above
|
|
|
|
v2.7B requires 64-bit wide GPRs.
|
|
|
|
v2.7B requires 64-bit wide GPRs.
|
|
|
|
mem_aligned : bool
|
|
|
|
mem_alignment : log2 of int
|
|
|
|
If ``True``, an Alignment interrupt is expected if the effective address of a Load/Store
|
|
|
|
Memory alignment. This parameter restricts the alignment of Load/Store accesses to either
|
|
|
|
operation is not aligned to its operand; ``mem.addr`` is also expected to be aligned to
|
|
|
|
``2 ** pfv.mem_alignment`` bytes, or to the size of their operand. Otherwise, an Alignment
|
|
|
|
8 bytes. If ``False``, ``mem.addr`` is expected to point to the least- or most-significant
|
|
|
|
interrupt is triggered. A core that can transparently handle misaligned accesses may set
|
|
|
|
byte of the storage operand, depending on the current endian mode.
|
|
|
|
this value to 0, whereas one that requires software intervention may set it to the width
|
|
|
|
|
|
|
|
of its data bus (as a log2).
|
|
|
|
illegal_insn_heai : bool
|
|
|
|
illegal_insn_heai : bool
|
|
|
|
If ``True``, an illegal instruction triggers an Hypervisor Emulation Assistance interrupt.
|
|
|
|
If ``True``, an illegal instruction triggers an Hypervisor Emulation Assistance interrupt.
|
|
|
|
Otherwise, it triggers an Illegal Instruction type Program interrupt (which was removed in
|
|
|
|
Otherwise, it triggers an Illegal Instruction type Program interrupt (which was removed in
|
|
|
@ -218,13 +219,16 @@ class Interface(Record):
|
|
|
|
srr1 : Record(:func:`reg_port_layout`)
|
|
|
|
srr1 : Record(:func:`reg_port_layout`)
|
|
|
|
Save/Restore Register 1 access.
|
|
|
|
Save/Restore Register 1 access.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
def __init__(self, *, gpr_width=64, mem_aligned=False, illegal_insn_heai=False,
|
|
|
|
def __init__(self, *, gpr_width=64, mem_alignment=0, illegal_insn_heai=False,
|
|
|
|
muldiv_altops=False, name=None, src_loc_at=0):
|
|
|
|
muldiv_altops=False, name=None, src_loc_at=0):
|
|
|
|
if gpr_width not in (32, 64):
|
|
|
|
if gpr_width not in (32, 64):
|
|
|
|
raise ValueError("GPR width must be 32 or 64, not {!r}".format(gpr_width))
|
|
|
|
raise ValueError("GPR width must be 32 or 64, not {!r}".format(gpr_width))
|
|
|
|
|
|
|
|
if mem_alignment not in (0, 1, 2, 3):
|
|
|
|
|
|
|
|
raise ValueError("Memory alignment must be an integer between 0 and 3, not {!r}"
|
|
|
|
|
|
|
|
.format(mem_alignment))
|
|
|
|
|
|
|
|
|
|
|
|
self.gpr_width = gpr_width
|
|
|
|
self.gpr_width = gpr_width
|
|
|
|
self.mem_aligned = bool(mem_aligned)
|
|
|
|
self.mem_alignment = mem_alignment
|
|
|
|
self.illegal_insn_heai = bool(illegal_insn_heai)
|
|
|
|
self.illegal_insn_heai = bool(illegal_insn_heai)
|
|
|
|
self.muldiv_altops = bool(muldiv_altops)
|
|
|
|
self.muldiv_altops = bool(muldiv_altops)
|
|
|
|
|
|
|
|
|
|
|
|