In un posto in cui ho lavorato c'erano due campi di progettisti FPGA. Un campo che ho chiamato simula, simula, simula o è al cubo. L'altro campo riguardava il design.
I ragazzi al cubo usavano un simulatore come modelsim, avrebbero escogitato un progetto iniziale tramite metodi di codifica e \ o blocchi nella suite di design. Quindi avrebbero simulato e trovato le cose che non funzionavano, quindi avrebbero cambiato il codice. Questo processo è stato ripetuto più volte fino a quando non hanno avuto un design che ha funzionato.
Il campo di progettazione (che ho preferito) avrebbe disegnato la forma d'onda su carta (o carta digitale come visio), esattamente ciò che era richiesto. Quindi elaborare uno schema logico. Questo è un processo di auto-documentazione. Quindi il diagramma è stato tradotto in codice (il codice e il diagramma erano 1: 1 se c'era qualcosa nel diagramma, c'era un processo per esso nel codice). Quindi è stato simulato e la forma d'onda di simulazione è stata confrontata con la forma d'onda progettata su carta e ci si aspettava che fosse la stessa.
Ho finito per fare entrambe le cose, a volte sarei entrato in modalità cubo, e non è stato molto divertente. Ho scoperto di aver perso di vista il mio obiettivo a volte. Ad esempio, cambierei uno stato in una macchina a stati e il cambiamento si ridurrebbe allo stato successivo, quindi dovrei sistemarlo. Ho finito per passare più tempo che a pensarci.
In quale campo preferiresti essere? Penso che ci debba essere un design rigoroso, fare ciò che funziona per te, ma penso che più sei dettagliato e rigoroso nel progettare, meno problemi avrai a lungo termine. Ho fornito alcuni esempi di ciò che è possibile, potrebbero non adattarsi alla struttura organizzativa del luogo di lavoro. Il motivo per cui i dettagli di progettazione e un'attenta pianificazione sono così utili, è che ti costringe a pensare a cosa stai facendo. Semplifica il debug. Sviluppa un flusso di lavoro di progettazione che consenta che ciò accada. Inoltre, acquisisci familiarità con gli strumenti di simulazione e scrivi buoni banchi di prova che testeranno tutte le condizioni che potrebbero verificarsi sul dispositivo simulato. Questo ovviamente deve essere bilanciato con il tempo. Ad esempio, scrivi il codice ADL HDL che simulerà il dispositivo nelle tue simulazioni.
Lo strumento più prezioso da avere nella progettazione FPGA (a mio avviso) è una buona procedura di test che ti permetterà di testare completamente il tuo progetto ed eseguirlo a pieno ritmo. Non ci si può aspettare che un design FPGA "funzioni", ci vuole uno sforzo per assicurarsi che tutti i pezzi funzionino. Se riscontri errori, torna alla simulazione e al design e scopri quali sono le differenze tra un FPGA simulato e RTL. Ciò deriva principalmente dall'esperienza, ma se il design funziona in simulazione ma non nell'hardware, è necessario scoprire perché c'è una differenza.
Alcune cose chiave che ho imparato:
1) Disinfetta i tuoi input, i circuiti di clock e reset devono essere puliti o puoi far propagare la metastablità attraverso il tuo sistema. Scopri cos'è un sincronizzatore a doppio rango. Esistono molte topologie diverse per i circuiti di reset, sanno come usarle (c'è un ottimo articolo sul web, non ce l'ho a portata di mano).
2) Ottieni i requisiti del progetto in anticipo e poi disegna intorno a quelli. Se le persone intorno a te non ti daranno requisiti precisi, allora inventane alcuni per conto tuo.
3) La casella degli strumenti a punto fisso Matlab è ottima per simulare i sistemi di controllo e le applicazioni DSP, ma potresti non averne accesso. È un ottimo modo per dimostrare un progetto prima di codificare.
4) Il design viene prima di tutto, poi codifica, quindi simulazione.
5) Fortemente digitato, mantiene anche i nomi dei segnali coerenti sullo schema del pcb e sull'HDL. (Questo è anche il motivo per cui preferisco di gran lunga VHDL rispetto a Verilog.