Para las similitudes, ambos se basan en gran medida en la lógica, y ambos son deterministas; es decir, a menos que algo vaya mal, dadas las mismas entradas, un sistema de hardware o software debería comportarse igual.
Algunos aspectos del diseño de hardware se parecen más al software. El diseño de FPGA, por ejemplo, se realiza con archivos fuente que se parecen mucho a C. Sin embargo, eso no significa que un programador pueda diseñar una FPGA sin saber nada más: para el diseño de FPGA, hay que ser mucho más consciente de qué tipo de recursos se acaban de gastar, en forma de puertas de entrada, puertas regulares, puertas de salida, multiplicadores y ciclos de reloj, de lo que se haría en C normal. Algunas construcciones normales de C (sentencias switch, por ejemplo) se expandirán geométricamente si se les deja.
En cuanto a las diferencias, en el software, nunca hay que preocuparse por la física. Considere que un nanosegundo es alrededor de 6 pulgadas de largo en el cobre. Como ingeniero de software, eso no significa nada para ti, pero como diseñador a nivel de placa, lo significa todo. Significa que la idea de un pulso de reloj en una mitad de su tablero moderadamente grande está fuera de fase con el pulso de reloj en la otra mitad. ¿Qué hacer si necesito que los elementos de toda la placa se sincronicen, y por supuesto necesito que se sincronicen?
Luego está el coste. ¿Cuál es el coste de fastidiar la construcción de tu software, por ejemplo, añadiendo un error importante? Pues, por regla general, todo lo que has perdido es el tiempo que te llevará reconstruirlo. ¿En hardware? Puede que tengas que volver a reiniciar una placa (hacerla reconstruir fuera), con un coste de semanas y potencialmente de decenas de miles de dólares.
Eso se vuelve ridículamente caro cuando hablas de volver a reiniciar ASICS. El NRE (gasto no recuperable) para un ASIC puede ser de millones.
Esa es una de las razones por las que los ASIC (CI de aplicación específica) están en desuso en gran parte del mundo del hardware, en favor de las FPGA de alta densidad. Con una FPGA, un error generalmente cuesta el mismo tiempo de reconstrucción que el software (aunque los tiempos de construcción son más largos). Eso hace que la prima por unidad que se paga por las últimas FPGAs merezca la pena en muchos casos.
Ningún director de ingeniería quiere escuchar que un error ordinario en un ASIC le va a costar unos meses y unos cuantos millones de dólares. "Bien", dice, "usaré la FPGA de 300 dólares sólo para evitar el riesgo de eso".
A veces, una vez que un diseño de FPGA está probado, un equipo de diseño puede optar por convertirlo en un ASIC. Depende, en ese momento, del número de unidades que vaya a vender y de si el ahorro por unidad justifica el NRE.
Una diferencia más es que las herramientas para el diseño de hardware, en particular el diseño de ASIC, son muy caras y requieren toneladas y toneladas de computación. Son los tipos que necesitan un clúster Beowulf de 64 nodos para mantener sus construcciones manejables. ¿Y el software? Dame un portátil fabricado en los últimos 10 años, y puede que incluso las herramientas gratuitas de Linux sean lo suficientemente buenas; un tipo de software puede literalmente hacer su trabajo con cosas de 50 dólares en muchos casos.