ASIC-Timing-Einschränkungen über SDC: Wie wird ein Multiplex-Takt korrekt angegeben?

Einführung

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.

Frage

Hier geht es um die folgende Clock-Multiplexer-Struktur, die Teil des clkgen -Moduls ist, das wiederum Teil eines größeren Designs ist:Schaltplan des Taktmultiplexers

Während ext_clkdavon ausgegangen wird, dass die Eingabe extern zum Design generiert wird (Eingabe durch einen Eingabestift), werden die clk0und 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 baseclkund div4clk. bzw.

Die Frage ist, wie man die Einschränkungen so spezifiziert, dass der Timing-Analysator

  1. Wird als gemultiplexter Takt behandelt cpu_clk, der einer der Quelltakte ( fast_clkoder slow_clkoder ext_clk) sein kann, wobei die Verzögerungen durch die verschiedenen UND- und ODER-Gatter berücksichtigt werden
  2. Gleichzeitig werden die Pfade zwischen den Quelltakten, die an anderer Stelle im Design verwendet werden, nicht unterbrochen.

Während der einfachste Fall eines On-Chip-Taktmultiplexers nur die set_clock_groupsSDC-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_clkoutput) und clk4(via slow_clk) immer noch im Design verwendet werden, auch wenn cpu_clkso konfiguriert ist, dass ext_clknur use_extdann behauptet wird.

Wie hier beschrieben , set_clock_groupswü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.

zusätzliche Information

Die Eingänge use_clk0, use_clk4und use_extwerden 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/zund or_cpu1/in2Pins). Im Idealfall sollten die zeitlichen Beschränkungen davon unberührt bleiben.

Könnten Sie versuchen, dies prägnanter zu machen, indem Sie es auf eine sehr spezifische, sehr enge Frage eingrenzen? Es fällt mir schwer zu verstehen, was wichtige Informationen sind und worauf Sie hier wirklich hinaus wollen.
@trav1s: Ich habe die Frage umstrukturiert. Bitte lassen Sie mich wissen, wenn Sie eine Klärung benötigen.

Antworten (1)

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]
Danke für Ihren Vorschlag. Leider kann ich das derzeit nicht verifizieren, aber Ihr Konzept sieht für mich recht vielversprechend aus. Könnten Sie überprüfen, ob die Pfade zwischen cast_clk, cpu_clkund slow_clkimmer 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.
@FriendFX Ich habe den Code im RTL-Compiler getestet und die Pfade werden korrekt abgeleitet.
Nur um Sie wissen zu lassen, habe ich einige Informationen über Single-Cell-Clock-Multiplexer und eine Lösung (zumindest für einige Tools) hinzugefügt.