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
))
53 self
.assertFalse((yield dfi
.phases
[0].wrdata_mask
))
55 runSimulation(m
, process
, "test_phaseinjector.vcd")
57 def test_setaddress(self
):
58 m
, dfi
, csrhost
= self
.generate_phaseinjector()
61 yield from wb_write(csrhost
.bus
, PI_ADDRESS_ADDR
>> 2, 0xCDC, sel
=0xF)
62 self
.assertEqual((yield dfi
.phases
[0].address
), 0xCDC)
64 runSimulation(m
, process
, "test_phaseinjector.vcd")
66 def test_setbankaddress(self
):
67 m
, dfi
, csrhost
= self
.generate_phaseinjector()
70 yield from wb_write(csrhost
.bus
, PI_BADDRESS_ADDR
>> 2, 0xA8, sel
=0xF)
71 self
.assertEqual((yield dfi
.phases
[0].bank
), 0xA8)
73 runSimulation(m
, process
, "test_phaseinjector.vcd")
75 def test_setwrdata(self
):
76 m
, dfi
, csrhost
= self
.generate_phaseinjector()
79 yield from wb_write(csrhost
.bus
, PI_WRDATA_ADDR
>> 2, 0xCC, sel
=0xF)
80 self
.assertEqual((yield dfi
.phases
[0].wrdata
), 0xCC)
82 runSimulation(m
, process
, "test_phaseinjector.vcd")
84 def test_wrdata_en(self
):
85 m
, dfi
, csrhost
= self
.generate_phaseinjector()
87 m
.submodules
.pc
= pc
= PulseCounter()
88 m
.d
.comb
+= pc
.i
.eq(dfi
.phases
[0].wrdata_en
)
91 yield from wb_write(csrhost
.bus
, PI_COMMAND_ADDR
>> 2, (1 << 4), sel
=0xF)
93 yield from wb_write(csrhost
.bus
, PI_COMMAND_ISSUE_ADDR
>> 2, 1, sel
=0xF)
94 self
.assertEqual((yield pc
.cnt
), 1)
96 yield from wb_write(csrhost
.bus
, PI_COMMAND_ISSUE_ADDR
>> 2, 1, sel
=0xF)
97 self
.assertEqual((yield pc
.cnt
), 2)
99 runSimulation(m
, process
, "test_phaseinjector.vcd")
101 def test_rddata_en(self
):
102 m
, dfi
, csrhost
= self
.generate_phaseinjector()
104 m
.submodules
.pc
= pc
= PulseCounter()
105 m
.d
.comb
+= pc
.i
.eq(dfi
.phases
[0].rddata_en
)
108 yield from wb_write(csrhost
.bus
, PI_COMMAND_ADDR
>> 2, (1 << 5), sel
=0xF)
110 yield from wb_write(csrhost
.bus
, PI_COMMAND_ISSUE_ADDR
>> 2, 1, sel
=0xF)
111 self
.assertEqual((yield pc
.cnt
), 1)
113 yield from wb_write(csrhost
.bus
, PI_COMMAND_ISSUE_ADDR
>> 2, 1, sel
=0xF)
114 self
.assertEqual((yield pc
.cnt
), 2)
116 runSimulation(m
, process
, "test_phaseinjector.vcd")