Los errores críticos se arreglan. Por lo general, se arreglan antes de que el producto entre en producción. A menos que esté utilizando muestras tempranas, es posible que nunca vea los peores errores.
Arreglar errores es difícil y costoso. No se trata solo de cambiar una línea de código RTL. Si hiciera eso, tendría que volver a sintetizar, rehacer el diseño físico, ajustar el diseño para solucionar cualquier problema de tiempo, comprar un conjunto de máscaras completamente nuevo, producir nuevas obleas, probar las obleas (normalmente), validar las nuevas correcciones y posiblemente caracterizar o calificar el producto nuevamente. Esto lleva meses y cuesta una cantidad de dinero angustiosa. Por esa razón, tratamos de corregir los errores directamente en el diseño (preferiblemente en una sola capa de metal). Esto es más rápido y más barato que comenzar desde la síntesis RTL, pero aún no es bueno.
Si de todos modos estamos solucionando un error crítico, ¿por qué no reparar también todos los demás errores? Nuevamente, esto lleva tiempo: tiempo para descubrir e implementar una solución, tiempo para volver a ejecutar las pruebas de verificación de diseño. Ese tiempo significa que llevará más tiempo sacar el próximo producto al mercado. Y mientras tanto, seguramente encontrará más errores en su producto actual si busca lo suficiente. Es una batalla perdida. Corregir errores es aún más difícil en un producto que ha estado fuera durante mucho tiempo, ya que las personas tienen que sumergirse en el diseño anterior para descubrir qué está sucediendo. Como dice Null, los clientes pueden tener que volver a calificar su producto en su sistema. Si su producto aún está en desarrollo, retrasar el lanzamiento de la producción puede hacer que los horarios de los clientes se desvanezcan, lo que los hace muy infelices.
Normalmente, los errores que quedan solo suceden en configuraciones extrañas, causan problemas muy pequeños, tienen soluciones fáciles o todo lo anterior. Simplemente no son lo suficientemente malos como para valer la pena. Y si reutiliza un módulo de hardware en el siguiente producto, sus clientes existentes ya tendrán la solución en su software de todos modos.
Las cadenas de herramientas de software son otro factor. Si un módulo permanece el tiempo suficiente, su cadena de herramientas podría cambiar lo suficiente como para que rehacer las antiguas pruebas de validación se convierta en un proyecto importante en sí mismo. Y probablemente no pueda simplemente cargar las herramientas antiguas, porque ya no está pagando por la licencia del sitio. Pero siempre que no cambie el módulo, puede seguir copiando y pegando en nuevas MCU.
El software también es un problema del lado del cliente. Si su corrección de errores rompe la compatibilidad con versiones anteriores de alguna manera, todos sus clientes tendrán que actualizar su código, para el cual tal vez ya no tengan las herramientas.
Como alguien que trabaja en el desarrollo de microcontroladores, puedo decirte que a todos nos encantaría solucionar cada error. Pero tratar de hacerlo retrasaría el desarrollo de manera impredecible, molestaría a los clientes, costaría una tonelada de dinero y, al final de todo, probablemente todavía fracasaríamos.