Instância do analisador de sincronização e entidade em scripts

author-image

Por

Quando você escreve scripts personalizados para o analisador de sincronização, você deve estar ciente de como diferentes funções da API Tcl lidam e retornam nomes de entidades e instâncias em nomes de nó. Há uma configuração no software Quartus® II chamado Nome da entidade de exibição para nome do nó que controla se nomes de nó são exibidos com ou sem nomes de entidade.
A função API Tcl get_registers sempre pode aceitar nomes que incluem entidades para seu filtro, independentemente da configuração do nome da entidade de exibição para nome do nó. A get_registers sempre retorna nomes de acordo com a configuração do nome da entidade de exibição para nome do nó.
A Tabela 1 mostra exemplos do nome do nó devolvido pelo comando get_registers <filter>,onde um design inclui um registro chamado ram:my_ram|ctrl:ctrl_1|addr[0].

As funções da API Tcl get_pins e get_cells se comportam de forma diferente do get_registers. As funções get_pins e get_cells aceitam e retornam apenas nomes que contêm nomes de instância. Eles não aceitam ou devolvem nomes com entidades, independentemente do valor do nome da entidade de exibição para o nome do nó.
A Tabela 2 mostra exemplos do nome do nó devolvido pelo get_pins <filtro>,onde um design inclui um registro chamado ram:my_ram|ctrl:ctrl_1|addr[0] com um pino de clock chamado clk. A get_cells se comporta da mesma forma, embora aceite e retorne nomes de células.

Nota:

  1. A função get_pins produz um aviso indicando que o filtro especificado não pode ser correspondido a um pino.

Quando você estiver ciente da diferença na maneira como get_registers, get_pinse get_cells lidar e devolver nomes de nós que incluem entidades, você pode evitar problemas sutis que podem ocorrer quando você combina as funções. O exemplo a seguir mostra o código que funciona quando o nome da entidade de exibição para o nome do nó está desligado, mas falha quando ele está aceso.

foreach_in_collection reg_id [get_registers foo*] {
    definir reg_name [get_node_info -name $reg_id]
    # ...
    set pin_id [get_pins ${reg_name}|clk] # Se reg_name incluir entidades, a chamada get_pins
    sempre falha
}

Quando o nome da entidade de exibição do nome do nó está desativado, a variável reg_name não inclui nomes de entidades, de modo que a chamada get_pins é bem-sucedida. Quando o nome da entidade de exibição para nome do nó está ativo, a variável reg_name inclui nomes de entidades, de modo que a chamada get_pins falha.

Soluções

A maneira mais fácil de evitar problemas potenciais é desativar o nome da entidade de exibição para nome do nó e usar nomes de instância apenas para se referir a nós. Esta solução garante que os nomes devolvidos por get_registers sejam nomes apenas de instâncias e trabalhem com get_pins e get_cells.

Se você não desativar o nome da entidade de exibição para o nome do nó,e você passar os nomes devolvidos por get_registers para get_pins ou get_cells,certifique-se de remover todos os nomes da entidade. Você pode usar uma expressão simples de regsub para remover a maioria dos nomes de entidades. O comando Tcl a seguir remove todos os nomes de entidade de um nome de nó, desde que os nomes da entidade contenham apenas letras, dígitos e sublinhados (caracteres na classe \w de caracteres).

regsub -all {\w*:} $reg_name {} reg_name

O padrão de expressão regular listado não lida com cada caractere válido nos identificadores HDL. Ele não lida com nomes de entidades gerados que incluem backslashes (\), o caractere de sinal de dólar ($) em identificadores HDL verilog simples, identificadores HDL de Verilog escapados ou identificadores estendidos em VHDL. Você pode construir expressões regulares mais avançadas para lidar com nomes de entidades com esses caracteres, mas é mais simples desligar o nome da entidade de exibiçãopara o nome do nó .
O exemplo a seguir mostra como integrar a expressão regsub com o exemplo de não-trabalho acima. No exemplo a seguir, a expressão regsub remove nomes de entidades do nome do registro (sujeito às exclusões de caracteres descritas), de modo que a get_pins chamada não falha. O exemplo funciona independentemente do valor do nome da entidade de exibição para o nome do nó.

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 não inclui mais
    entidades #
    ...
    set pin_id [get_pins ${reg_name}|clk] nº reg_name não inclui mais
    entidades, então get_pins consegue
}

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.