2 from lambdasoc
.periph
import Peripheral
4 from gram
.dfii
import *
5 from gram
.phy
.dfi
import Interface
8 # Phase injector CSR addresses
10 PI_COMMAND_ISSUE_ADDR
= 0x04
11 PI_ADDRESS_ADDR
= 0x08
12 PI_BADDRESS_ADDR
= 0x0C
16 # DFI injector CSR addresses
17 DFII_CONTROL_ADDR
= 0x00
19 class CSRHost(Peripheral
, Elaboratable
):
20 def __init__(self
, name
="csrhost"):
21 super().__init
__(name
=name
)
22 self
.bank
= self
.csr_bank()
24 def init_bridge(self
):
25 self
._bridge
= self
.bridge(data_width
=32, granularity
=8, alignment
=2)
26 self
.bus
= self
._bridge
.bus
28 def elaborate(self
, platform
):
30 m
.submodules
+= self
._bridge
33 class PhaseInjectorTestCase(FHDLTestCase
):
34 def generate_phaseinjector(self
):
35 dfi
= Interface(12, 8, 1, 8, 1)
37 dut
= PhaseInjector(csrhost
.bank
, dfi
.phases
[0])
40 m
.submodules
+= csrhost
43 return (m
, dfi
, csrhost
)
45 def test_initialstate(self
):
46 m
, dfi
, csrhost
= self
.generate_phaseinjector()
49 self
.assertTrue((yield dfi
.phases
[0].cas_n
))
50 self
.assertTrue((yield dfi
.phases
[0].ras_n
))
51 self
.assertTrue((yield dfi
.phases
[0].we_n
))
52 self
.assertTrue((yield dfi
.phases
[0].act_n
))
54 runSimulation(m
, process
, "test_phaseinjector.vcd")
56 def test_setaddress(self
):
57 m
, dfi
, csrhost
= self
.generate_phaseinjector()
60 yield from wb_write(csrhost
.bus
, PI_ADDRESS_ADDR
>> 2, 0xCDC, sel
=0xF)
61 self
.assertEqual((yield dfi
.phases
[0].address
), 0xCDC)
63 runSimulation(m
, process
, "test_phaseinjector.vcd")
65 def test_setbankaddress(self
):
66 m
, dfi
, csrhost
= self
.generate_phaseinjector()
69 yield from wb_write(csrhost
.bus
, PI_BADDRESS_ADDR
>> 2, 0xA8, sel
=0xF)
70 self
.assertEqual((yield dfi
.phases
[0].bank
), 0xA8)
72 runSimulation(m
, process
, "test_phaseinjector.vcd")
74 def test_setwrdata(self
):
75 m
, dfi
, csrhost
= self
.generate_phaseinjector()
78 yield from wb_write(csrhost
.bus
, PI_WRDATA_ADDR
>> 2, 0xCC, sel
=0xF)
79 self
.assertEqual((yield dfi
.phases
[0].wrdata
), 0xCC)
81 runSimulation(m
, process
, "test_phaseinjector.vcd")
83 def test_wrdata_en(self
):
84 m
, dfi
, csrhost
= self
.generate_phaseinjector()
86 m
.submodules
.pc
= pc
= PulseCounter()
87 m
.d
.comb
+= pc
.i
.eq(dfi
.phases
[0].wrdata_en
)
90 yield from wb_write(csrhost
.bus
, PI_COMMAND_ADDR
>> 2, (1 << 4), sel
=0xF)
92 yield from wb_write(csrhost
.bus
, PI_COMMAND_ISSUE_ADDR
>> 2, 1, sel
=0xF)
93 self
.assertEqual((yield pc
.cnt
), 1)
95 yield from wb_write(csrhost
.bus
, PI_COMMAND_ISSUE_ADDR
>> 2, 1, sel
=0xF)
96 self
.assertEqual((yield pc
.cnt
), 2)
99 runSimulation(m
, process
, "test_phaseinjector.vcd")