18
18
from luna import top_level_cli
19
19
from apollo_fpga import ApolloDebugger
20
20
from luna .gateware .interface .jtag import JTAGRegisterInterface
21
- from luna .gateware .architecture .car import LunaECP5DomainGenerator
22
- from luna .gateware .interface .psram import HyperRAMPHY , HyperRAMInterface
21
+ from luna .gateware .interface .psram import HyperRAMPHY , HyperRAMInterface , HyperRAMDQSInterface , HyperRAMDQSPHY
23
22
24
23
REGISTER_RAM_REGISTER_SPACE = 1
25
24
REGISTER_RAM_ADDR = 2
26
25
REGISTER_RAM_READ_LENGTH = 3
27
26
REGISTER_RAM_FIFO = 4
28
27
REGISTER_RAM_START = 5
29
28
29
+ DQS = False
30
+ REG_WIDTH = 32 if DQS else 16
31
+ REG_SHIFT = 16 if DQS else 0
30
32
31
33
class HyperRAMDiagnostic (Elaboratable ):
32
34
"""
@@ -37,27 +39,40 @@ class HyperRAMDiagnostic(Elaboratable):
37
39
def elaborate (self , platform ):
38
40
m = Module ()
39
41
42
+ clock_frequencies = platform .DEFAULT_CLOCK_FREQUENCIES_MHZ
43
+
44
+ #
45
+ # HyperRAM test connections.
46
+ #
47
+ if DQS :
48
+ clock_frequencies = {
49
+ "fast" : 120 ,
50
+ "sync" : 60 ,
51
+ "usb" : 60 ,
52
+ }
53
+ ram_bus = platform .request ('ram' , dir = {'rwds' :'-' , 'dq' :'-' , 'cs' :'-' })
54
+ psram_phy = HyperRAMDQSPHY (bus = ram_bus )
55
+ psram = HyperRAMDQSInterface (phy = psram_phy .phy )
56
+ else :
57
+ ram_bus = platform .request ('ram' )
58
+ psram_phy = HyperRAMPHY (bus = ram_bus )
59
+ psram = HyperRAMInterface (phy = psram_phy .phy )
60
+
61
+ m .submodules += [psram_phy , psram ]
62
+
40
63
# Generate our clock domains.
41
- clocking = LunaECP5DomainGenerator ( )
64
+ clocking = platform . clock_domain_generator ( clock_frequencies = clock_frequencies )
42
65
m .submodules .clocking = clocking
43
66
44
67
# Create a set of registers...
45
68
registers = JTAGRegisterInterface (address_size = 7 , default_read_value = 0xDEADBEEF )
46
69
m .submodules .registers = registers
47
70
48
- #
49
- # HyperRAM test connections.
50
- #
51
- ram_bus = platform .request ('ram' )
52
- psram_phy = HyperRAMPHY (bus = ram_bus )
53
- psram = HyperRAMInterface (phy = psram_phy .phy )
54
- m .submodules += [psram_phy , psram ]
55
-
56
71
psram_address = registers .add_register (REGISTER_RAM_ADDR )
57
72
read_length = registers .add_register (REGISTER_RAM_READ_LENGTH , reset = 1 )
58
73
59
- m .submodules .read_fifo = read_fifo = SyncFIFO (width = 16 , depth = 32 )
60
- m .submodules .write_fifo = write_fifo = SyncFIFO (width = 16 , depth = 32 )
74
+ m .submodules .read_fifo = read_fifo = SyncFIFO (width = REG_WIDTH , depth = 32 )
75
+ m .submodules .write_fifo = write_fifo = SyncFIFO (width = REG_WIDTH , depth = 32 )
61
76
registers .add_sfr (REGISTER_RAM_FIFO ,
62
77
read = read_fifo .r_data ,
63
78
read_strobe = read_fifo .r_en ,
@@ -123,7 +138,10 @@ def elaborate(self, platform):
123
138
dut = ApolloDebugger ()
124
139
logging .info (f"Connected to onboard dut; hardware revision r{ dut .major } .{ dut .minor } (s/n: { dut .serial_number } )." )
125
140
126
- logging .info ("Running basic HyperRAM diagnostics." )
141
+ if DQS :
142
+ logging .info ("Running basic HyperRAM diagnostics, using DQS implementation." )
143
+ else :
144
+ logging .info ("Running basic HyperRAM diagnostics." )
127
145
128
146
iterations = 1
129
147
@@ -136,7 +154,7 @@ def read_hyperram_register(addr):
136
154
dut .registers .register_write (REGISTER_RAM_ADDR , addr )
137
155
dut .registers .register_read (REGISTER_RAM_START )
138
156
time .sleep (0.1 )
139
- return dut .registers .register_read (REGISTER_RAM_FIFO )
157
+ return dut .registers .register_read (REGISTER_RAM_FIFO ) >> REG_SHIFT
140
158
141
159
def test_id_read ():
142
160
return read_hyperram_register (0x0 ) in (0x0c81 , 0x0c86 )
@@ -147,7 +165,7 @@ def test_config_read():
147
165
def test_mem_readback ():
148
166
dut .registers .register_write (REGISTER_RAM_REGISTER_SPACE , 0 )
149
167
150
- data = [random .randint (0 , int (2 ** 16 )) for _ in range (10 )]
168
+ data = [random .randint (0 , int (2 ** REG_WIDTH )) for _ in range (10 )]
151
169
152
170
# Fill write FIFO.
153
171
for d in data :
0 commit comments