# instruction decoder - needs a Trap-capable Record (captures EINT etc.)
self.e = Decode2ToExecute1Type("core", opkls=IssuerDecode2ToOperand)
+ # SVP64 RA_OR_ZERO needs to know if the relevant EXTRA2/3 field is zero
+ self.sv_a_nz = Signal()
+
+ # state and raw instruction
self.state = CoreState("core")
self.raw_insn_i = Signal(32) # raw instruction
- self.bigendian_i = Signal() # bigendian
+ self.bigendian_i = Signal() # bigendian - TODO, set by MSR.BE
# issue/valid/busy signalling
self.ivalid_i = Signal(reset_less=True) # instruction is valid
setattr(m.submodules, "dec_%s" % v.fn_name, v)
comb += v.dec.raw_opcode_in.eq(self.raw_insn_i)
comb += v.dec.bigendian.eq(self.bigendian_i)
+ # sigh due to SVP64 RA_OR_ZERO detection connect these too
+ comb += v.sv_a_nz.eq(self.sv_a_nz)
# ssh, cheat: trap uses the main decoder because of the rewriting
self.des[self.trapunit] = self.e.do
sync += core.state.eq(cur_state)
sync += core.raw_insn_i.eq(dec_opcode_i)
sync += core.bigendian_i.eq(self.core_bigendian_i)
+ # set RA_OR_ZERO detection in satellite decoders
+ sync += core.sv_a_nz.eq(pdecode2.sv_a_nz)
# loop into INSN_FETCH if it's a vector instruction
# and VL == 0. this because VL==0 is a for-loop
# from 0 to 0 i.e. always, always a NOP.
sync += core.e.eq(pdecode2.e)
sync += core.state.eq(cur_state)
sync += core.bigendian_i.eq(self.core_bigendian_i)
+ sync += core.sv_a_nz.eq(pdecode2.sv_a_nz)
m.next = "INSN_EXECUTE" # move to "execute"
# check if svstate needs updating: if so, write it to State Regfile