Il firmware è un software eseguito su memoria di sola lettura (ROM) o qualcosa di simile. Il firmware è più solido del software perché il software può essere modificato da qualche parte lungo la catena da dove è memorizzato in alcuni supporti di lettura e scrittura e caricato in memoria scrivibile ed eseguito da lì.
Il firmware non può funzionare come codice di modifica automatica del posto. Il software può essere eseguito come codice in-place e auto-modificante.
Se riesci a pensare ad una ROM e ad una qualche forma di hardware programmabile, il "firmware" è una forma di hardware. Se riesci a pensare ad un FPGA come una forma di hardware programmabile, allora puoi pensare a FPGA Verilog e simili come a una forma di "firmware".
Con il passare del tempo, le linee tra software, firmware, hardware si offuscano sempre di più.