1 # This file is Copyright (c) 2015 Sebastien Bourdeauducq <sb@m-labs.hk>
2 # This file is Copyright (c) 2016-2019 Florent Kermarrec <florent@enjoy-digital.fr>
3 # This file is Copyright (c) 2020 LambdaConcept <contact@lambdaconcept.com>
8 from gram
.phy
import dfi
9 from lambdasoc
.periph
import Peripheral
11 # PhaseInjector ------------------------------------------------------------------------------------
13 class PhaseInjector(Peripheral
, Elaboratable
):
14 def __init__(self
, phase
):
15 bank
= self
.csr_bank()
16 self
._command
= bank
.csr(6, "rw")
17 self
._command
_issue
= bank
.csr(1, "rw")
18 self
._address
= bank
.csr(len(phase
.address
), "rw", reset_less
=True)
19 self
._baddress
= bank
.csr(len(phase
.bank
), "rw", reset_less
=True)
20 self
._wrdata
= bank
.csr(len(phase
.wrdata
), "rw", reset_less
=True)
21 self
._rddata
= bank
.csr(len(phase
.rddata
))
23 def elaborate(self
, platform
):
27 phase
.address
.eq(self
._address
.storage
),
28 phase
.bank
.eq(self
._baddress
.storage
),
29 phase
.wrdata_en
.eq(self
._command
_issue
.re
& self
._command
.storage
[4]),
30 phase
.rddata_en
.eq(self
._command
_issue
.re
& self
._command
.storage
[5]),
31 phase
.wrdata
.eq(self
._wrdata
.storage
),
32 phase
.wrdata_mask
.eq(0)
35 with m
.If(self
._command
_issue
.re
):
37 phase
.cs_n
.eq(Replicate(~self
._command
.storage
[0], len(phase
.cs_n
))),
38 phase
.we_n
.eq(~self
._command
.storage
[1]),
39 phase
.cas_n
.eq(~self
._command
.storage
[2]),
40 phase
.ras_n
.eq(~self
._command
.storage
[3]),
44 phase
.cs_n
.eq(Replicate(1, len(phase
.cs_n
))),
50 with m
.If(phase
.rddata_valid
):
51 m
.d
.sync
+= self
._rddata
.status
.eq(phase
.rddata
)
55 # DFIInjector --------------------------------------------------------------------------------------
57 class DFIInjector(Peripheral
, Elaboratable
):
58 def __init__(self
, addressbits
, bankbits
, nranks
, databits
, nphases
=1):
59 self
._inti
= dfi
.Interface(addressbits
, bankbits
, nranks
, databits
, nphases
)
60 self
.slave
= dfi
.Interface(addressbits
, bankbits
, nranks
, databits
, nphases
)
61 self
.master
= dfi
.Interface(addressbits
, bankbits
, nranks
, databits
, nphases
)
63 bank
= self
.csr_bank()
64 self
._control
= bank
.csr(4) # sel, cke, odt, reset_n
66 #for n, phase in enumerate(inti.phases):
67 # setattr(self.submodules, "pi" + str(n), PhaseInjector(phase)) TODO
71 def elaborate(self
, platform
):
74 with m
.If(self
._control
.storage
[0]):
75 m
.d
.comb
+= self
.slave
.connect(self
.master
)
77 m
.d
.comb
+= self
._inti
.connect(self
.master
)
79 for i
in range(nranks
):
80 m
.d
.comb
+= [phase
.cke
[i
].eq(self
._control
.storage
[1]) for phase
in self
._inti
.phases
]
81 m
.d
.comb
+= [phase
.odt
[i
].eq(self
._control
.storage
[2]) for phase
in self
._inti
.phases
if hasattr(phase
, "odt")]
82 m
.d
.comb
+= [phase
.reset_n
.eq(self
._control
.storage
[3]) for phase
in self
._inti
.phases
if hasattr(phase
, "reset_n")]