7e58b990ba68a8a254d892201dafc2252128762d
1 # This file is Copyright (c) 2015 Sebastien Bourdeauducq <sb@m-labs.hk>
2 # This file is Copyright (c) 2020 LambdaConcept <contact@lambdaconcept.com>
5 from nmigen
.hdl
.rec
import *
7 __ALL__
= ["Interface"]
10 def phase_description(addressbits
, bankbits
, nranks
, databits
):
13 ("address", addressbits
, DIR_FANOUT
),
14 ("bank", bankbits
, DIR_FANOUT
),
15 ("cas", 1, DIR_FANOUT
),
16 ("cs", nranks
, DIR_FANOUT
),
17 ("ras", 1, DIR_FANOUT
),
18 ("we", 1, DIR_FANOUT
),
19 ("clk_en", nranks
, DIR_FANOUT
),
20 ("odt", nranks
, DIR_FANOUT
),
21 ("reset", 1, DIR_FANOUT
),
22 ("act", 1, DIR_FANOUT
),
24 ("wrdata", databits
, DIR_FANOUT
),
25 ("wrdata_en", 1, DIR_FANOUT
),
26 ("wrdata_mask", databits
//8, DIR_FANOUT
),
28 ("rddata_en", 1, DIR_FANOUT
),
29 ("rddata", databits
, DIR_FANIN
),
30 ("rddata_valid", 1, DIR_FANIN
),
35 def __init__(self
, addressbits
, bankbits
, nranks
, databits
, nphases
=1):
37 for p
in range(nphases
):
38 p
= Record(phase_description(
39 addressbits
, bankbits
, nranks
, databits
))
43 def connect(self
, target
):
44 if not isinstance(target
, Interface
):
45 raise TypeError("Target must be an instance of Interface, not {!r}"
49 for i
in range(min(len(self
.phases
), len(target
.phases
))):
50 ret
+= [self
.phases
[i
].connect(target
.phases
[i
])]