Exemplo de Quartus® II Tcl: encontre um nó de sincronização

author-image

Por

Nós na netlist de sincronização quartus II são referidos com IDs, que são inteiros positivos. Cada nó tem um nome, o nome na netlist pós-montagem. Quando você trabalha com uma netlist de sincronização com comandos no pacote ::quartus::advanced_timing, é comum pesquisar por um nó com base em seu nome. Por exemplo, você pode querer rastrear o fanout de um pino de E/S específico. Para fazer isso, você precisa encontrar a ID do nó que tem o nome do pino que você deseja rastrear. O procedimento de exemplo a seguir pesquisa todos os nós de sincronização na lista de rede para saber o nome especificado e devolver a ID do nó correspondente ou -1, se ele não existir.

pacote necessário::quartus::advanced_timing proc encontrar { nome

} {
    
    foreach_in_collection node_id [get_timing_nodes -type all] { definir

        node_name [get_timing_node_info -info name $node_id]
           
        se { [string igual $name $node_name ] } { devolver
            $node_id
        } retornar   
    
    -1
}

Em um script Tcl, você pode chamar esse procedimento como mostrado no exemplo a seguir:

definir id [find clk_33MHz]
se { $id == -1 } { aviso tipo post_message "Não foi possível encontrar nó de pino de
    clock"
}

Melhorando o código de amostra

Há uma variedade de maneiras pelos quais o código de exemplo pode ser aprimorado.

Adicionar suporte curinga e várias IDs devolvidas

Exigir uma combinação exata torna-se inconveniente para nomes com longos caminhos de hierarquia. Mude o exemplo para suportar partidas de curinga facilita a busca por nós com caminhos de hierarquia longos. Com uma modificação adicional para devolver várias IDs de nó para todas as partidas, você pode usar o script para devolver grupos de IDs de nó. Isso facilita a iteração em todos os bits de um barramento, por exemplo.

Como um curinga pode corresponder a mais de um nome, é necessário suportar várias IDs devolvidas. Uma maneira fácil de fazer isso é devolver uma lista de todas as IDs de nó com nomes que correspondem ao padrão. Se nenhum nome corresponder ao padrão, uma lista vazia será devolvida.

O exemplo a seguir pesquisa todos os nós na netlist de sincronização e retorna uma lista com cada ID de nó que tenha um nome que corresponde ao padrão. Este exemplo usa a correspondência no estilo glob Tcl.com suporte para asteriscos (*), marcas de perguntas (?) e suportes quadrados ([]).

pacote necessário::quartus::advanced_timing proc encontrar { padrão { definir
    
    return_ids {} foreach_in_collection node_id
    [get_timing_nodes -type all] {

        definir node_name [get_timing_node_info -info name $node_id] se
           
        { [string match $pattern $node_name ] } {
            lappend return_ids $node_id
        } } retornar   
    
    $return_ids
}

Lembre-se de que a Tcl usa suportes quadrados para delimitar caracteres para corresponder no comando string match. Chamar o comando localizar como mostrado no exemplo a seguir corresponde a addr1 e addr0, não addr[10]!

set matches [find addr[10]]

Como os nomes de barramento usam suportes quadrados para indicar bits individuais, você deve escapar de padrões com suportes quadrados usados como seletores de bits de barramento. Ao chamar o comando localizar, conforme mostrado no exemplo a seguir.com o comando escape_brackets, retorna a ID do nó para o nó chamado addr[10].

set matches [find [find [find [escape_brackets addr[10]]

Você deve sempre usar o comando escape_brackets para escapar de padrões que você passa para o comando localizar, a menos que você pretenda usar suportes quadrados para indicar um intervalo de caracteres para corresponder.

Adicionar filtragem do tipo nó

Você pode querer restringir os tipos de nós que são pesquisados para um nome correspondente. Isso pode acelerar a pesquisa em um design com uma netlist de tempo grande. Você pode usar a opção -type para o comando get_timing_nodes para restringir os nós na coleção devolvida a pinos, registros, clocks e vários outros tipos de nós.

O exemplo a seguir é baseado no exemplo anterior de correspondência de padrões. Se nenhum padrão para especificado, ele será padrão em *, para corresponder a tudo. Há uma opção para restringir o tipo de nó, que é padrão para todos.

Este exemplo usa o pacote cmdline Tcl, incluído no software Quartus II, para configurar uma maneira fácil de passar argumentos para o procedimento de forma auto-documentável.

o pacote requer::quartus::advanced_timing pacote requer cmdline proc find { args } { opções de configuração
    
    {\
        { "pattern.arg" "*" "Pattern to search for" }
        \ { "type.arg" "all" "Node type to search" } \ } array set
    opts [:cmdline::get Args $options]

    set return_ids {} foreach_in_collection node_id
    [get_timing_nodes -type $opts(type)] {

        definir node_name [get_timing_node_info -info name $node_id]
           
        se { [string match $opts(pattern) $node_name ] } {
            lappend return_ids $node_id
        }
    }   
    
    devolução $return_ids
}

O código a seguir mostra algumas maneiras de usar o exemplo anterior.

# Devolve cada ID de nó na netlist de sincronização.
# Padrão padrão para * # Tipo padrão para todos encontrar # Voltarões de IDs de nó de todos os pinos na lista de sincronização # Padrão padrão para * encontrar -tipo pino # Retorna IDs de nó de pinos começando com addr find -pattern addr* -type pin # Retorna IDs de nó de registros no bit 0 de um barramento localizar
-padrão [escape_brackets *[0]] -reg tipo]

O conteúdo desta página é uma combinação de tradução humana e por computador do conteúdo original em inglês. Este conteúdo é fornecido para sua conveniência e apenas para informação geral, e não deve ser considerado completo ou exato. Se houver alguma contradição entre a versão em inglês desta página e a tradução, a versão em inglês prevalecerá e será a determinante. Exibir a versão em inglês desta página.