Reworked all the bridges on the ESD diodes that I found during initial visual inspection, and tidied up a few bulk caps.

Did continuity tests to sanity check on each power rail and nothing is shorted.

Gonna start populating the front side after the little one goes to sleep. Should go faster than the back since it's mostly large ICs not hundreds of 0402s.

Starting front side assembly. Paste print looks a lot nicer.

I usually begin top side assembly with large but flat components like BGAs so I don't risk knocking tiny stuff around while placing them. Then smaller passives and ICs, and tall capacitors and connectors last.

This FPGA is the single most expensive component I've ever put on a board. Shipping an entire tray for one chip might be slight overkill though...

All the BGAs and most of the big QFNs done. Still tons of tiny components left, but nowhere near as many as the back had!
Probably about half done. Time to take a stretch break.
Getting closer. Mostly just power supply stuff left. The lab is getting to be a bit of a mess with component bins covering every bit of bench and floor space.
But the board is starting to look pretty nice! Definitely less work than the back side.
Here goes... Hope this works.

Out of the oven, BGAs all look good under side view optical microscopy (best I can do without X-ray).

Two 0402s needed touchup with an iron due to poor wetting; they were 33 ohm resistors from a reel I've had since 2014 so they might be starting to oxidize too much for my ROL0 flux to handle.

Tomorrow I'll populate the through hole connectors then start the bringup process.

All soldered up and ready to start bringup!

Later today after my little lab assistant goes to bed, that is. She's still a year or two from being ready to take readings off test points for me... Being able to speak in full sentences is probably a prerequisite.

These are just quick phone pics, I'll do some beauty shots with the A7R and macro lens later.

Fit testing the thermal solution. Looks mostly good, but not permanently mounting it yet. If i find problems early on it'll be easier to rework without a heatsink in the way.

I provisioned for two fans but we'll start with one and see how it goes.

The QDR-II+ heatsink is somewhat sheltered by the RS232 jack and probably won't see much airflow bit heatsinking it was more of a "just in case" vs the FPGA and main PHY which will definitely need it. So i think I'll be OK.

Kid is asleep so it's back to the lab for me.

After a bit of cable management we've got the first signs of life out of the board.

Applied 12V power to the input and it's drawing 3.6 mA. This is normal and expected, as all power rails are supposed to be off at this point other than the raw input and the 3.3V standby rail driven by an LDO to power the supervisor.

Next step is to put some code on the supervisor and start bringing up more power rails.

Supervisor is alive enough to respond to SWD. That's a good sign.

Spent a little while updating my STM32 peripheral library for the L031 (this was my first design using it) but I now have the PLL active and a blinky running at 16 MHz from flash.

Now to get a serial console up so I can get some more debug output besides a single LED...

*grumbles and resets "days since last wasted time chasing bug caused by a datasheet errata" counter to zero*

Ok, UART is alive. Next step is to bring up a timer, then I'll have enough stuff working on the supervisor that I can begin actual power rail testing.

Can you tell I spend a lot of time in IDA? :P

Timer and logging framework are up. Ready to actually move forward with bringup.

So far the only rails that are active are 12V0_RAW (unregulated 12V prior to the main load switch) and 3V3_SB (3.3V standby for the supervisor), which is *very* in spec - averaging 3.30027V.

Next rail is 12V0, the core 12V power feed for all of the other DC-DC converters. This is driven by a load switch which limits slew rate so that I don't pull too much inrush current.

This is the first rail that's under software control from the supervisor.

It came up just fine and measures 11.9979V. Total power draw from the input climbed to 17 mA which doesn't sound unreasonable for five big DC-DC bricks.

Next is 1V0, the core power supply for the FPGA, QSGMII PHY, and SGMII PHYs. This is a big one with a lot of load on it, so lots of room for something to go wrong.

It came up perfectly as well, sitting at about 1.00015V. Overall input power draw is around 100 mA at 12V so an extra 83 mA. Assuming 90% conversion efficiency this means the board is pulling about 896 mA on 1V0 at idle!

In the interests of limiting potential damage to the expensive prototype if there's a short, the supervisor is pretty aggressive with timing and rail monitoring. If it commands a rail to come up and it fails to give PGOOD after 5 ms, it will automatically panic and shut down all power, then print a diagnostic message to the UART.

Unfortunately, the streak has come to an end with 1V2 which failed to come up within the (admittedly aggressive) 2 ms timeout. The automatic shutdown did its job and I don't think anything fried.

Next step: toss some probes down and see what's going on with that rail.

It's definitely *not* a dead short as I saw several hundred mV on the multimeter that was monitoring the rail. So maybe it's just soft-starting slower than I expected?
Time to break out the sillyscope and see what's going on...

Looks like the 2ms timeout might just be too aggressive. It seems like the rail (blue) is coming up just fine then the MCU gets antsy and shuts it down before it's come up all the way.

But hey, it was a good test of my protections!

Yep, 2ms was too tight. With a 5ms timeout it comes up fine and is putting out 1.193V.

1V8 is next. This is the core rail for the QDR-II+ SRAM and also runs (through a load switch which is currently off) most of the single ended digital I/Os on the board.

It came up fine, measures 1.792V, and the board is pulling 135 mA from the 12V input.

Still performing nominally but I need to be up early-ish tomorrow to do family weekend things so this is probably as far as I'm going to get.

Tomorrow I need to bring up the 1V8_IO, 2V5, 3V3, and Vref/Vtt rails and verify that all of the analog rails filtered off the core ones have correct voltages.

Then I can hook up to the JTAG on the main MCU and the FPGA, load some blinkies, and begin the fun part of the bringup process!

But first, time to open a support case with STMicro for the six datasheet errata I found while bringing up the supervisor firmware.

Just *once* I want to do a design with a new digital chip of nontrivial complexity and not have to do this. Plz?

Time to bring up another rail. 1V8_IO is slightly lower than 1V8 (1.7886V) due to voltage drop across the load switch, but this is well within acceptable limits.

Pulling 188.9 mA (2.3W) on the 12V input.

Tried to bring up Vref / Vtt for the QDR-II+ but I'm seeing 1.8V instead of 900 mV which isn't good.

This is <= VCCIO so I don't think I damaged any of the input buffers on the RAM. (The FPGA is definitely fine since these pins aren't even configured as Vref inputs yet and the bank is powered by 1.8V).

But I either have a PCB assembly problem or something wrong in the schematic. Time to do some digging...

Not great, seeing 1.8V on Vtt even with the Vtt regulator disabled (but with 1V8_IO on).

With 1V8_IO disabled but 1V8 on, I'm also seeing 1.8V on Vtt. But Vref isn't showing much of anything in that state.

OH, I think I see the problem. AVIN of the LP2996 is fed by 3V3, which hasn't come up yet. So we probably get weird behavior for the regulator if it's given a signal on PVIN before AVIN (1V8) comes up...

Yep, LP2996 datasheet says that AVIN is supposed to come up first.

This is a bit of a conundrum because the FPGA has VCCAUX driven by 1V8 and VCCO driven by 3V3.

And it wants VCCAUX to come up before VCCO.

But we're allowed to do the opposite (VCCO > VCCAUX + 2.625V) for up to Tvvco2vccaux (300-800ms depending on temperature) per power cycle, with a total of 240K power cycles. This might lead to some glitching on 3.3V GPIOs on the FPGA but I think that will be OK in this use case.

Yay for fixing hardware problems in software! I'll just bring up 3.3V before 1.8 and we should be OK.

For LATENTRED I'll switch AVIN to run on 3V3_SB at which point everything should be OK.

With this sequencing fix, 3V3 comes up fine (slightly low, 3.2804V, but that's acceptable) and the board is now drawing 207 mA / 2.5W at the input.

And Vtt is now showing zero volts with the regulator disabled, which is what we expect.

With the regulator enabled (and 1V8_IO enabled) we show 900.39 mV on Vtt and 897.33 mV on Vref, while drawing 227 mA (2.7W) at the input).

This is a bit more of a Vref-Vtt delta than I'd like but it shouldn't be enough to cause problems.

Final power rail is 2V5, which runs a lot of analog stuff in the PHY.

This came up fine as well, although also a bit low: 2.4834V.

Now pulling 293 mA (3.5W) at the input.

This is all of the core power rails done. Now I just have to add a few lines of code to release the FPGA and MCU resets and I'll be ready to start bringup of them.

Main MCU is alive enough to respond to SWD! Always a good sign.
MCU VSMPS is 1.3705V, VCORE is 1.0108V. I think that sounds right for default state with no configuration?
After a bunch of driver fighting to try and get Vivado and OpenOCD to each open one (and only one) of the two Digilent HS2 JTAG dongles I had plugged into the same computer, we have the FPGA responding to JTAG and giving good rail voltages off the XADC!

This was a close shave. Almost couldn't fit both JTAG cables next to each other.

I verified non-interference of the board side male connector but forgot the female IDC connectkr overhung on the sides.

Bringup is going pretty well I think.

Maybe could use a bit more kapton tape?

Gradually bringing up firmware on the main MCU. UART, uptime timer, and config variable database are running, about to work on the link to the FPGA.

But first I need to do a bit of independent testing on the FPGA.

Switch PCB beauty shots as promised before I cover up all the pretty laser markings on the FPGA with ugly blue thermal pads and heatsinks :P
@azonenberg “Super UART” makes me smile. I know what your silkscreen means, but all I seem to be able to think of is