Wenn Sie benutzerdefinierte Skripts für den Timing Analyzer schreiben, sollten Sie wissen, wie unterschiedliche Tcl-API-Funktionen Entitäts- und Instanznamen in Knotennamen verarbeiten und zurücksanden. Es gibt eine Einstellung in der Quartus® II Software, die "Entitätsnamen für Knotennamen anzeigen" genannt wird und steuert, ob Knotennamen mit oder ohne Entitätsnamen angezeigt werden.
Die Tcl-API-Funktion get_registers kann immer Namen akzeptieren, die Entitäten für seinen Filter enthalten, unabhängig von der Einstellung "Entitätsnamen für Knotennamen anzeigen". Die get_registers-Funktion gibt immer Namen entsprechend der Einstellung "Entitätsname anzeigen" für den Knotennamenzurück.
Tabelle 1 zeigt Beispiele für den Knotennamen, der durch den Befehl get_registers <filter>zurückgegeben wird, wobei ein Design ein Register namens ram:my_ram|ctrl:ctrl_1|addr[0]enthält.
Tabelle 1. Beispiel für get_registers Verhalten
Entitätsname für Knotennamenwert | deszurückgegebenen Filterknotennamens | anzeigen|
---|---|---|
AUF | RAM:my_ram|ctrl:ctrl_1|addr[0] | RAM:my_ram|ctrl:ctrl_1|addr[0] |
AUF | my_ram|ctrl_1|addr[0] | RAM:my_ram|ctrl:ctrl_1|addr[0] |
AUS | RAM:my_ram|ctrl:ctrl_1|addr[0] | my_ram|ctrl_1|addr[0] |
AUS | my_ram|ctrl_1|addr[0] | my_ram|ctrl_1|addr[0] |
Die Tcl-API-Funktionen get_pins und get_cells sich anders verhalten als get_registers. Die get_pins- und get_cells-Funktionen akzeptieren und senden nur Namen mit Instanznamen. Sie akzeptieren keine Namen oder geben Sie Namen mit Entitäten zurück, unabhängig vom Wert des Angezeigten Entitätsnamens für den Knotennamen.
Tabelle 2 zeigt Beispiele für den Knotennamen, der von get_pins <filter>zurückgegeben wird, wobei ein Design ein Register namens ram:my_ram|ctrl:ctrl_1|addr[0] mit einem Taktstift namens clk enthält. Die get_cells-Funktion verhält sich auf die gleiche Weise, obwohl sie Zellennamen akzeptiert und zurückgibt.
Tabelle 2. Beispiel für get_pins Verhalten
Entitätsname für Knotennamenwert | deszurückgegebenen Filterknotennamens | anzeigen|
---|---|---|
AUF | RAM:my_ram|Ctrl:ctrl_1|addr[0]|CLK | Keine1 |
AUF | my_ram|ctrl_1|addr[0]|CLK | my_ram|ctrl_1|addr[0]|CLK |
AUS | RAM:my_ram|Ctrl:ctrl_1|addr[0]|CLK | Keine1 |
AUS | my_ram|ctrl_1|addr[0]|CLK | my_ram|ctrl_1|addr[0]|CLK |
Hinweis:
- Die get_pins-Funktion generiert eine Warnung, die darauf hinweist, dass der angegebene Filter nicht mit einem Stift abgeglichen werden konnte.
Wenn Sie sich des Unterschieds in der Art und Weise bewusst sind, wie get_registers, get_pins,und Knotennamen get_cells verarbeiten und zurückschicken, die Entitäten umfassen, können Sie subtile Probleme vermeiden, die auftreten können, wenn Sie die Funktionen kombinieren. Das nachstehende Beispiel zeigt Code, der funktioniert, wenn der Entitätsname für den Knotennamen anzeigen ausgeschaltet ist, aber fehlschlägt, wenn er eingeschaltet ist.
foreach_in_collection reg_id [get_registers_id*] { set reg_name [get_node_info -name $reg_id] # ... set pin_id [get_pins ${reg_name}|clk] # Wenn reg_name Entitäten umfasst, schlägt der get_pins Aufruf immer fehl }
Wenn der Entitätsname für den Knotennamen aus ist, enthält die Variable reg_name keine Entitätsnamen, wodurch der get_pins Aufruf erfolgreich ist. Wenn der Entitätsname für den Knotennamen angezeigt ist, enthält die Variable reg_name Entitätsnamen, wodurch der get_pins Aufruf fehlschlägt.
Lösungen
Der einfachste Weg, um potenzielle Probleme zu vermeiden, besteht darin, den Display-Entitätsnamen für Knotennamen zu deaktivieren und nur Instanznamen zu verwenden, um sich auf Knoten zu beziehen. Diese Lösung stellt sicher, dass die von get_registers zurückgegebenen Namen nur Instanznamen sind und mit get_pins und get_cellsfunktionieren.
Wenn Sie den Entitätsnamen für Knotennamenanzeigen nicht deaktivieren und Namen, die von get_registers an get_pins oder get_cellszurückgegeben werden, übergeben, müssen Sie sicherstellen, dass Sie alle Entitätsnamen entfernen. Sie können einen einfachen Regsub-Ausdruck verwenden, um die meisten Entitätsnamen zu entfernen. Mit dem folgenden Tcl-Befehl werden alle Entitätsnamen von einem Knotennamen entfernt, solange die Entitätsnamen nur Buchstaben, Ziffern und Unterstriche (Zeichen der Zeichenklasse \w) enthalten.
regsub -all {\w*:} $reg_name {} reg_name
Das aufgelistete Muster für regulären Ausdruck verarbeitet nicht jedes gültige Zeichen in HDL-Kennungen. Es verarbeitet keine generierten Entitätsnamen, die Backslashes (\), das Dollarzeichenzeichen ($) in einfachen Verilog HDL-Kennungen, verfälschte Verilog HDL-Kennungen oder erweiterte Kennungen in VHDL enthalten. Sie können erweiterte reguläre Expressions erstellen, um Entitätsnamen mit diesen Zeichen zu verarbeiten, aber es ist einfacher, den Namen der Angezeigten Entität für den Knotennamenzu deaktivieren.
Das nachstehende Beispiel zeigt, wie Sie den Regsub-Ausdruck mit dem oben genannten, nicht funktionierenden Beispiel integrieren. Im folgenden Beispiel entfernt der Regsub-Ausdruck Entitätsnamen aus dem Registernamen (vorbehaltlich der beschriebenen Zeichenausschlüsse), damit der get_pins Aufruf nicht fehlschlägt. Das Beispiel funktioniert unabhängig vom Wert des Entitätsnamens anzeigen für den Knotennamen.
foreach_in_collection reg_id [get_registers_name*] { set reg_name [get_node_info -name $reg_id] regsub -all {\w*:} $reg_name {} reg_name # reg_name enthält keine Entitäten # mehr ... setzen Pin_id [get_pins ${reg_name}|clk] # reg_name enthält keine Entitäten mehr, sodass get_pins erfolgreich ist }