1 """Self-contained unit test for the Load/Store CompUnit
5 from nmigen
import Module
6 from nmigen
.sim
import Simulator
8 from openpower
.consts
import MSR
9 from openpower
.decoder
.power_enums
import MicrOp
, LDSTMode
11 from soc
.experiment
.compldst_multi
import LDSTCompUnit
12 from soc
.experiment
.pimem
import PortInterface
13 from soc
.fu
.ldst
.pipe_data
import LDSTPipeSpec
17 def __init__(self
, dut
):
20 def issue(self
, op
, zero_a
=False, imm
=None, update
=False,
21 byterev
=True, signext
=False,
22 data_len
=2, msr_pr
=0):
24 yield dut
.oper_i
.insn_type
.eq(op
)
25 yield dut
.oper_i
.data_len
.eq(data_len
)
26 yield dut
.oper_i
.zero_a
.eq(zero_a
)
27 yield dut
.oper_i
.byte_reverse
.eq(byterev
)
28 yield dut
.oper_i
.sign_extend
.eq(signext
)
30 yield dut
.oper_i
.imm_data
.data
.eq(imm
)
31 yield dut
.oper_i
.imm_data
.ok
.eq(1)
33 yield dut
.oper_i
.ldst_mode
.eq(LDSTMode
.update
)
34 yield dut
.oper_i
.msr
[MSR
.PR
].eq(msr_pr
)
35 yield dut
.issue_i
.eq(1)
37 yield dut
.issue_i
.eq(0)
38 # deactivate decoder inputs along with issue_i, so we can be sure they
39 # were latched at the correct cycle
40 yield dut
.oper_i
.insn_type
.eq(0)
41 yield dut
.oper_i
.data_len
.eq(0)
42 yield dut
.oper_i
.zero_a
.eq(0)
43 yield dut
.oper_i
.byte_reverse
.eq(0)
44 yield dut
.oper_i
.sign_extend
.eq(0)
45 yield dut
.oper_i
.imm_data
.data
.eq(0)
46 yield dut
.oper_i
.imm_data
.ok
.eq(0)
47 yield dut
.oper_i
.ldst_mode
.eq(LDSTMode
.NONE
)
48 yield dut
.oper_i
.msr
[MSR
.PR
].eq(0)
51 class TestLDSTCompUnit(unittest
.TestCase
):
53 def test_ldst_compunit(self
):
55 pi
= PortInterface(name
="pi")
56 regspec
= LDSTPipeSpec
.regspec
57 dut
= LDSTCompUnit(pi
, regspec
)
58 m
.submodules
.dut
= dut
64 yield from op
.issue(MicrOp
.OP_STORE
)
66 sim
.add_sync_process(process
)
67 sim_writer
= sim
.write_vcd("test_ldst_compunit.vcd")
72 if __name__
== '__main__':