Quando si scrivono script personalizzati per l'analizzatore di temporizzazione, è necessario sapere in che modo le diverse funzioni API Tcl gestiscono e restituiscono i nomi delle entità e delle istanze nei nomi dei nodi. Nel software Quartus® II è presente un'impostazione chiamata Display entity name per il nome del nodo che controlla se i nomi dei nodi vengono visualizzati con o senza nomi di entità.
La funzione API Tcl get_registers può sempre accettare nomi che includono entità per il filtro, indipendentemente dall'impostazione del nome dell'entità display peril nome del nodo . La funzione get_registers restituisce sempre i nomi in base all'impostazione del nome dell'entità display per il nome del nodo.
Nella tabella 1 sono riportati esempi del nome del nodo restituito dal comando get_registers <filter>,in cui una progettazione include un registro denominato ram:my_ram|ctrl:ctrl_1|addr[0].
Tabella 1. Esempio di comportamento get_registers
Nome dell'entità visualizzata per il nome | del nodo Valore del nome del nodofiltro | restituito |
---|---|---|
ACCESO | ram:my_ram|ctrl:ctrl_1|addr[0] | ram:my_ram|ctrl:ctrl_1|addr[0] |
ACCESO | my_ram|ctrl_1|addr[0] | ram:my_ram|ctrl:ctrl_1|addr[0] |
FUORI | ram:my_ram|ctrl:ctrl_1|addr[0] | my_ram|ctrl_1|addr[0] |
FUORI | my_ram|ctrl_1|addr[0] | my_ram|ctrl_1|addr[0] |
Le funzioni API Tcl get_pins e get_cells si comportano in modo diverso rispetto a get_registers. Le funzioni get_pins e get_cells accettano e restituiscono solo nomi che contengono nomi di istanza. Non accettano o restituiscono nomi con entità, indipendentemente dal valore del nome dell'entità display per il nome del nodo.
La tabella 2 mostra esempi del nome del nodo restituito da get_pins <filter>,in cui una progettazione include un registro denominato ram:my_ram|ctrl:ctrl_1|addr[0] con un pin di clock denominato clk. La funzione get_cells si comporta allo stesso modo, anche se accetta e restituisce i nomi delle celle.
Tabella 2. Esempio di comportamento get_pins
Nome dell'entità visualizzata per il nome | del nodo Valore del nome del nodofiltro | restituito |
---|---|---|
ACCESO | ram:my_ram|ctrl:ctrl_1|addr[0]|clk | Nessuno1 |
ACCESO | my_ram|ctrl_1|addr[0]|clk | my_ram|ctrl_1|addr[0]|clk |
FUORI | ram:my_ram|ctrl:ctrl_1|addr[0]|clk | Nessuno1 |
FUORI | my_ram|ctrl_1|addr[0]|clk | my_ram|ctrl_1|addr[0]|clk |
Nota:
- La funzione get_pins genera un avviso che indica che il filtro specificato non può essere abbinato a un pin.
Quando si è a conoscenza della differenza nel modo in cui get_registers, get_pinse get_cells gestire e restituire i nomi dei nodi che includono entità, è possibile evitare problemi sottili che possono verificarsi quando si combinano le funzioni. L'esempio seguente mostra il codice che funziona quando il nome dell'entità display per il nome del nodo è disattivato, ma non riesce quando è acceso.
foreach_in_collection reg_id [get_registers foo*] { set reg_name [get_node_info -name $reg_id] # ... set pin_id [get_pins ${reg_name}|clk] # Se reg_name include entità, la chiamata get_pins ha sempre esito negativo }
Quando il nome dell'entità visualizzata per il nome del nodo è disattivato, la variabile reg_name non include i nomi di entità, quindi la chiamata get_pins ha esito positivo. Quando il nome dell'entità display per il nome del nodo è attivato, la variabile reg_name include i nomi delle entità, pertanto la chiamata get_pins non riesce.
Soluzioni
Il modo più semplice per evitare potenziali problemi è disattivare il nome dell'entità display per il nome del nodo e utilizzare solo i nomi di istanza per fare riferimento ai nodi. Questa soluzione garantisce che i nomi restituiti da get_registers siano solo nomi di istanza e funzionino con get_pins e get_cells.
Se non si disattiva il nome dell'entità visualizzata per il nome del nodoe si passano i nomi restituiti da get_registers a get_pins o get_cells, è necessario assicurarsi di rimuovere tutti i nomi di entità. È possibile utilizzare una semplice espressione regsub per rimuovere la maggior parte dei nomi di entità. Il seguente comando Tcl rimuove tutti i nomi di entità da un nome di nodo, purché i nomi dell'entità contengano solo lettere, cifre e caratteri di sottolineatura (caratteri nella classe di caratteri \w).
regsub -all {\w*:} $reg_name {} reg_name
Il modello di espressione regolare elencato non gestisce tutti i caratteri validi negli identificatori HDL. Non gestisce i nomi di entità generati che includono backslashes (\), il carattere simbolo dollaro ($) in semplici identificatori VERILOG HDL, identificatori HDL Verilog escape o identificatori estesi in VHDL. È possibile costruire espressioni regolari più avanzate per gestire i nomi delle entità con questi caratteri, ma è più semplice disattivare il nome dell'entità display per il nome del nodo.
L'esempio seguente mostra come integrare l'espressione regsub con l'esempio non funzionante sopra. Nell'esempio seguente, l'espressione regsub rimuove i nomi di entità dal nome del registro (soggetto alle esclusioni di caratteri descritte), in modo che la chiamata get_pins non fallisca. L'esempio funziona indipendentemente dal valore del nome dell'entità display per il nome del nodo.
foreach_in_collection reg_id [get_registers foo*] { set reg_name [get_node_info -name $reg_id] regsub -all {\w*:} $reg_name {} reg_name # reg_name non include più entità # ... set pin_id [get_pins ${reg_name}|clk] # reg_name non include più entità, quindi get_pins riesce }