Run autopep8
[gram.git] / gram / dfii.py
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>
4 # License: BSD
5
6 from nmigen import *
7
8 from gram.phy import dfi
9 from gram.compat import CSRPrefixProxy
10 from lambdasoc.periph import Peripheral
11
12 # PhaseInjector ------------------------------------------------------------------------------------
13
14
15 class PhaseInjector(Elaboratable):
16 def __init__(self, csr_bank, phase):
17 self._command = csr_bank.csr(6, "rw")
18 self._command_issue = csr_bank.csr(1, "rw")
19 self._address = csr_bank.csr(len(phase.address), "rw")
20 self._baddress = csr_bank.csr(len(phase.bank), "rw")
21 self._wrdata = csr_bank.csr(len(phase.wrdata), "rw")
22 self._rddata = csr_bank.csr(len(phase.rddata), "rw")
23
24 self._phase = phase
25
26 def elaborate(self, platform):
27 m = Module()
28
29 m.d.comb += [
30 self._phase.address.eq(self._address.r_data),
31 self._phase.bank.eq(self._baddress.r_data),
32 self._phase.wrdata_en.eq(
33 self._command_issue.r_stb & self._command.r_data[4]),
34 self._phase.rddata_en.eq(
35 self._command_issue.r_stb & self._command.r_data[5]),
36 self._phase.wrdata.eq(self._wrdata.r_data),
37 self._phase.wrdata_mask.eq(0)
38 ]
39
40 with m.If(self._command_issue.r_stb):
41 m.d.comb += [
42 self._phase.cs_n.eq(
43 Repl(value=~self._command.r_data[0], count=len(self._phase.cs_n))),
44 self._phase.we_n.eq(~self._command.r_data[1]),
45 self._phase.cas_n.eq(~self._command.r_data[2]),
46 self._phase.ras_n.eq(~self._command.r_data[3]),
47 ]
48 with m.Else():
49 m.d.comb += [
50 self._phase.cs_n.eq(
51 Repl(value=1, count=len(self._phase.cs_n))),
52 self._phase.we_n.eq(1),
53 self._phase.cas_n.eq(1),
54 self._phase.ras_n.eq(1),
55 ]
56
57 with m.If(self._phase.rddata_valid):
58 m.d.sync += self._rddata.w_data.eq(self._phase.rddata)
59
60 return m
61
62 # DFIInjector --------------------------------------------------------------------------------------
63
64
65 class DFIInjector(Elaboratable):
66 def __init__(self, csr_bank, addressbits, bankbits, nranks, databits, nphases=1):
67 self._nranks = nranks
68
69 self._inti = dfi.Interface(
70 addressbits, bankbits, nranks, databits, nphases)
71 self.slave = dfi.Interface(
72 addressbits, bankbits, nranks, databits, nphases)
73 self.master = dfi.Interface(
74 addressbits, bankbits, nranks, databits, nphases)
75
76 self._control = csr_bank.csr(4, "rw") # sel, cke, odt, reset_n
77
78 self._phases = []
79 for n, phase in enumerate(self._inti.phases):
80 self._phases += [PhaseInjector(CSRPrefixProxy(csr_bank,
81 "p{}".format(n)), phase)]
82
83 def elaborate(self, platform):
84 m = Module()
85
86 m.submodules += self._phases
87
88 with m.If(self._control.r_data[0]):
89 m.d.comb += self.slave.connect(self.master)
90 with m.Else():
91 m.d.comb += self._inti.connect(self.master)
92
93 for i in range(self._nranks):
94 m.d.comb += [phase.cke[i].eq(self._control.r_data[1])
95 for phase in self._inti.phases]
96 m.d.comb += [phase.odt[i].eq(self._control.r_data[2])
97 for phase in self._inti.phases if hasattr(phase, "odt")]
98 m.d.comb += [phase.reset_n.eq(self._control.r_data[3])
99 for phase in self._inti.phases if hasattr(phase, "reset_n")]
100
101 return m