1 # Test of HyperRAM class
3 # Copyright (c) 2019 Florent Kermarrec <florent@enjoy-digital.fr>
4 # Copyright (c) 2021 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
6 # Based on code from Kermarrec, Licensed BSD-2-Clause
8 # Modifications for the Libre-SOC Project funded by NLnet and NGI POINTER
9 # under EU Grants 871528 and 957073, under the LGPLv3+ License
13 from nmigen
import (Record
, Module
, Signal
, Elaboratable
)
14 from nmigen
.compat
.sim
import run_simulation
16 from lambdasoc
.periph
.hyperram
import HyperRAM
, HyperRAMPads
, HyperRAMPHY
19 return {"-": 1, "_": 0}[c
]
22 def wb_write(bus
, addr
, data
, sel
):
23 yield bus
.adr
.eq(addr
)
24 yield bus
.dat_w
.eq(data
)
30 while not (yield bus
.ack
):
36 def wb_read(bus
, addr
, sel
):
37 yield bus
.adr
.eq(addr
)
42 while not (yield bus
.ack
):
47 return (yield bus
.dat_r
)
50 class TestHyperBusWrite(unittest
.TestCase
):
52 def test_hyperram_write(self
):
54 yield from wb_write(dut
.bus
, 0x1234, 0xdeadbeef, sel
=0b1001)
57 def hyperram_gen(dut
):
58 clk
= "___--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--_______"
59 cs_n
= "--________________________________________________________________------"
60 dq_oe
= "__------------____________________________________________--------______"
61 dq_o
= "002000048d000000000000000000000000000000000000000000000000deadbeef000000"
62 rwds_oe
= "__________________________________________________________--------______"
63 rwds_o
= "____________________________________________________________----________"
67 if False: # useful for printing out expected vs results
68 for i
in range(len(clk
)):
70 print ("clk", c2bool(clk
[i
]), (yield dut
.phy
.pads
.clk
))
71 print ("cs_n", c2bool(cs_n
[i
]), (yield dut
.phy
.pads
.cs_n
))
72 print ("dq_oe", c2bool(dq_oe
[i
]), (yield dut
.phy
.pads
.dq
.oe
))
73 print ("dq_o", hex(int(dq_o
[2*(i
//2):2*(i
//2)+2], 16)),
74 hex((yield dut
.phy
.pads
.dq
.o
)))
75 print ("rwds_oe", c2bool(rwds_oe
[i
]),
76 (yield dut
.phy
.pads
.rwds
.oe
))
77 print ("rwds_o", c2bool(rwds_o
[i
]),
78 (yield dut
.phy
.pads
.rwds
.o
))
80 for i
in range(len(clk
)):
81 self
.assertEqual(c2bool(clk
[i
]), (yield dut
.phy
.pads
.clk
))
82 self
.assertEqual(c2bool(cs_n
[i
]), (yield dut
.phy
.pads
.cs_n
))
83 self
.assertEqual(c2bool(dq_oe
[i
]), (yield dut
.phy
.pads
.dq
.oe
))
84 self
.assertEqual(int(dq_o
[2*(i
//2):2*(i
//2)+2], 16),
85 (yield dut
.phy
.pads
.dq
.o
))
86 self
.assertEqual(c2bool(rwds_oe
[i
]),
87 (yield dut
.phy
.pads
.rwds
.oe
))
88 self
.assertEqual(c2bool(rwds_o
[i
]),
89 (yield dut
.phy
.pads
.rwds
.o
))
92 dut
= HyperRAM(io
=HyperRAMPads(), phy_kls
=HyperRAMPHY
)
93 run_simulation(dut
, [fpga_gen(dut
), hyperram_gen(dut
)],
96 def test_hyperram_read(self
):
98 dat
= yield from wb_read(dut
.bus
, 0x1234, 0b1111)
99 self
.assertEqual(dat
, 0xdeadbeef)
100 dat
= yield from wb_read(dut
.bus
, 0x1235, 0b1111)
101 self
.assertEqual(dat
, 0xcafefade)
103 def hyperram_gen(dut
):
104 clk
= "___--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--_"
105 cs_n
= "--________________________________________________________________________________"
106 dq_oe
= "__------------____________________________________________________________________"
107 dq_o
= "00a000048d000000000000000000000000000000000000000000000000000000000000000000000000"
108 dq_i
= "0000000000000000000000000000000000000000000000000000000000deadbeefcafefade00000000"
109 rwds_oe
= "__________________________________________________________________________________"
114 for i
in range(len(clk
)):
116 yield dut
.phy
.pads
.dq
.i
.eq(int(dq_i
[2*(i
//2):2*(i
//2)+2], 16))
117 print ("clk", c2bool(clk
[i
]), (yield dut
.phy
.pads
.clk
))
118 print ("cs_n", c2bool(cs_n
[i
]), (yield dut
.phy
.pads
.cs_n
))
121 self
.assertEqual(c2bool(clk
[i
]), (yield dut
.phy
.pads
.clk
))
122 self
.assertEqual(c2bool(cs_n
[i
]), (yield dut
.phy
.pads
.cs_n
))
123 self
.assertEqual(c2bool(dq_oe
[i
]), (yield dut
.phy
.pads
.dq
.oe
))
124 self
.assertEqual(int(dq_o
[2*(i
//2):2*(i
//2)+2], 16),
125 (yield dut
.phy
.pads
.dq
.o
))
126 self
.assertEqual(c2bool(rwds_oe
[i
]),
127 (yield dut
.phy
.pads
.rwds
.oe
))
130 dut
= HyperRAM(io
=HyperRAMPads(), phy_kls
=HyperRAMPHY
)
131 run_simulation(dut
, [fpga_gen(dut
), hyperram_gen(dut
)],
132 vcd_name
="rd_sim.vcd")
135 class TestHyperBusRead(unittest
.TestCase
):
136 def test_hyperram_read(self
):
138 dat
= yield from wb_read(dut
.bus
, 0x1234, 0b1111)
139 self
.assertEqual(dat
, 0xdeadbeef)
140 dat
= yield from wb_read(dut
.bus
, 0x1235, 0b1111)
141 self
.assertEqual(dat
, 0xcafefade)
148 def hyperram_gen(dut
):
149 clk
= "___--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--_"
150 cs_n
= "--________________________________________________________________________________"
151 dq_oe
= "__------------____________________________________________________________________"
152 dq_o
= "00a000048d000000000000000000000000000000000000000000000000000000000000000000000000"
153 dq_i
= "0000000000000000000000000000000000000000000000000000000000deadbeefcafefade00000000"
154 rwds_oe
= "__________________________________________________________________________________"
159 for i
in range(len(clk
)):
161 yield dut
.phy
.pads
.dq
.i
.eq(int(dq_i
[2*(i
//2):2*(i
//2)+2], 16))
162 print ("clk", c2bool(clk
[i
]), (yield dut
.phy
.pads
.clk
))
163 print ("cs_n", c2bool(cs_n
[i
]), (yield dut
.phy
.pads
.cs_n
))
164 print ("dq_oe", c2bool(dq_oe
[i
]), (yield dut
.phy
.pads
.dq
.oe
))
165 print ("dq_o", hex(int(dq_o
[2*(i
//2):2*(i
//2)+2], 16)),
166 hex((yield dut
.phy
.pads
.dq
.o
)))
167 print ("rwds_oe", c2bool(rwds_oe
[i
]),
168 (yield dut
.phy
.pads
.rwds
.oe
))
169 self
.assertEqual(c2bool(clk
[i
]), (yield dut
.phy
.pads
.clk
))
170 self
.assertEqual(c2bool(cs_n
[i
]), (yield dut
.phy
.pads
.cs_n
))
171 self
.assertEqual(c2bool(dq_oe
[i
]), (yield dut
.phy
.pads
.dq
.oe
))
172 self
.assertEqual(int(dq_o
[2*(i
//2):2*(i
//2)+2], 16),
173 (yield dut
.phy
.pads
.dq
.o
))
174 self
.assertEqual(c2bool(rwds_oe
[i
]),
175 (yield dut
.phy
.pads
.rwds
.oe
))
178 dut
= HyperRAM(io
=HyperRAMPads(), phy_kls
=HyperRAMPHY
)
179 run_simulation(dut
, [fpga_gen(dut
), hyperram_gen(dut
)],
180 vcd_name
="rd_sim.vcd")
182 if __name__
== '__main__':
184 #t = TestHyperBusRead()
185 #t.test_hyperram_read()
186 #t = TestHyperBusWrite()
187 #t.test_hyperram_write()