Rocketmagnet2
Newbie level 4

This is a question for anyone with experience designing or with a deep knowledge of volatile memory in an ASIC. E.g. chip designers or silicon process engineers.
We are using the ET1200 EtherCAT ASIC (datasheet) in one of our projects. First some background:
The ET1200 chip:
The ET1200 is a industrial Ethernet based networking chip that essentially gives a host PC and a microcontroller shared memory. The PC (over Ethernet) and microcontroller (over SPI) can both read and write into the small amount of dual-ported memory inside the ET1200.
Our project:
Out of 50 PCBs assembled, we have about 25 that showed symptoms of a strange bug. On some boards the bug was not seen at first, but then increasingly appeared more often, until eventually it was seen very often. Meanwhile, some boards never exhibited the bug.
What was the bug? Eventually, we tracked the bug down to a microcontroller reading uninitialised memory from the ET1200. I.e. after power up, and before the PC had written to any memory in the ET1200, the microcontroller would attempt to read that memory, but would obviously be reading uninitialised memory from the chip.
This firmware bug has now been fixed, but I'm still curious about the behaviour of the uninitialised memory inside the ET1200 ASIC.
Thoughts:
Presumably the memory was not being zeroed after the ASIC reset. Sometimes the memory would read mostly zeros (that doesn't cause a bug) and sometimes it would read lots of random numbers. Sometimes those random numbers would survive a power cycle. I don't know exactly what kind of RAM is in this chip.
Questions:
What kind of answers am I interested in?
I would like some insight into how non-volatile memory cells are constructed in a typical ASIC, and what mechanisms affect their reset value, and if there is a mechanism which affects their reset value over time. I am of course aware that the behaviour of uninitialised memory is undefined.
We are using the ET1200 EtherCAT ASIC (datasheet) in one of our projects. First some background:
The ET1200 chip:
The ET1200 is a industrial Ethernet based networking chip that essentially gives a host PC and a microcontroller shared memory. The PC (over Ethernet) and microcontroller (over SPI) can both read and write into the small amount of dual-ported memory inside the ET1200.
Our project:
Out of 50 PCBs assembled, we have about 25 that showed symptoms of a strange bug. On some boards the bug was not seen at first, but then increasingly appeared more often, until eventually it was seen very often. Meanwhile, some boards never exhibited the bug.
What was the bug? Eventually, we tracked the bug down to a microcontroller reading uninitialised memory from the ET1200. I.e. after power up, and before the PC had written to any memory in the ET1200, the microcontroller would attempt to read that memory, but would obviously be reading uninitialised memory from the chip.
This firmware bug has now been fixed, but I'm still curious about the behaviour of the uninitialised memory inside the ET1200 ASIC.
Thoughts:
Presumably the memory was not being zeroed after the ASIC reset. Sometimes the memory would read mostly zeros (that doesn't cause a bug) and sometimes it would read lots of random numbers. Sometimes those random numbers would survive a power cycle. I don't know exactly what kind of RAM is in this chip.
Questions:
- What factors might affect the probability that an uninitialised bit in the ET1200's memory will read as 0 or 1?
- Is it to be expected that some chips will appear to typically read all zeros, while other read random numbers?
- What are some actual, physical mechanisms that could cause chips to change behaviour of uninitialised RAM over time? I.e. start out reading mostly zeros, but eventually start reading lots of non-zeros. It's almost as if the memory is 'burning-in'. (warming or cooling the boards did not seem to help).
What kind of answers am I interested in?
I would like some insight into how non-volatile memory cells are constructed in a typical ASIC, and what mechanisms affect their reset value, and if there is a mechanism which affects their reset value over time. I am of course aware that the behaviour of uninitialised memory is undefined.