<@U017UPJEGKZ>: The configuration is tricky becau...
# caravel-board
t
@User: The configuration is tricky because we made one change to turn the digital buffers on and set them to user control on power-up. The way we did that for a metal-mask fix, without redesigning the whole thing, was to invert the "management enable" bit (lowest bit) in the configuration. BUT I couldn't do that for GPIO 1 to 4 without disabling the housekeeping SPI. So the modified defs.h file represents the configuration bits with the management enable bit inverted, and applies to all of the GPIO except for GPIO 1 to 4. Of course, with the bit slippage thing on the right side, the values all have to be worked out for the right side GPIOs. I know values that will reliably set the GPIOs to management outputs. Settings for analog signals is actually easy by comparison, because if the 3 mode bits are set to 000, then all digital buffers are shut off. So applying all zero bits should set everything to analog, and then it's just necessary to figure out where to set the bits to get the digital I/O working.
w
Are those digital input buffers? Or output buffers?
I dont care about the management pins and the management core does not need to do anything, I just need to enable the pins as all input. Even all digital input would probably work if I dont care about the power burnt in the input buffer with analog signals.
I am unclear on the register writes required to configure GPIO values at all though
reg_mprj_xfer seems to be some register you write 1 to shift out the GPIO configuration data? Its not labeled as such in the memory map
t
Which GPIO pins are your digital inputs on?
w
and reg_mprj_datal is mgmt_gpio_in[7:0] in the memory map I am looking at
It looks like writing reg_mprj_datal and reg_mprj_datah sets the output value for all pins though?
t
I'm not responsible for the documentation. I wrote a perfectly good document in PDF and others came along and rewrote it in some other format and made it unreadable. If you go back to the original repository, which is now caravel_mpw-one or something like that, and you may need to find an early commit, there is a directory doc/ and in that directory is a datasheet PDF that is pretty comprehensive.
But yes, you need to apply a "1" to the low bit of the transfer register to copy the configuration from the memory mapped location to the GPIOs around the padframe. But the datal and datah values are directly connected to the I/O pads and get applied (or read) immediately.
reg_mprj_datal is GPIO 31 to 0, and reg_mprj_datah is GPIO 37 to 32 (only the lower 6 bits are meaningful).
w
I have mprj 27, 26, 25, 13, 12, 11, 10, 9, 8 as digital inputs. the rest are analog.
Also, there is the whole GPIO_MODE_MGMT vs GPIO_MODE_USER distinction
If I am understanding things correctly, I set the reg_mprj_io_x value for each pin. Then I write one to reg_mprj_xfer and it shifts everything out?
And for reg_mprj_io_1 - reg_mprj_io_4 only the user/mgmt bit is flipped?
And for the right side (reg_mprj_io_1 - reg_mprj_io_13) the clock is still off, so bits may "slip" where an bit in the chain is lost. So for the higher order pins its likely that everything gets shifted 1 or more bits to the right?
But the left side of the chip is fine?
t
All that up to the last two statements is assuredly correct. The last two statements are correct according to my observation on one chip only.
Although the one chip I looked at does happen to be a copy of your design. If I can get over my soldering issue, then I can help you more directly with your testing.
w
"turn the digital buffers on and set them to user control on power-up" so what do the pins configure to at power up? Is that digital output or input?
its missing the reg_mprj_datal and reg_mprj_datah registers
so everything is shifted
t
Yes, you're right. The documentation still corresponds to the MPW-one version and a handful of things like the GPIO memory map got moved and the documentation didin't get updated.
The known-good memory mapping is the defs.h file, or in the case of your ChipIgnite run, the modified defs.h file (which only differs in the bit definitions for the GPIO configuration).
👍 1
I'll try to get in a pull requiest with the updated/corrected register mapping.
w
Also, to try to understand the problem better: are all 16 bits shifted out to the I/O pads?
and the groups that are shifted out are the left side and the right side independently?
And I assume that the furthest GPIO on each side from the core is the last one?
and the clock tree can cause dropped bits.
t
My best working theory so far: I think there is a hold violation from the output of one GPIO block to the input of the next one. Therefore, of the 13 configuration bits, the last bit always gets copied into the next GPIO early. So you only have 12 bits effectively in the configuration, and every 12th bit is duplicated to make up the 13th bit of the configuration.
w
Are all the configuration bits shifted in a long chain? Or is each configuration bit in the configuration word its own chain?
t
I have not had a working board on my desk for long enough to confirm that for every GPIO. I worked out the bit settings for GPIO 6 to get the UART working, and found that the configuration for GPIO 6 is 6 bits shifted from where it should be, so the configuration word in the memory map has to have the GPIO 6 configuration shifted down so that 7 bits of it are in the GPIO 6 configuration register, and 6 bits of it are in the GPIO 5 configuration register.
And yes, the configuration bits are loaded into one long serial chain. Two chains, actually, one on the right side and one one the left, which is how it's possible for one side to work correctly and the other side not to
w
What are the power on defaults?
My right side of the chip is only digital input. And by digital inputs I mean its all just pin strapping.
If the pin is assigned to management will the user project still be able to read the I/O state?
And if its a digital output and I write a value will that value get read by the input buffer?
t
Power on defaults are 0x1809 for most of the GPIO (5 through 37).
Yes, the user project should be able to read an input bit when the GPIO is configured for management control.
w
so thats GPIO_MODE_USER_STD_OUTPUT?
t
Yes, that's correct.
w
That configuration word has the input disable bit high, so I guess even if I forced the state with a low impedance it would not get transfered to the user project
Also, Jeff said "if you need IO from the management area - we have been able to successfully configure IOs 19 - 37 using a slower clock of 5 MHz"?
which makes sense if its a hold issue. Worth trying? I can drive the clock from my function gen
t
Sorry, my mistake. It's
0x1803
. The input disable should be low. The output disable is high, but it doesn't matter for user control because the user output enable is controlled by an input signal, not the configuration bit.
Actually, I had no problem at all programming the left side I/Os at the original 10MHz. Note that hold violations are (usually) not solved by slowing down the clock. Only setup violations are. The left side configuration had the clocks arranged in such a way that it is immune to hold violations, but the slack margin got cut down so that it raised the possibility of a setup violation. I didn't see that on my chip on the bench, but Jeff was seeing it and could work around it by slowing the clock down.
Personally, I have difficulty believing that the arrangement of clock signals cut the timing margin by so much that it won't work at 10MHz, but that's apparently what Jeff was seeing on the bench.
w
Im also still seeing weird stuff on my board, where if I make any writes to reg_mprj_xfer I need to hold the reset button to enter programming and then the verify step fails (still seems to be running previous program)
but if I am careful with the timing I can power cycle the board right after the erase prompt appears, which actually causes the flash to be erased. And then I can load new firmware
I guess I can just work around this by using an external flash programmer though
t
I need to check the script. It sounds like it might be bringing the processor out of reset before the verify step, causing the verify to be subject to glitches caused by the program being interrupted to access the flash.
w
Its weird though because it does not seem to be actually erasing the flash unless I power cycle it. The old program is still there.
Im not that familiar with the flash, but I seems that the flash status registers are indicating something is wrong? Here is a good flash after a power cycle erase, and here is a flash attempt after that:
Copy code
status reg_1 = 0x0
status reg_2 = 0xff
************************************
verifying...
************************************
status reg_1 = 0x0
status reg_2 = 0x2
setting address to 0x0
addr 0x0: read compare successful
addr 0x100: read compare successful
addr 0x200: read compare successful
addr 0x300: read compare successful

total_bytes = 1016
pll_trim = b'00'



subsequent flash


python3 ../util/caravel_hkflash.py blink.hex
Success: Found one matching FTDI device at <ftdi://ftdi:232>h:1:13/1
 
Caravel data:
   mfg        = 0456
   product    = 10
   project ID = 00000000
 
Resetting Flash...
status = 0x00
 
JEDEC = b'ef4016'
Erasing chip...
done
status = 0x0
setting address to 0x0
addr 0x0: flash page write successful
addr 0x100: flash page write successful
addr 0x200: flash page write successful
addr 0x300: flash page write successful

total_bytes = 1024
status reg_1 = 0x0
status reg_2 = 0x2
************************************
verifying...
************************************
status reg_1 = 0x0
status reg_2 = 0x2
setting address to 0x0
addr 0x0: *** read compare FAILED ***
b'930000009301000013020000930200001303000093030000130400009304000013050000930500001306000093060000130700009307000013080000930800001309000093090000130a0000930a0000130b0000930b0000130c0000930c0000130d0000930d0000130e0000930e0000130f0000930f00001705000013058538970500f1938505f8170600f1130686f763dcc5008326050023a0d5001305450093854500e3c8c5fe170500f1130585f5970500f1938505f56358b5002320050013054500e34cb5feef00400b6f000000b70200281303001223906200a381020063080602130f80009373f60f93de73002380d20193ee0e012380d20193931300'
<----->
b'930000009301000013020000930200001303000093030000130400009304000013050000930500001306000093060000130700009307000013080000930800001309000093090000130a0000930a0000130b0000930b0000130c0000930c0000130d0000930d0000130e0000930e0000130f0000930f00001705000013050538970500f1938505f8170600f1130686f763dcc5008326050023a0d5001305450093854500e3c8c5fe170500f1130585f5970500f1938505f56358b5002320050013054500e34cb5feef00400b6f000000b70200281303001223906200a381020063080602130f80009373f60f93de73002380d20193ee0e012380d20193931300'
addr 0x100: read compare successful
addr 0x200: read compare successful
addr 0x300: *** read compare FAILED ***
b'372700001307878023a0e700b70700269387c70023a00700b70700261307100023a0e70013000000b707002603a7070093071000e30af7feb70700219387470023a00700b70700219387870023a00700b70700219387c70023a00700b70700211307100023a0e700b707002123a00700b70700269387c70023a00700b70700269387070123a00700232604fe6f0000018327c4fe938717002326f4fe0327c4feb7170000938777bbe3d4e7feb70700211307100023a0e700b70700269387c7003707ffff23a0e700b7070026938707011307f0ff23a0e700232604fe6f0000018327c4fe938717002326f4fe0327c4feb7170000938777bbe3d4e7fe6ff0dff6'
<----->
b'372700001307878023a0e700b70700269387c70023a00700b70700261307100023a0e70013000000b707002603a7070093071000e30af7feb70700219387470023a00700b70700219387870023a00700b70700219387c70023a00700b70700211307100023a0e700b707002123a00700b70700269387c70023a00700b70700269387070123a00700232604fe6f0000018327c4fe938717002326f4fe0327c4fe9307b012e3d6e7feb70700211307100023a0e700b70700269387c7003707ffff23a0e700b7070026938707011307f0ff23a0e700232604fe6f0000018327c4fe938717002326f4fe0327c4fe9307b012e3d6e7fe6ff05ff7ffffffffffffffff'

total_bytes = 1024
pll_trim = b'00'
t
The script looks right, though. It applies reset (write 0x01 to register 0x0b) at the beginning and doesn't release it until the last line of the script.
w
Sorry, I did a partial copy. https://pastebin.com/5xF7t9bN
1. For the working flash it has a status of 0x00 after erasing, status reg_1 = 0xff, status reg_2 = 0xff, after programming. And fails on verify. the program just halts.
On the follow up flash (same hex file) status = 0xff after erasing, status reg_1 = 0x0, status reg_2 = 0xff after programming, status reg_1 = 0x0 status reg_2 = 0x2 on verify. Verify is sucessful because its verifying the previous bitstream.
trying to flash a new hex file without corrupting the flash contents after that has a status of 0x00 after erasing, 0x0 status reg_2 = 0x2 after programming, and 0x0 status reg_2 = 0x2 when verifying. It then fails verify
t
I'm not sure that the status register 2 is meaningful. It's coming from flash command 0x35 but I don't know off the top of my head what that is.
If the status registers read 0xff, though, it's a sign that the flash chip is no longer responding to anything (or is not receiving the commands).
w
so it seems that if I configure the GPIO before entering SPI passthrough and starting to program I have issues
I guess I could try holding reset down before plugging in the board
I added a long delay before configuration though. And if I start programming before that everything works
So im going to declare this not solved but work'ed around and no longer a pressing issue.
Also, I got the first signs of life 🙂 https://twitter.com/WestonBraun/status/1488989735875796994
t
Can you please post a summary of what you did to prevent the flash programming from failing? I need to diagnose why it doesn't work like it's supposed to, and what it is about your solution that causes it to work.
Also: Thansks for all the feedback, and great work getting something up and running (it always takes me at least one day before anything works).
w
So, if the GPIO gets configured programming seems to fail in the weird fashion I described where it claims to erase and program but the old program is still there. The only workaround I have found for this is if you power cycle the board ~ 1 second into the erase sequence it seems to corrupt the flash contents. You also need to hold the reset button for it to even enter SPI passthrough.
I added a long delay (~5 seconds) at the start of my program before GPIO configuration (the write to reg_mprj_xfer) which allows me to start the programming before it configured
Now that I think about it, perhaps another workaround would be to hold the reset button before you apply power to the board.
It seems that the reset button does not restore the power on GPIO configuration
t
I am aware that configuring the GPIO can mess up the configruation of the housekeeping SPI signals (GPIO 1 to 4). But the reset button is supposed to set those back to the original values, and I've always (?) found that it worked just to hold the reset button down when starting the programming. It seems like the reset may not reset everything, that there are configuration settings that are effectively immune to reset. . . ? Can't think of how that makes sense from the circuitry, but that seems to be what you're describing.
(Okay, posted that at the same time, but sounds like we have arrived at the same conclusion.)
👍 1
w
Now im getting occasional compare failures with a block of all F's.
Copy code
b'23a00700b70700269387070123a00700232604fe6f0000018327c4fe938717002326f4fe0327c4feb77700009387f752e3d4e7feb70700211307100023a0e700b70700269387c700130700f023a0e700b7070026938707011307f0ff23a0e700232604fe6f0000018327c4fe938717002326f4fe0327c4feb77700009387f752e3d4e7fe6ff0dff6'
<----->
b'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
That seems to be a different issue though. And I can get around it just by reflashing
/ it actually seems to be programming
I just flashed
Copy code
//left side GPIO, bottom to top 
   reg_mprj_io_37 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_36 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_35 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_34 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_33 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_32 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_29 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_28 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_27 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_26 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_25 = GPIO_MODE_MGMT_STD_OUTPUT;

   //right side GPIO, bottom to top 
   
   reg_mprj_io_1 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_2 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_3 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_4 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_5 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_6 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_7 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_8 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_9 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_10 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_11 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_12 = GPIO_MODE_MGMT_STD_OUTPUT;
   reg_mprj_io_13 = GPIO_MODE_MGMT_STD_OUTPUT;

    reg_mprj_io_4 = GPIO_MODE_USER_STD_INPUT_NOPULL;
    reg_mprj_io_3 = GPIO_MODE_USER_STD_INPUT_NOPULL;
    reg_mprj_io_2 = GPIO_MODE_USER_STD_INPUT_NOPULL;   // 0x0403
    reg_mprj_io_1 = GPIO_MODE_USER_STD_BIDIRECTIONAL;  // 0x1803
    reg_mprj_io_0 = GPIO_MODE_MGMT_STD_OUTPUT;
and I tried to strobe all pins through writes to
reg_mprj_datal = 0xffffff00; reg_mprj_datah = 0xffffffff;
Nothing is strobing on either side of the IC. io_8 is randomly high, and my oscilator is still working so I know that io_7 and io_32 and in some analog friendly mode.
At this point I guess its just a matter of trying configuration bits / PVT + frequency variation to get the IO configured?
Jeff said "by default - all GPIO (5 - 37) are set to user mode bi-directional - which means you should be able to access them from your user project area"
I left the output enable and such pins on my project floating. Could I make this work without pin configuration at all?
Yah, looking at the default value I think I may be able to just skip GPIO configuration
I left the OEB pins and output pins unconnected in the user project because I was told I could. Whats actually happening in that case?
Were they somehow tied such that the GPIO output buffer will be disabled when managed by the user project?
t
The user-side OEB lines will be floating; you were "told you could" because under the assumption that you can actually program the GPIOs correctly, you can always set it to either management control or just turn off the output buffer, either of which will make the pins non-functional and whether or not they are floating will be irrelevant. However, if the GPIO is configured for user output, then they are functional, and whether or not the output is enabled depends on whether that pin drifts to the high rail or the low rail. If they all tend to drift (or leak) high, then you're good... .
w
Im gonna regret not tying them off 😞
Im gonna check through. One can hope they are floating the right way. If so I might be able to avoid configuring the IO entirely
No luck. most of the pins are pulled low 😕
for the digital inputs you think I can force them?
Drive the input with a low impedance that can override the output buffer
t
Yes, I think so.
w
Also, whats your best model for the bit slippage? Do bits get lost? Do they get doubled?
Its a chain, so if bits are lost the top N pins are nor fully configurable. Luckily thats the bare pins for the power stage. So if every n'th bit is lost or something I should be able to configure.
I cant configure the left side either though. Im going to need to try the 5MHz clock
t
My model is that every 12th bit gets doubled. The bits then move through the shift register slightly faster than they should; they have moved forward 14 bits after 13 clocks, with the last two bits always the same. So to configure GPIO 6, the configuration value has to straddle the configuration register for GPIO 5 and GPIO 6, because that data is going to move forward by 6 extra positions by the time it gets to GPIO 6.
My model mostly fits observed data. Mostly.
Copy code
// NOTE:  The following list sets too many bits, but all
    // channels operate correctly as management-controlled outputs
    reg_mprj_io_13 = 0x0fff;
    reg_mprj_io_12 = 0x0fff;
    reg_mprj_io_11 = 0x0fff;
    reg_mprj_io_10 = 0x17ff;
    reg_mprj_io_9  = 0x1fdf;
    reg_mprj_io_8  = 0x0fff;
    reg_mprj_io_7  = 0x1ffe;
    reg_mprj_io_6  = 0x0fff;
    reg_mprj_io_5  = 0x17ff;
    reg_mprj_io_4  = 0x0fff;
    reg_mprj_io_3  = 0x0fff;
    reg_mprj_io_2  = 0x0fff;
    reg_mprj_io_1  = 0x1808;
    reg_mprj_io_0  = 0x1808;
This was one of my more successful experiments. I was able to run a program that toggles all the outputs, and the configuration above had all positions on thie right side toggling except for 1-4, which are (probably) being driven by the FTDI chip.
w
I think I might have a workaround. Does anything disable the digital input except
Copy code
bit 3:  Input disable (bit field INPUT_DISABLE)
	    value 0 = Pin enabled for digital input
	    value 1 = Pin disabled for digital input
t
That experiment was based on the fact that a configuration of all 1 values except for one zero bit at the position of the management disable bit (position 0 for each GPIO) would put the GPIO in a management-controlled output mode (weak pull-up, pull-down, but still a valid output). But I can't fit that result to any model.
w
And does the user project still receive the input signal if the managment SOC is controlling it?
I think the all 0's value works for digital inputs to the user project
t
A DM value (top 3 bits of the configuration word) of 000 will also disable the input. The truth table in the SkyWater documentation is not completely consistent, but I think that's the case.
w
oh 😕
I assume 001 does that to?
what actually happens when the pin is disabled for digital input? Does it float? Does it copy the output register value?
t
No, 001 will enable the input buffer if the INP_DIS bit is zero.
w
Ah, the documentation I am looking at shows:
Copy code
bits 10-12:  Digital mode (bit field DIGITAL_MODE_MASK)
	    (value = {bit[12], bit[11], bit[10]} in the list below)
	    value 000 = analog mode 
	    value 001 = analog mode
	    value 010 = digital input, 5kohm pull-up
	    value 011 = digital input, 5kohm pull-up
	    value 100 = open drain to power
	    value 101 = open drain to ground
	    value 110 = digital output
	    value 111 = digital output (weak)
t
I think the input floats when the input buffer is disabled.
"value 001" in that table should say "digital input, no pull-up/pull-down", not "analog mode".
w
the all 1's configuration word disables the input buffer though? The disable input buffer bit field is set. But I am unsure about things now
I assume that 010 and 011 ignore the digital input disable bin at the very least?
t
No, they don't. The output buffer mode is independent of the input buffer being enabled or disabled, except for the 000 mode case.
w
Oh, never mind. I had things flipped with the polarity of the input buffer bit.
t
A table is worth NxM words. . .
Just bear in mind that OE_N is a configuration bit for management control, but a pin input for the user control.
w
thats one of the pins I have floating 😕
at this point I am just looking for any way to set digital inputs to all of the right side, even if I have to force a pin. These are all just pin strapping type things so I could also just set their values via the managment control
t
To answer one of your questions from a while back, though, the value on the pad will always show up in the user project
user_gpio_in
pin as long as the input buffer is enabled, regardless of any other setting (such as management enable/disable).
w
So I need bit 3 to be 0, and at least one of bits 10,11,12, to be 1
and I need to propigate this all the way to io[13]
t
Yes.
w
I am still trying to get a mental model of how things are being shifted, but is this possible? Or am I screwed
t
I'm pretty sure it's possible to get all the I/Os configured in a meaningful way, but I haven't had time to pin down exactly how all the bits end up at the time of the serial load strobe.
w
I think a quick and dirty way right now would be just to set each configuration word to alternating 1's and 0's and invert it if I dont get an input reading
The management core should also always be able to read the input buffer, right?
and reading reg_mprj_datal gives the value as read on the output of the input buffer?
t
Not always. The management interface to all but a few of the GPIOs on the ends is a one-signal interface, either input or output. But as long as input disable is 0, then the GPIO is configured as an input for mangement, not an output, and the management can read the pad value.
Yes, reading reg_mprj_datal gives the pad value, not the value written to reg_mprj_datal.
w
Interesting. So bidirectional is an invalid configuration for the management. And the control is muxed on the input disable signal?
Also, to clarify your model for the IO issue, every 12th bit (the last bit?) gets doubled? But only once?
t
Yep, that's right. Keeps down the number of wires running around the chip. I'm sort of regretting not having more wires and simplifying other things instead.
w
so a chain of 0_0000_0000_0001 repeated would expand to 0_0000_0000_0001_1_0_0000_0000_0001_1_0_0000_0000_0001, and so on?
I assume this happens because there is a delay between when each word gets shifted out?
And any error like this just means I have a rotating field where the bit is doubled and thus is under specified
t
Let me get back to you on that. It partly depends on which configuration bit is at the beginning of the shift register and which is at the end. I have not worked that out exactly.
My theory about it is that there is a hold violation between the GPIO blocks, so that for each GPIO block, the clock arrives too late, and the data that just got clocked to the output of the previous GPIO's shift register gets copied into the next one, overwriting whatever was supposed to be the first bit in the next GPIO.
That would be a classic hold violation case due to clock skew.
w
but its only happening on one flip flop in the chain, because the doubling is only happening once?
I am also still unable to strobe any pins on the left side of the chip, even with a 5MHz clock
correction: one pin is flashing. pin 13
t
I finally received my 2nd circuit board from Jeff, after having FedEx sit on it for three days in Memphis, so I'll be able to start doing more tests myself starting tomorrow.
w
I guess at the very least I should be able to verify some of the basic analog stuff with all pins set to the all zeros state. And the power stage with the pins in their boot state
but the state of the GPIO is not looking very optimistic 😕
t
I think my definition of left and right is different from yours. I am thinking of the chip as I orient the layout. In my mind, then, I/O 0 to 18 is "right" and I/O 19 to 37 is "left". I notice that the board is printed such that they are reversed relative to the board's slikscreen text.
w
from Jeff: "if you need IO from the management area - we have been able to successfully configure IOs 19 - 37 using a slower clock of 5 MHz.  This can be configured by providing a clock signal on 
xclk
 input on the board and jumpering  
J6
."
are 19-37 the better working I/O? Or the worst working I/O
because right now I have a 5MHz clock and set every pin to GPIO_MODE_MGMT_STD_OUTPUT. The only two pins toggling on the board are the LED pin and 13
t
So GPIO 19 to 37 should program reliably. GPIO 0 to 18 will have bit slippage, and no amount of slowing down the clock will help that. The clock inputs to GPIO 19 to 37 run in the reverse direction of the data, which means they are essentially immune to hold violations.
Yeah, that surprises me because I was testing your chip and I had no problem at all programming GPIO 19 to 37 (or rather 25 to 37, since it's a Caravan chip and there is no GPIO 14 to 24).
w
Should I try swapping out the chip?
also, im running bink.c. Should I try running hello.c?
t
If you mean desoldering and replacing the QFN, I haven't dared try that yet. QFNs are such a pain.
w
eh, I have a hot air station. Its not too bad.
Working with power electronics gives you plenty of time to learn how to replace blown things
t
So do I. But QFNs are still painful, and if you don't have continuity, then it's even harder to debug problems---is it the chip, or the soldering job?
w
hello.c also seems to call for a #include "spi_io.h" that is not in the repo
t
I think it just as putchar() and print() in it. Here's what I'm using:
Jeff must have split out "spi_io.h" recently, because it's not in my clone of the repository. @User: Are you aware that you didn't commit
spi_io.h
?
w
Is something I have out of date? I am not getting any pin other then the LED pin to toggle with the blink script
I dont know if I ever saw the other side blink. I was not really investigating it.
I dont think I damaged anything? I can still talk to the chip and my oscilator works.
I am also still having intermittent problems flashing the chip. I got rid of my workaround that delays the configuration and tried just holding reset on power on. I am once again unable to re-flash
And my trick is not working either. Im going to need to get an external SPI flash programmer.
j
@User I just pushed the spi_io.c and spi_io.h files. these were created for bitbanging spi across the gpio pins.
I’m trying to catch up on this thread. what are trying to do at this point?
reprogram the flash or setup the gpio to be used by the mgmt soc?
if the latter, you will need to drive the xclk at 5Mhz and jumper J6.
for the former, I would go back to the blink firmware and try to program that. you will need to hold the processor in reset while powering up. continue to hold reset while programming.
configuring the gpio can interfere with the housekeeping IO configuration and programming the flash.
you can comment the spi_io.h from the hello.c example if you are not trying to use it.
w
Basically everything seems to be wrong. I need to be able to configure 19 - 37 as some digital input and some as analog input. And all the lower order I/O as digital input. I cant just leave the I/O unconfigured with the default values because I left the output enable pin floating in my design because I was told I could. I a trying to toggle all the pins as a test to see if I can load valid configuration values and I am so far unable to do so for any pin but the LED pin
This is with a 5MHz clock (I disabled the oscillator and am feeding in an external 5MHz clock).
I am also getting bizarre issues where I am not able to consistently reprogram the board through passthrough mode. It does not seem the flash is actually erasing
I hooked up my scope to do protocol decode on the flash SPI bus and I can see the erase command being transmitted and the write enable command before it.
But oddly, it only consistently works when the scope is connected to the clock line. Which suggests some signal integrity issue. Which is a bit confusing given that the timing looks good and I lowered the FTDI SPI speed to 1MHz as a test
I have been holding the flash in reset for all programming debug.
t
If you saw the erase command given, then the problem could be with the status read-back. If the status read-back causes the script to think that the chip is done erasing, then it might be applying a command that interrupts the erase cycle early. Just a guess.
w
I modified the script for debug so it just sends the erase command and quits
As shown in my other post I seem to have actually solved the SPI programming issue (or at least found a workaround). And for reasons I do not fully understand the GPIO 19 - 37 are now correctly configurable. So now its on to figuring out GPIO configuration for io0 - io13
I see the blink demo does not try to blink the first few io. I know they have other functions, but can the IO blink io0 - io6? With the caveat that the pins may contest with the FTDI chip?
Its probably easiest to start from io0 and work my way up
@User im working my way through the bit shifts for the other I/O bank but getting weird test results for the lower managment IOs (right now im on io5. Does the management core share the IO control with anything on that pin that can impact the state?
I was assuming (until the bit slip wraps around) I could just step the two adjacent 00 bits around until I align with the location of the managment bit == 0 and output enable bar == 0. But that does not seem to be working for the gpios I am trying other than io_6
Also, at some point I lost the other I/O bank again. I am back at running at 10MHz though
I think more than a single bit slip aligned with the configuration word is up with the GPIO though. Or else my method would be working
t
I believe I said that the explanation almost matches observed behavior. The problem is that the serial load works perfectly well in RTL and gate-level simulation. So the only explanation for incorrect behavior would be a timing issue, and given the setup, that would necessarily be a hold violation, and it would be between GPIO blocks. Now it could be that not every one of the GPIO blocks has this violation. Or it could be that I had the order of the bits backwards when I was trying to figure out which bit gets overwritten. There aren't that many possibilities for what the error has to be, but there are several variations on how it might be playing out.
w
I should also try to borrow someone elses board to debug this. My output pins / output enable floating seems to complicate things. I looks like sometimes the I/O will follow the pin toggling despite being controlled by the user logic area
Oh, you think between multiple I/O blocks there may be some bit slippage? So more than 1 bit is getting doubled per word?
Im not making much progress on this without more insight into the problem. I also dont have any good way to check if I am getting the input to be enabled.
t
I don't think so, because I was seeing results on the left side (GPIO 19 to 37) consistent with correct operation. If there was a hold issue inside the GPIO block then it would show up on both sides.
w
Also, I am pretty sure there is some other issue with the other I/O bank
I keep randomly losing it. And I am not subjecting my chip to significant variations in temp or anything
And it seems to be independent of clock
t
I know you're seeing an issue with the other bank, which is yet another issue (why would there be chip-to-chip variation except in very rare circumstances?).
w
I lost the IO bank last night. It was operational this morning. It was out for a while. then it was back again for a bit. Now its gone again
And I am now running at a 5MHz clock
t
I should be able to run experiments to pin down which bit controls the input enable for each channel, which should give me a better idea of how the bits shift than what I did before, which was changing multiple bits at a time.
w
Is anyone else working on the bringup of this chip? The class slack channel was pretty quiet. What about the other people on the shuttle?
Right now its hard to pin down what is an actual issue and what is not. Like I am now pretty sure the SPI programming is an issue that is not just me
t
You are the vanguard, as far as I can tell.
Likewise, I had a few issues with flash SPI programming which I chalked up to bad soldering or any number of different things. Now that you found the clock rising as CS is deasserted, that all makes sense. Also, I'm pretty sure I have a software workaround that doesn't involve an extra capacitor.
w
At least on my chip there is definitely an issue with the other I/O bank some times. And it does not depend on clock frequency
t
Possibly Jeff hit the same problem. He tried it with a slower clock and it worked. Correlation does not imply causation. I always said that I found it very doubtful that there would be a setup violation on the right side I/O at 10MHz, especially as the circuit was synthesized to a target frequency of 40MHz.
w
Brought up my actual test board. The higher I/O bank seems to work (for now)
FKkh5GOUYAAHHoW.jpeg
Without the lower bank inputs working all I can do is verify the error amplifier and oscillator
@User can you clarify "But as long as input disable is 0, then the GPIO is configured as an input for mangement, not an output, and the management can read the pad value.". is this muxed at the GPIO block itself, or at the management core? (will it depend on the actual value shifted in, or will it depend on the value as set in the original register? Or subject to some different bit slippage?). I had the idea of just trying a working input on the other I/O bank to a pin under test, driving the pin pair with a function generator, and permuting the configuration bits until the readings of the two pins match. This should allow me to write an automate test script that should pretty quickly find some working input configuration if it exists.
I am trying with a known good pin and getting pretty good results. I am not getting any results I know to be invalid (nothing that has the input actually disabled, from the digital mode = 000 or input buffer disable ==1
it takes ~30 seconds to step through all itterations of the configuration word with 20 pin toggle cycles to weed out false positives. And I am getting 1457 results with that number only varying +-2 or so between runs.
So I think is is going to work! I am going to try it for a pin on the non functional bank now
Bleh. Im not having any luck with the bad I/O bank. I can see the I/O pin behavior is changing though. I might have to try shifting the configuration word more
woot! I am not itterating over possible bit slips and finding stuff!
Huh. This method seems to have run out of steam at io11. Not sure what do do now. I really need io12 and io13
I think I am getting false positives due to floating lines coupling to other lines
If I really work on this I think I can get a valid set of values though
t
One thing that complicates the method considerably is that the configuration bits "analog enable", "analog polarity", and "analog select". In the right combinations, these will couple outputs together. There are two shared buses
AMUXBUS_A
and
AMUXBUS_B
that are supposed to be used for some kind of pad-level switched-capacitor function. So with "analog enable" high, various combinations of the select and polarity bits will connect the pad to one of these two buses.
@User: FYI, I looked at the RTL code to figure out why the SPI flash clock goes high with the chip select, and decided it's because someone unwisely stuck a pull-up resistor on that pin on the development board (R16). Removing R16 or grounding the other end to make it a pull-down should solve the problem. The data line (R15) probably shouldn't have a pull-up resistor either, but that's less problematic than the clock.
w
is there any good documentation on the analog buses?
/ whats the impedance of the connection to the bus?
I am not opposed to figuring out how the bit slippage is occurring. My only worry is that its not just a constant duplication, but that the value of the duplicated bit is dependent on the left and right bit values
I think I am pretty close to figuring out a fully working combination. I have been able to derive working values for most of the inputs this way
At the very least, being able to check the digital input buffer from the management core significantly simplifies testing
t
Documentation on analog buses:
It probably helps to have this illustration, too, to know where the switches are that connect the amux buses.
w
That documentation claims that the input buffer is disabled when analog en = 1. Is that true?
t
I guess so. I had not noticed that before.
w
Also, I noticed there is some debug way to clock out the data independently to the left and right IO banks. Is the clock for that common?
IE: Can I only configure the working bank and leave the other bank at the reset values
t
There is a debugging method to bit-bang the I/O serial programming, but that was something we did for MPW-two after discovering all the timing issues with MPW-one. The ChipIgnite run pre-dates the MPW-two design, so the only stop-gap measure we applied was to make the I/O come up under user project control on power-up.
So, no, unfortunately the two sides are not on independent clocks, so as soon as you apply the "xfer" bit, all values on both sides are going to get modified.
w
Do you think that the value of the bit added during the bit slippage is dependent on only the previous bit? Or some combination of the previous and next bit? Its just a shift register, right? So the logic delay is ~ constant?
Ah ha. I think I got bit on the analog bus connections for some of the inputs I was deriving. It seems the bus is tied to my system analog rail, so I need to check the values I derive while that rail is powered.
Huh. I think I want to filter my results by most number of zeros
Ah, I ran some more tests and I started actually parsing the valid combinations produced by my scripts and I think I am getting somewhere
so far for I/O 8 and 9 at least, the bit shift is 1 per I/O bank, as you expected
and the overlap seems to be on the end of the configuration word. So, for example, the actual value for IO_CONFIG9[0] is the same as IO_CONFIG8[12]
which is fine, as thats the management control bit and the top bit of the digital mode bit field
management control bit should be 0 so the processor controls the I/O state. And the only requirement on the digital mode bit field is that all 3 bits cant be 0, as that disables the input buffer
t
I can't make registers 8 and 9 operate as management output by shifting the bits by 1. What values are you putting in the registers? So far, I've found that I can turn on channel 14 as an output by putting 0x0008 in the config word for channel 14 and 0x0c00 in the config word for channel 13. And I can turn on channel 6 but putting 0x0068 in the config word for channel 6 and 0x0000 in the config word for channel 5.
w
so right now I am just poring through the results of my script and aligning the input disable bit which always needs to be 0, and the output enable! bit, which is always 1 (because my project seems to be bringing the OE high due to how pins are floating or something)
Do you mean pins 8 and 9?
Looking at my tables the value of managment enable for pin n is the same as the top bit of digital mode for pin n-1
so if you want pin 9 to be managed by the test harness the digital mode for pin 8 has to be 1xx, which precludes all the digital output combinations
So I think thats what you are seeing?
However, you should still be able to put consecutive pins in digital output mode and have them controlled by the user project. which is good.
Hopefully I will not find any more bit shifts or that will make things more messy
I am slightly confused on one thing I am seeing though. I am reading valid inputs from the input buffer when I have the management enable bit at 1 or 0. But only when the !OE bit is at 1. Does the user project not actually control its own !OE signal? Because I dont think I would be seeing this behavior otherwise.
t
The user project controls its own OEB signal, but the management does not, because most of the GPIO are 1-signal data, which means either input or output, but not both. For those pins (all except 0, 1, 36, and 37), the OEB configuration bit should be set high, and the pin is either an input or an output depending on the IEB configuration bit. But when the user project controls the GPIO pin, the output enable is pin-controlled and the OEB configuration bit is unused.
w
Either way, I think I have the I/O shift figured out. Running some final tests
What I am observing would explain the inability to set consecutive pins for digital output under control of the test harness processor
t
These digital modes should all work for output (just have different weak/strong pulls):
010
,
011
,
110
,
111
.
w
Copy code
bits 10-12:  Digital mode (bit field DIGITAL_MODE_MASK)
	    (value = {bit[12], bit[11], bit[10]} in the list below)
	    value 000 = analog mode 
	    value 001 = analog mode
	    value 010 = digital input, 5kohm pull-up
	    value 011 = digital input, 5kohm pull-up
	    value 100 = open drain to power
	    value 101 = open drain to ground
	    value 110 = digital output
	    value 111 = digital output (weak)
?
t
Ah, right, to get the pull-up and pull-down input modes, the output value has to be fixed for those digital mode configurations. Although
100
and
101
could be used with an external pull-up or pull-down resistor, respectively.
w
Yes, But you still cant use them because the top bit of digital mode overlaps with the management control
I think my analysis is right. I have input from IO13 - IO8 with values I calculated
But I dont have input from IO 10. Not sure if I am screwing up testing or what...
I could have damaged that pin with all my testing
t
So suppose I wanted to set every other pin from 0 to 18 to management-controlled output. What would the configuration values look like?
w
image.png
Sorry if its messy, but here is how pins 13 and 12 work. Everything is just a bitshift as you first described
from this you can see how the management enable of pin 13 overlaps with the digital mode of pin 12
Something else seems slightly up though, because my configuration for IO 11 is not working
But the bitshift has not changed. I dont know if data is getting clobbered in some other way or what.
My brute force script is finding lots of valid configurations for it.
but if the bit-shift values were off things would be very wrong for all the I/O
wait, sorry. IO config 10
I am very perplexed right now. All the other inputs work with the same shifted configuration values and this value appears as valid in my test script for this pin
I dont think its a soldering issue
Ok. This is bizarre. Are there multiple register paths that are tee'ed off or something?
t
It all works in simulation. . .
w
It seems that the input enable pin for IO 10 is not shifted
everything else seems to be shifted that I have checked. All the other bits, all the other I/O pins.
this configuration word is shifted by 10 bits. But it seems not that one value.
I am investigating further, but it is quite perplexing.
I dont know whats going on anymore. I was so close too
Only one I/O was not working
Oh wait, I might have a workaround that I can not directly check
Or I have the root cause.
You said that when the output for the management processor is enabled it can not read the input buffer because there is only one physical signal line.
How is that controlled / what drives the mux?
Because when I am unable to read this value the bit field in the actual configuration register on the management side for input disable is 1. So is it triggering the signal mux off of that?
You previously said "To answer one of your questions from a while back, though, the value on the pad will always show up in the user project 
user_gpio_in
 pin as long as the input buffer is enabled, regardless of any other setting (such as management enable/disable)."
basically I need to put a 1 in the input disable bit field so it gets shifted to the !output enable buffer. And if the mux is controlled by the actual value in that register the processor has access to, not the serial shifted one, its going to cause issues with how the managment core reads the pin, but my user project should be fine
I think that the other side of this mux may also explain why I always had the !output enable pin asserted for my other tests. It was not actually interfering with the input buffer but how the managment core reads the state of the input buffer
I decide to go ahead and try. It seems it works!
Power stage is making waveforms now 🙂
And I have verified the operation of the input pins that I could not read through the management processor. So that was the issues.
t
It always helps me to sleep on a problem, especially if somebody else is awake and working on the problem while I'm sleeping!
At your convenience, please confirm my understanding of the GPIO programming on the right side (GPIO 0 to 18), which I would summarize as follows: It appears that (1) everything is consistent with a simple hold violation between each of the GPIO configuration stages along the serial load chain , and (2) the hold violation causes the last bit of each stage (DM[2]) to "bleed" into the first bit of the next stage (management disable). In other words, the configuration word for each channel is effectively 12 bits instead of 13, and the "DM[2]" bit is shared with the "management disable" bit of the next channel, and all the configuration registers are compressed to 19*12 bits instead of 19*13 bits. Since DM[2] has to be set to 1 to get any GPIO to be an output, then any GPIO that is set to an output will prevent the GPIO next to it from being set to management control.  That is an annoyance, but a relatively minor issue, since most people are going to be interested in configuring the GPIO for user area control. In that case, for the same reason as just stated, the "DM[2]" bit has to be set to 1 to make the next GPIO set to user control. This prevents the channel before it from being set to a no-pull input, but it can still be set to a weak pull-up + pull-down output, which should be weak enough to be overridden by an external signal.
@User: This is a helper script based on my understanding of the full discussion. At the top of the file is the intended settings for the first 19 GPIOs. Then the bit slip is applied in reverse (management disable bit copied back to the previous GPIO configuration), and each GPIO configuration is checked to see if it changed from output to input or vice versa. Then, if an input is changed to output, the configuration is modified to be a weak output so that it can still act as an input. If an output was changed to an input but the adjacent GPIO is supposed to be an input, then the management disable bit is changed. Then the script dumps the actual configuration needed to achieve the intended result. With the script, it's obvious to see that multiple adjacent management-controlled outputs are impossible.
w
yes. this matches my observations. One more thing that I observed last night though is that the muxed signal from the I/O input/output and the management control seems to be controlled both by the actual value in the GPIO config registers at the GPIO and the value in the managment configuration register
I think I would need a better understanding of how that bus works to make sense of it.
But if the input disable field in the original configuration word is set that shared line or whatever will get disconnected and the management can not read the pin, even if the actual value shifted into the input disable pin at the GPIO is 0.
And I think something similar in the opposite direction with the !output disable pin being shifted into the GPIO messing up that bus state, which is why in my pin toggle test script script I was never able to read the pin input state when that bit was asserted.
t
Oh, right, I forgot about that one detail, and it's important: The processor needs to know whether each GPIO is set to be an input or output, so it checks the configuration word. But it doesn't have access to the configuration word at the GPIO itself, so it will check the configuration word in the configuration register. But it doesn't know about bit slippage! So the procedure in the C program has to be (1) set the configuration to compensate for bit slippage, (2) apply the transfer bit, and (3) set the configuration to what it would be if not compensating for bit slippage. Then the GPIO and the processor will both agree on what the GPIO function is.
Also, I had an error in my script, so this is the corrected script:
w
Ooh. The values used for that are not also registered when you clock in the chain? I did not test
t
output disable (OEB) and input disable (INP_DIS) are the only two configuration bits that the management SoC side checks from the memory-mapped GPIO configuration registers, but I think those are only relevant for GPIO 0, 1, 36, and 37 (the ones that have output enable lines connected to the management SoC), and don't make any difference to the other GPIO channels.
w
I am hoping to get all the bias stuff configured today and do a full test on my chip. Thanks for answering all my questions and helping figure this out.
Its exciting, I am going to have some of the first test results for an open source IC on sky130!
t
Getting the bit shifts right is annoyingly difficult. Ignore the previous two posts of this script (which I just deleted). This one works and I've confirmed it for various configurations, especially to ensure that I can set GPIO 1 to 4 as management inputs and continue to access housekeeping after programming. Now I don't have to press the reset button to get the thing to flash.
Looking forward to your results!
w
It works! 😄
🎉 1
👏 1
🙌 1
t
Also: That looks like my definition of a real test board. I'm having difficulty conveying to my teammates what a test board should look like. They want to make little tiny demonstration boards.
w
These are ASICs, so it makes sense that the test boards would have to be designed by the IC designer and its going to be hard to make a general purpose test board
The provided test board was pretty useful for initial bringup and having a known good design though.
Adding some shunt resistors and headers to measure them to check power consumption would have been somewhat useful
j
@User congrats! thats awesome. let me know if you post on social. I also noticed your board. can you share?
Feel free to take the picture and post it where ever if you want
j
thx!
w
I need to push the firmware things, and the header for the FTDI breakout I am using is the wrong pitch, but here is the test PCB: https://github.com/westonb/open-pmic-pcb
t
@User: There are two header positions on the demonstration board that allow the 3.3V and 1.8V regulators to be disconnected from the board, so yes, you can feed in an input supply and measure the current draw. It's not perfect, though, since the 3.3V power is shared with the FTDI chip and other components, but most people are going to want to measure the user area power, which is all done through headers at the end of the board.
👍 1
r
Just got my board and chips in today! Looks like there's a lot to catch up on!
@User did I read correctly earlier in this conversation that for MPW2 there was a change so that after POR, the user project IO defaults to user project control? Except for some lower order IO needed by the SOC? Is this change also present for chipIgnite 2106 run?
w
With the metal fix, yes.
The TL:DR is that flash passthrough is a bit buggy unless you remove the pullup resistor on the SPI clock line. And the configuration word for the lower number I/O bank is shifted by 1. And there may be very intermittent configuration issues with the higher order I/O bank that I have not been able to consistently reproduce.
👍 1
r
Thanks @User I’ll see how far I can get tomorrow in the lab. Thanks for blazing the path!
👍 1
w
Rather, each I/O config word is shifted by 1 bit per IO block. (the first bit of word N overlaps with the last word of bit N-1). If you scroll up ~ 50 messages Tim made a script to do the shifting
t
@User: I have a script to translate between the intended function of the GPIO channels 0 to 18 and the values that need to be put in the registers to achieve that, plus some example C code that I can get to you. I posted the script in my (long) conversation with Weston (as Weston pointed out), but it's probably a good idea to post the example C code here, as well.
w
@User is there any reference that has the bond wire length + the bond wire resistance? My power FETs are higher resistance than modeled so I am trying to calculate the contributing parts.
t
The caravel MPW-two repository has directory
pkg/
with wire bond drawing
caravel_qfn_bond.pdf
, from which you can measure the length of the bond wires as about 1.6mm as the very, very tiny crow flies, which accounting for the bend of the wire can be estimated as a maximum of maybe 2mm. The wire would be 1 mil diameter gold, which Google says is 1.7 mohms per mil. 2mm is about 80mil, so that's about 0.136 ohms per bond wire. The QFN package has pads that go straight through; the wire bond lands right on top of the pin. So that would also contribute milliohms. The largest contributing factor is likely to be the contacts, I would think. Yesterday I found additional measurements of via resistance in the SkyWater e-test documents, and had to revise some of my resistance tables accordingly: 185 ohms per contact from local interconnect to n-diffusion, and a whopping 585 ohms per contact from local interconnect to p-diffusion. I'm assuming that the wafer is probably at typical process corner, but the 3 sigma high side for those values are 280 ohms and 840 ohms, respectively.
w
The contacts from the fet drain/source to LI and M1?
I have never tried full resistance extraction on my FET. So many cells, it would be a giant mess.
But with just the FET model resistance I was at:
Copy code
NMOS: 306 um x 306 um, 36 x 36 grid, ~175 mΩ
PMOS: 372 um x 372 um, 48 x 48 grid, ~325 mΩ
and my measured values are
Copy code
0.6 for NMOS and 0.642 for pmos.
I have 3 bond wires for power, 3 for switching node, and 4 for ground. So thats contributing 0.113 ohms for the NMOS and 0.136 ohms for the pmos.
t
I expect the bond pad design makes up the rest, here and there. The current from user project to pad is limited by having to go under the power rings, and while I made that layer very wide on the power pads, it's still roughly 3 squares each on two sides, so about 1.5 squares * 47mohm/sq., which is an additional 70mohms. But there are only three of those pads. . . which signals are using those pads, and are the others using the plain analog pads?
w
Did you end up connecting all the metal layers for the power connections? I remember we talked about that in the past
The connections to the power FETs all use the bare pad with the extra routing on all metal layers up to the edge of the project area
It might be a bit difficult to modify my PCB, but it would be interesting to use one of the pin connections as a kelvin connection. Which would allow me to measure the resistance after the I/O pad
t
I connected m3/m4/m5 together on the three power pads. However, only one of your power connections goes to the power pads. The others that go through the standard analog pads would be seeing about 10 squares' worth of metal3, which would be roughly 0.5 ohm. So for the two connects using 3 and 4 standard analog pads, you would be seeing an extra 170mohms and 125mohms, respectively.
w
"standard analog pad" here being the analog only pad with no drivers or anything that are only on caravan?
t
That's right.
w
Oh, hurm. I see.
I guess I am going to need to make some modifications to a board to use other pins as kelvin connections
also, metal current density stuff is all long term reliability concerns, right? I am pretty sure I am exceeding the current density limits in a few places...
t
Yes. I wouldn't worry much about electromigration on a test part.