[Libre-soc-bugs] [Bug 507] ls180 asic needs an ioring, pads need defining and connecting

bugzilla-daemon at libre-soc.org bugzilla-daemon at libre-soc.org
Thu Oct 1 12:15:50 BST 2020


https://bugs.libre-soc.org/show_bug.cgi?id=507

--- Comment #6 from Luke Kenneth Casson Leighton <lkcl at lkcl.net> ---
moving from here:
https://bugs.libre-soc.org/show_bug.cgi?id=199#c96

(In reply to Jean-Paul.Chaput from comment #96)

>     Not sure I correctly see how the wiring is organized (I'm a visual
>     guy, I understand more quickly schematics).

that is why i drew it

https://bugs.libre-soc.org/attachment.cgi?id=108

> Nevertheless, the
>     strategy here is:
> 
>     * Put everything that contains gates under ls180. It will be flat
>       placed & routed. So *below* ls180, you can have whatever
>       hierarchy you like.
> 
>     * Complex wiring between pads and core (ls180) will take place
>       inside the "corona" level (like the 'oe' signal for all pads
>       part of the same bus).

right. except - see picture i drew - JTAG has to have "control" over what goes
to the IOPads.

i have "solved" this by making JTAG part of ls180 (core) so in effect as far as
coronais concerned JTAG is like an opaque block that might as well not exist.


>     * Connexion betweens "corona" and I/O pads (that is, at "chip"
>       level) go *almost* straight (in our case, they go straight
>       because both side are symbolic layout).
> 
>     * And finally, a dedicated "router" connect the I/O pad ring
>       connectors together, including corners.

to understand this fully: is this basically exactly what the AM2901 and
experiments4 examples do?


>   NOTE: This partitionning also has the advantage to *not* include
>         the I/O pad area inside the general routing area, which
>         allows me to remove all special cases related to I/O pads
>         from Katana (and they are hellish).

:)


> >   # this is bad
> > 
> >   p_jtag_tck : pi_px       <- nooo! must be of type pck_px!
> >   port map ( ck   => cki       <- baaaad, noooo!
> >            , pad  => jtag_tck 
> >            , t    => jtag_tck_core

>   I understand. To avoid putting extra specifications, the fact that
>   there is different clocks could be directly guessed from the I/O pad
>   netlist (at "chip" level).

ah, goood.

then there are several (if we include PLL, not decided yet, it has to be ready)

* sys_clk - this is 24 mhz input
* jtag_tck - completely independent of sys_clk, also input

outputs:

* pll_48mhz, a digital divided testing signal.

must be slaved to JTAG clock:

* jtag_tms, tdo, tdi

i.e. the iopad must be this:

p_jtag_tdi : pi_px    
port map ( ck   => jtag_cki   <-currently cki!
)

without this, from what i understand, if every pad is "controlled" by cki
(which links from corona to sys_clk) then we have a problem.

likewise, for SDRAM if sys_clk is 24mhz but PLL generates 300mhz then it is
*really* bad to try to link the 24mhz sys_clk to pxlib pi_px and other IOpads.

it should really be sdram_clock


> I think it is not very difficult to
>   create disjoined parts in the I/O pad ring.

great.

>     The big question is, will each part be made of an assembly of pxlib
>   pads *or* will Staf add some other kind with different wiring
>   strategies?

Staf said he wants to stick with a drop-in pxlib.  no change to pxlib API.

i see no reason why it should change.

the only thing is, extra pxlib pck_px IOpads must be created that are NOT
connected to "default always assumed sys_clk", and the IO associated with rhrm
must also be completely independent.

this then also means that the "ring" connecting all ck, pck_px to ck pi_px etc,
must ALSO be independent and not cross-wired to each other.

* jtag_cki ring must be independent
* sdram_cki ring must be independent

actually i now realise that sys_clk 24mhz is exclusively routed to the PLL, and
it is the INTERNAL clock (300mhz from PLL) that must be connected to ioring cki
GPIO, I2C, SPI etc!

> Before I upgrade the I/O pad "router" I would need a
>   clear understanding of the I/O pads physical interface.

* PLL runs from external sys_clk, generates FASTER internal clock (300mhz) than
24mhz sys_clk
* pll_48mhz_o runs from PLL FASTER than 24mhz sys_clk 
* JTAG runs from external clock jtag_tck
* SDRAM runs from *internal* clock sdram_clock which is FASTER than sys_clk
* I2C runs from internal clock but is SLOWER than sys_clk so can be ignored
* SDMMC sd0_ck runs at 50mhz from digital divide of PLL 300mhz CLK which is
FASTER than 24mhz sys_clk

we basically need a way to say "these pins are covered by this clock".

i can set that up as a dictionary, it is easy to do from pinmux.

i think it will not be possible to determine from examining netlists, it is
defined by the designer.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


More information about the libre-soc-bugs mailing list