Nachdem ich im Internet und in einigen Schulungen mehrere, manchmal widersprüchliche oder unvollständige Informationen darüber gefunden habe, wie man Timing-Constraints im SDC-Format korrekt erstellt, möchte ich die EE-Community um Hilfe bei einigen allgemeinen Takterzeugungsstrukturen bitten, auf die ich gestoßen bin.
Ich weiß, dass es Unterschiede gibt, wie man eine bestimmte Funktionalität auf einem ASIC oder FPGA implementiert (ich habe mit beiden gearbeitet), aber ich denke, es sollte einen allgemeinen, korrekten Weg geben, das Timing einer bestimmten Struktur unabhängig davon einzuschränken zugrunde liegende Technologie - lassen Sie es mich bitte wissen, wenn ich da falsch liege.
Es gibt auch einige Unterschiede zwischen verschiedenen Tools zur Implementierung und Zeitanalyse verschiedener Anbieter (obwohl Synopsys einen SDC-Parser-Quellcode anbietet), aber ich hoffe, dass es sich hauptsächlich um ein Syntaxproblem handelt, das in der Dokumentation nachgeschlagen werden kann.
Hier geht es um die folgende Clock-Multiplexer-Struktur, die Teil des clkgen -Moduls ist, das wiederum Teil eines größeren Designs ist:
Während ext_clk
davon ausgegangen wird, dass die Eingabe extern zum Design generiert wird (Eingabe durch einen Eingabestift), werden die clk0
und clk4
-Signale auch vom clkgen -Modul generiert und verwendet (siehe meine verwandte Ripple-Clock-Frage für Details) und haben zugehörige Clock-Einschränkungen mit den Namen baseclk
und div4clk
. bzw.
Die Frage ist, wie man die Einschränkungen so spezifiziert, dass der Timing-Analysator
cpu_clk
, der einer der Quelltakte ( fast_clk
oder slow_clk
oder ext_clk
) sein kann, wobei die Verzögerungen durch die verschiedenen UND- und ODER-Gatter berücksichtigt werdenWährend der einfachste Fall eines On-Chip-Taktmultiplexers nur die set_clock_groups
SDC-Anweisung zu erfordern scheint :
set_clock_groups -logically_exclusive -group {baseclk} -group {div4clk} -group {ext_clk}
...in der gegebenen Struktur wird dies durch die Tatsache erschwert, dass clk0
(via the fast_clk
output) und clk4
(via slow_clk
) immer noch im Design verwendet werden, auch wenn cpu_clk
so konfiguriert ist, dass ext_clk
nur use_ext
dann behauptet wird.
Wie hier beschrieben , set_clock_groups
würde der obige Befehl Folgendes bewirken:
Dieser Befehl entspricht dem Aufruf von set_false_path von jeder Uhr in jeder Gruppe zu jeder Uhr in jeder anderen Gruppe und umgekehrt
... was falsch wäre, da die anderen Uhren noch woanders verwendet werden.
Die Eingänge use_clk0
, use_clk4
und use_ext
werden so generiert, dass jeweils nur einer von ihnen hoch ist. Während dies verwendet werden könnte, um alle Takte anzuhalten, wenn alle use_*
Eingänge niedrig sind, liegt der Schwerpunkt dieser Frage auf der Takt-Multiplexing-Eigenschaft dieser Struktur.
Die X2 -Instanz (ein einfacher Puffer) im Schaltplan ist nur ein Platzhalter, um das Problem hervorzuheben, dass automatische Place&Route-Tools normalerweise überall Puffer platzieren können (z. B. zwischen den and_cpu_1/z
und or_cpu1/in2
Pins). Im Idealfall sollten die zeitlichen Beschränkungen davon unberührt bleiben.
Definieren Sie auf den and_*-Netzen Teile durch 1 und deklarieren Sie sie als physikalisch exklusiv. Der Cadence RTL-Compiler handhabt die Situation korrekt, indem er 3 Timing-Pfade für Register generiert, die von cpu_clk getaktet werden (jeweils ein Pfad für einen Takt). Register, die direkt von clk0, clk4 und clk_ext angesteuert werden, haben ihre eigenen Zeitbögen.
create_generated_clock -source [get_ports clk0] \
-divide_by 1 -name and_clk0 [get_pins and_cpu_1/Y]
create_generated_clock -source [get_ports clk4] \
-divide_by 1 -name and_clk4 [get_pins and_cpu_2/Y]
create_generated_clock -source [get_ports clk_ext] \
-divide_by 1 -name and_clk_ext [get_pins and_cpu_ext1/Y]
set_clock_groups \
-physically_exclusive \
-group [get_clocks and_clk0] \
-group [get_clocks and_clk4] \
-group [get_clocks and_clk_ext]
cast_clk
, cpu_clk
und slow_clk
immer noch überprüft werden (dh keine Ausnahme aufgrund der exklusiven Taktgruppen), während sie gleichzeitig durch ihre jeweiligen Eingangstakte eingeschränkt werden? Letztendlich suche ich nach einer maßgeblichen Antwort auf diese Frage.
Travisbartley
FriendFX