Einführung
Nachdem ich im Internet und in einigen Schulungskursen mehrere, manchmal widersprüchliche oder unvollständige Informationen zum korrekten Erstellen von Zeitbeschränkungen im DEZA-Format gefunden habe , möchte ich die EE-Community um Hilfe bei einigen allgemeinen Taktgenerierungsstrukturen bitten, auf die ich gestoßen bin.
Ich weiß, dass es Unterschiede gibt, wie man eine bestimmte Funktionalität auf einem ASIC oder FPGA implementieren würde (ich habe mit beiden gearbeitet), aber ich denke, es sollte einen allgemeinen, korrekten Weg geben, um das Timing einer bestimmten Struktur unabhängig von der zu beschränken zugrunde liegende Technologie - bitte lassen Sie mich wissen, wenn ich mich irre.
Es gibt auch einige Unterschiede zwischen verschiedenen Tools für die Implementierung und Timing-Analyse 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.
Frage
Hierbei handelt es sich um die folgende Taktmultiplexerstruktur, die Teil des clkgen- Moduls ist, das wiederum Teil eines größeren Designs ist:
Während der ext_clk
Eingabe in das Design (Eingabe über einen Eingabestift) extern erzeugt werden angenommen wird, die clk0
und clk4
werden Signale auch von dem erzeugten und verwendeten CLKGEN Modul (siehe meine verwandten Ripple - Clock Frage für Details) und haben Taktbeschränkungen zugeordnet benannt baseclk
und div4clk
, beziehungsweise.
Die Frage ist, wie die Einschränkungen so festgelegt werden, dass der Timing-Analysator
- Behandelt
cpu_clk
als Multiplex-Takt, der entweder einer der Quellentakte (fast_clk
oderslow_clk
oderext_clk
) sein kann, wobei die Verzögerungen durch die verschiedenen UND- und ODER-Gatter berücksichtigt werden - Gleichzeitig werden die Pfade zwischen den Quellentakten, die an anderer Stelle im Design verwendet werden, nicht abgeschnitten.
Während der einfachste Fall eines On-Chip-Taktmultiplexers nur die set_clock_groups
DEZA-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
(über die fast_clk
Ausgabe) und clk4
(über slow_clk
) immer noch im Entwurf verwendet werden, selbst wenn cpu_clk
konfiguriert ist, ext_clk
wenn nur use_ext
behauptet wird.
Wie hier beschrieben , würde der set_clock_groups
obige Befehl Folgendes verursachen:
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.
zusätzliche Information
Die use_clk0
, use_clk4
und use_ext
Eingänge sind in einer solchen Weise erzeugt , dass nur einer von ihnen zu einem gegebenen Zeitpunkt hoch ist. Während dies verwendet werden könnte, um alle Takte zu stoppen, wenn alle use_*
Eingänge niedrig sind, liegt der Fokus dieser Frage auf der Taktmultiplexeigenschaft dieser Struktur.
Die X2- Instanz (ein einfacher Puffer) im Schaltplan ist nur ein Platzhalter, um das Problem hervorzuheben, dass automatische Platzierungs- und Routenwerkzeuge normalerweise frei sind, um Puffer an einer beliebigen Stelle (z. B. zwischen den Stiften and_cpu_1/z
und or_cpu1/in2
) zu platzieren. Idealerweise sollten die zeitlichen Einschränkungen davon nicht betroffen sein.