
This Tiny Tapeout chip is a test chip for a QuickBus implementation, plus it's a second attempt at the Sky PLL taped out too quickly in Sky26b, this one should support a wider range of frequencies, hopefully up to 350MHz.
QuickBus is a prototype on-board chip to chip bus, think of it as SPI but up to 100 times faster - it's a 4-wire bus 2 bits each way with LVDS signalling. In this case the upstream and downstream are both in the same TT tile, no actual LVDS but full speed data tests, and tests for handling swapped LVDS pins.
The PLL looks like this

On the left hand side are Sky HS logic blocks, they include a programmable clock scaler (a 4 bit down counter set by the COUNT_* pins), a reset logic that looks for clock stability and after detecting 16 good clocks asserts RESET_OUT_N, and a phase detector that compares the output of the clock scaler with a reference clock and drives the charge pump.
On the right are the analog blocks. Along the bottom is a variable frequency oscillator (VCO), 5 stages, Top left is the charge pump that drives the VCTRL output voltage into the oscillator. The 4 large square boxes to the right are capacitors charged from VCTRL through a long poly resistor that snakes the width of the block. The 2 small square boxes to the right are a smaller capacitor also on VCTRL.. The other 2 caps are decoupling caps for the charge pump.
The resulting block is intended to be a drop in to Sky TT projects, Its interface is very simple, inputs are:
Outputs are:
With the reference clock set to 25MHz these frequencies should be possible, anything after ~300MHz may not be real (out of the range of the VCO)
| COUNT | multiplier | CLK Freq |
|---|---|---|
| 0001 | 2 | 50MHz |
| 0010 | 3 | 75MHz |
| 0011 | 4 | 100MHz |
| 0100 | 5 | 125MHz |
| 0101 | 6 | 150MHz |
| 0110 | 7 | 175MHz |
| 0111 | 8 | 200MHz |
| 1000 | 9 | 225MHz |
| 1001 | 10 | 250MHz |
| 1010 | 11 | 275MHz |
| 1011 | 12 | 300MHz |
| 1100 | 13 | 325MHz* |
| 1101 | 14 | 350MHz* |
| 1110 | 15 | 375MHz* |
With a divides by 2 reference clock set to 12.5MHz these frequencies should be possible, number under 50MHz may be out of the range of the VCO)
| COUNT | multiplier | CLK Freq |
|---|---|---|
| 0001 | 2 | 25MHz* |
| 0010 | 3 | 37.5MHz* |
| 0011 | 4 | 50MHz |
| 0100 | 5 | 62.5MHz |
| 0101 | 6 | 75MHz |
| 0110 | 7 | 87.5MHz |
| 0111 | 8 | 100MHz |
| 1000 | 9 | 112.5MHz |
| 1001 | 10 | 125MHz |
| 1010 | 11 | 137.5MHz |
| 1011 | 12 | 150MHz |
| 1100 | 13 | 162.5MHz |
| 1101 | 14 | 175MHz |
| 1110 | 15 | 187.5MHz |
| 1111 | 15 | 200MHz |
Basic QuickBus looks like this

A QuickBus connects two chips over LVDS, it has an upstream chip and a downstream chip, if you want to compare it with SPI Upstream is 'M' and Downstream is 'S'. Upstream is in charge, Downstream responds.
Upstream has a PLL it sets the frequency for both sides, data is sent at all times even when idle, on the Downstream side is a Clock Data Recovery unit (essentially a PLL locked to the incoming data stream) downstream runs on the recovered clock (essentially the PLL's clock with some jitter and an arbitrary delay).
Data is sent/received using the standard 8b10 NRZ encoding - this sends 8 bits of data and a handful of framing symbols in 10 bits of on-wire data with a guaranteed number of edges to keep the CDR running. 8B10 has some minor error detection facilities, these are reported to the next layer up.
Data sent from Downstream to Upstream is sent with the Recovered Clock and received with the PLL clock, these are the same frequency clock - with a bit of jitter and an arbitrary delay (might be several bit times) - the Deskew is a variable length delay line and a phase detector that deals with the subbit-delay (and some jitter) followed by a variable length shift register to align the incoming symbols with outgoing ones.
On both sides a byte clock is generated (intended to be used by all the logic below the) this is the green arrows showed on the diagram above it is 1/10 the frequency of the PLL, both sides have the same clock, they have an arbitrary phase relationship.
The "Byte interface" is actually 9 bits, 8 data 'D' bits and a 'K' bit, if K is 0 the data is normal data, if it's a 1 then it's one of the standard 8b10 framing symbols, on reception K==1 and D==00 means an error.
Sitting above the bit framer and clock management is a management unit:

The management unit handles link startup, frequency negotiation, bus driver optimization and reversing miswired buses. It also handles error recovery, and (eventually) hot staging. When not in use it steps out of the way of the next level protocols.
The byte level interface is the same on both sides, it looks like:
System:
Outgoing (outputs):
Incoming (inputs):
TBD - an upper level protocol for register/memory access (similar to existing SPI systems).
(may or may not get this in to TT this time)
The basic idea here is that one Upstream node could talk to multiple Downstream nodes, sharing a single downstream data pair but each with a unique upstream pair for responses, Upstream chooses a PLL frequency that all devices can talk (and the wiring will handle). This means the Upstream needs N+1 pairs to talk to N devices while Downstream devices continue to need 2 pairs.

This is a 2x2 TT tile.

The Upstream side consists of two macros (lower left hand side), the PLL mentioned above and a standard cell macro called "deskew" which contains all the logic that has to run at the full speed clock (2-300MHz).
Deskew is sized to be the same width as the PLL and sits above it. Deskew contains the 1/10 clock generator and the output shift register, it also contains a variable length delay chain (lots of buffers and a mux tree) and a bang-bang phase discriminator, this feed a variable length shift register to do symbol alignment to the 1/10 clock.
The Downstream side also contains 2 macros, a Clock Data Recovery unit which consists of the charge pump from the PLL along with a modified 4 stage VCO that generates a quadrature clock signal, (upside down in the above image) ....
....and a standard cell macro called "CDRS" that contains logic to sync to the incoming frequency and a bang-bang phase detector for station keeping, it also contains the high freq portion of the 8b10 encoders/decoders and generates the 1/10 clock synchronized to the symbols in the received bit stream.
The rest of the 8b10 logic (in the 1/10 clock domains), the management units and the logic to connect them to the external pins for test are synthesized into the remaining TT standard cell gates.
The Tiny Tapeout ui_in pins are sampled at the rising edge of rst_n. bits [7:6] determine the test mode:
In the last three mode the lower 6 bits of ui_in are used for:
The top 2 pins of uio_in[7:6] choose the I/O mode, they can be changed on the fly once the system is running:
I/O mode 0:
I/O mode 1:
I/O mode 2:
I/O mode 3:
For the last 3 modes:
Out ready is used to signal that new data is available, it's signaled by uio_in[5] being inverted from its previous state (so that it can be done manually from the TT test board)
Drive ui_in with 8'n0000_0001 (2 times freq), Set the TT clock to 25MHz. Assert reset, uo_out[1] should go low, clear reset, uo_out[1] should high. If we get this far the PLL is making a good clock. You can now look at the uo_out pins on a scope to check the freqs (should be 50MHz though that's at the tough lower end of the final VCO, 8'n0000_0010 will give you 75MHz, try looking at uo_out[3:2]which should be 1/2 and 1/4 the internal clock freq)
a scope to look at the output signals
| # | Input | Output | Bidirectional |
|---|---|---|---|
| 0 | din0 | dout0 | kin |
| 1 | din1 | dout1 | kout |
| 2 | din2 | dout2 | |
| 3 | din3 | dout3 | |
| 4 | din4 | dout4 | |
| 5 | din5 | dout5 | |
| 6 | din6 | dout6 | mode0 |
| 7 | din7 | dout7 | mode1 |