Ich beschäftige mich gerade mit der Timing Analyse von einem FPGA
Design. Momentan sind laut den Synthese Ergebnissen 33MHz als maximale
Taktfrequenz möglich und die angestrebte Frequenz ist 42MHz. Dabei
scheint es so zu sein, dass viele der krischen Pfade irgendwas mit
meinem synchronen Reset zu tun haben.
In der Netzliste kann ich sehen, dass das Reset Signal teilweise über
einen haufen LUTs läuft bis es dann auf dem Daten Eingang eines Flip
Flops endet. Ich frage mich nun warum nicht der synchrone Reset Eingang
des FF benutzt wird, denn das sollte vom Timing ja schneller sein als
irgendwelche Logik davor. Bei einigen FFs wird allerdings wie erwartet
der Reset Eingang benutzt, allerdings völlig ohne System. Selbst beim
gleichen std_logic_vector sind beiden Varianten vertreten. Wieso wird
nicht immer der Reset Eingang benutzt?
Ich habe auch mal mit verschiedenen VHDL schreibweisen rumprobiert.
Anfangs sah mein Reset wie folgt aus:
1 | process begin
|
2 | wait until rising_edge(clk);
|
3 | if rst = '1' then
|
4 | -- perform reset
|
5 | else
|
6 | -- normal operation
|
7 | end if;
|
8 | end process;
|
Testweise habe ich dann auch noch folgendes ausprobiert:
1 | process begin
|
2 | wait until rising_edge(clk);
|
3 | -- normal operation
|
4 | if rst = '1' then
|
5 | -- perform reset
|
6 | end if;
|
7 | end process;
|
Meiner Meinung nach sollten beide Varianten identisch sein, wenn im
Reset alle Signale zurück gesetzt werden. Im getesten Code war dies der
Fall, und aus irgendwelchen Gründen hat die zweite Variante 2 Slices
weniger gebraucht und ein etwas niedrigere maximale Taktfrequenz.
Dazu finde ich auch die Einstellungen zur Optimierung des Systhese Tools
sehr merkwürdig. Wenn ich auf Area optimiere kommt als maximale Frequenz
35MHz raus, statt 32MHz wie wenn ich auf Timing optimiere.
Verwendeter FPGA ist der Lattice MachXO2 mit LSE als Synthese Tool.