Get_ports vs. Get_pins vs. Get_nets vs. Get_registers

Ich mache ein Design in vhdl für FPGA. Ich habe ein Top-Level-Design, das aus 3 Komponenten besteht: Taktteiler, Module_1 und Module_2. Die Entität der obersten Ebene hat einen Takteingangsport. Diese Uhr wird durch den Taktteiler geteilt, um zwei andere Uhren zu erhalten: Uhr_1 und Uhr_2. Sie werden den Taktports von Module_1 bzw. Module_2 zugeführt.

Ich möchte alle diese Uhren einschränken. Wie also entscheiden, ob get_ports oder get_pins oder get_nets oder get_registers verwendet werden müssen? Ich habe get_ports für die Hauptuhr verwendet. Was ist mit den anderen beiden? Ich kann diese generierten Takte unter get_pins und get_nets und get_registers im Timing Analyzer von Quartus II sehen. Auch die Uhrnamen sehen dort anders aus mit einigen Suffixen wie '_var' , '~clk' etc. Gibt es spezielle Regeln für get_pins und get_nets und get_registers ?

Antworten (1)

I/Os des Top-Level-Blocks werden als Port bezeichnet , I/Os der Unterblöcke werden als Pin bezeichnet . So get_portsund get_pinsBefehle müssen entsprechend verwendet werden.

Wenn der Haupttakt ein Eingang des Blocks der obersten Ebene ist, get_portsist der entsprechende Befehl. Zum Beispiel:

create_clock -name CLK [get_ports clock_main] ...

Da clock_1und clock_2die Eingänge der Unterblöcke sind, get_pinsmüssen in diesem Fall verwendet werden.

create_clock -name CLK1 [get_pins Module_1/clock_1] ...
create_clock -name CLK2 [get_pins Module_2/clock_2] ...

Die Signale außer den I/Os heißen net . Die Netze können mithilfe von get_netsBefehlen gesammelt und eingeschränkt werden, die meisten Synthesewerkzeuge optimieren sie jedoch oder ändern die Namen. Es ist besser, die Verwendung zu vermeiden, get_netswenn dies nicht obligatorisch ist. Ansonsten benötigen die meisten Synthesewerkzeuge dont_touchAttribute oder ähnliches, um das Netz zu halten.

Normalerweise verwende ich command nicht get_registers, da es vom Synopsys Design Compiler nicht unterstützt wird, verwende ich get_cellsstattdessen. Im Gegenteil, Quartus II unterstützt get_registerslaut Alteras SDC-Handbuch .

Es kann auch verwendet werden, um die Uhr einzuschränken. Das Handbuch enthält das folgende Beispiel:

create_generated_clock -divide_by 2 -source [get_ports clk] -name clkdiv \
  [get_registers clkdiv]

Alternativ können Sie get_pinsden Befehl verwenden. Es liegt an Ihnen.

create_generated_clock -divide_by 2 -source [get_ports clk] -name clkdiv \
  [get_pins clkdiv/Q]

Wenn Sie einen solchen Taktteiler in Ihrem Design haben, ist es besser, ihn auf das Register oder den Q-Pin zu beschränken als auf den Takteingang eines Unterblocks (z. B. Module_1). Andernfalls weiß das Synthesetool nicht, ob der Pfad ein Taktsignal zwischen dem Register und dem clock_1Pin führt. Die Verzögerung des Pfades wird nicht in die Timing-Analyse usw. einbezogen.

Synthesewerkzeuge fügen üblicherweise Suffixe zu den Signal- und Zellnamen hinzu. Jedes Tool hat seine eigenen Benennungsregeln. Zum Beispiel fügt mein Tool _regden gefloppten Signalen ein Suffix hinzu.

Sie meinen, es ist besser, den Ausgangs-Q-Pin des Taktteilermoduls (get_register) als den Eingangspin (get_pin) von module_1 zu beschränken?
@MITURAJ Ja. Es gibt noch einen weiteren Vorteil. Wenn Sie dieselbe geteilte Uhr später mit einem dritten Unterblock (z. B. Modul_3) verbinden, müssen Sie dafür keine neue Einschränkung hinzufügen. Eine Beschränkung des Q-Pins breitet sich zu allen Senken dieses Takts aus.
Ach ja!! Toller Punkt. Habe lange nach dieser Antwort gesucht. Prost Bruder 👍