1 from nmigen
import Module
, Signal
, Elaboratable
2 from nmigen
.asserts
import Assert
, AnyConst
3 from nmigen
.test
.utils
import FHDLTestCase
5 from soc
.decoder
.power_decoder
import create_pdecode
, PowerOp
6 from soc
.decoder
.power_enums
import (In1Sel
, In2Sel
, In3Sel
,
8 from soc
.decoder
.power_decoder2
import (PowerDecode2
,
12 class Driver(Elaboratable
):
17 def elaborate(self
, platform
):
19 self
.comb
= self
.m
.d
.comb
20 instruction
= Signal(32)
22 self
.comb
+= instruction
.eq(AnyConst(32))
24 pdecode
= create_pdecode()
26 self
.m
.submodules
.pdecode2
= pdecode2
= PowerDecode2(pdecode
)
27 self
.comb
+= pdecode2
.dec
.opcode_in
.eq(instruction
)
29 self
.test_in1(pdecode2
, pdecode
)
35 def test_in1(self
, pdecode2
, pdecode
):
39 with m
.If(pdecode
.op
.in1_sel
== In1Sel
.RA
):
40 comb
+= Assert(pdecode2
.e
.read_reg1
.data
== ra
)
41 comb
+= Assert(pdecode2
.e
.read_reg1
.ok
== 1)
42 with m
.If(pdecode
.op
.in1_sel
== In1Sel
.RA_OR_ZERO
):
44 comb
+= Assert(pdecode2
.e
.read_reg1
.ok
== 0)
46 comb
+= Assert(pdecode2
.e
.read_reg1
.data
== ra
)
47 comb
+= Assert(pdecode2
.e
.read_reg1
.ok
== 1)
48 op
= pdecode
.op
.internal_op
49 with m
.If((op
== InternalOp
.OP_BC
) |
50 (op
== InternalOp
.OP_BCREG
)):
51 with m
.If(~pdecode
.BO
[2]):
52 comb
+= Assert(pdecode2
.e
.read_spr1
.data
== SPR
.CTR
)
53 comb
+= Assert(pdecode2
.e
.read_spr1
.ok
== 1)
54 with m
.If((op
== InternalOp
.OP_MFSPR
) |
55 (op
== InternalOp
.OP_MTSPR
)):
56 comb
+= Assert(pdecode2
.e
.read_spr1
.data
==
58 comb
+= Assert(pdecode2
.e
.read_spr1
.ok
== 1)
63 pdecode2
= m
.submodules
.pdecode2
65 with m
.If(dec
.op
.in2_sel
== In2Sel
.RB
):
66 comb
+= Assert(pdecode2
.e
.read_reg2
.ok
== 1)
67 comb
+= Assert(pdecode2
.e
.read_reg2
.data
==
69 with m
.Elif(dec
.op
.in2_sel
== In2Sel
.NONE
):
70 comb
+= Assert(pdecode2
.e
.imm_data
.ok
== 0)
71 comb
+= Assert(pdecode2
.e
.read_reg2
.ok
== 0)
72 with m
.Elif(dec
.op
.in2_sel
== In2Sel
.SPR
):
73 comb
+= Assert(pdecode2
.e
.imm_data
.ok
== 0)
74 comb
+= Assert(pdecode2
.e
.read_reg2
.ok
== 0)
75 comb
+= Assert(pdecode2
.e
.read_spr2
.ok
== 1)
76 with m
.If(dec
.FormXL
.XO
[9]):
77 comb
+= Assert(pdecode2
.e
.read_spr2
.data
== SPR
.CTR
)
79 comb
+= Assert(pdecode2
.e
.read_spr2
.data
== SPR
.LR
)
81 comb
+= Assert(pdecode2
.e
.imm_data
.ok
== 1)
82 with m
.Switch(dec
.op
.in2_sel
):
83 with m
.Case(In2Sel
.CONST_UI
):
84 comb
+= Assert(pdecode2
.e
.imm_data
.data
== dec
.UI
[0:-1])
85 with m
.Case(In2Sel
.CONST_SI
):
86 comb
+= Assert(pdecode2
.e
.imm_data
.data
== dec
.SI
[0:-1])
87 with m
.Case(In2Sel
.CONST_UI_HI
):
88 comb
+= Assert(pdecode2
.e
.imm_data
.data
==
90 with m
.Case(In2Sel
.CONST_SI_HI
):
91 comb
+= Assert(pdecode2
.e
.imm_data
.data
==
93 with m
.Case(In2Sel
.CONST_LI
):
94 comb
+= Assert(pdecode2
.e
.imm_data
.data
==
96 with m
.Case(In2Sel
.CONST_BD
):
97 comb
+= Assert(pdecode2
.e
.imm_data
.data
==
99 with m
.Case(In2Sel
.CONST_DS
):
100 comb
+= Assert(pdecode2
.e
.imm_data
.data
==
102 with m
.Case(In2Sel
.CONST_M1
):
103 comb
+= Assert(pdecode2
.e
.imm_data
.data
== ~
0)
104 with m
.Case(In2Sel
.CONST_SH
):
105 comb
+= Assert(pdecode2
.e
.imm_data
.data
== dec
.sh
[0:-1])
106 with m
.Case(In2Sel
.CONST_SH32
):
107 comb
+= Assert(pdecode2
.e
.imm_data
.data
== dec
.SH32
[0:-1])
114 pdecode2
= m
.submodules
.pdecode2
115 with m
.If(pdecode2
.dec
.op
.in3_sel
== In3Sel
.RS
):
116 comb
+= Assert(pdecode2
.e
.read_reg3
.ok
== 1)
117 comb
+= Assert(pdecode2
.e
.read_reg3
.data
==
118 pdecode2
.dec
.RS
[0:-1])
121 class Decoder2TestCase(FHDLTestCase
):
122 def test_decoder2(self
):
124 self
.assertFormal(module
, mode
="bmc", depth
=4)
126 if __name__
== '__main__':