Quando você está fechando o timing de um projeto, é frequentemente útil saber quantos níveis de lógica estão em caminhos de falha. O Analisador de temporização exibe o número de níveis de lógica quando você informa o tempo de sincronização de um caminho, mas não há um relatório padrão que lista o número de níveis de lógica para um conjunto de caminhos. Este exemplo de projeto define um procedimento personalizado que você pode usar para criar relatórios que mostram o número de níveis de lógica para conjuntos de caminhos.
O procedimento personalizado suporta os mesmos argumentos que o report_timing comando. Você deve usar as mesmas opções com o procedimento personalizado que você faria com o report_timing comando. O procedimento personalizado também suporta três opções adicionais: -greater_than <value>, -less_than <value> e -file <report file>. Você pode usar as opções -greater_than e -less_than para limitar o relatório a caminhos com mais ou menos do que os níveis de lógica especificados. Você pode usar a opção -file para escrever o relatório em um arquivo.
O procedimento personalizado exibe os números de níveis de lógica para os caminhos com a pior folga de tempo. Ele não necessariamente exibe os caminhos no design com o maior número de níveis de lógica. Os caminhos com a pior folga de tempo nem sempre são os caminhos com o maior número de níveis de lógica, embora isso seja muitas vezes verdade.
Operação do procedimento
O procedimento personalizado usa as seguintes etapas.
- Obtenha uma lista de caminhos que atendam aos critérios de relatórios
- Obtenha o número de níveis de lógica para cada caminho
- Exibir o número de níveis de informações lógicas e de caminho em um gráfico
Etapa 1: obtenha uma lista de caminhos
O procedimento personalizado usa o comando get_timing_paths, que suporta os mesmos argumentos do report_timing comando. Você pode usar qualquer opção para report_timing para controlar a análise de tempo. Por exemplo, você pode restringir o relatório do número de níveis de lógica para caminhos que terminam em um determinado nome de registro. O código Tcl a seguir mostra a definição do procedimento e passa todos os argumentos para o get_timing_paths comando.
proc report_levels_of_logic { args } { Passar todos os argumentos direto para get_timing_paths se { [catch { eval get_timing_paths $args } paths_col] } { erro post_message-tipo $paths_col return } }
Etapa 2: obtenha o número de níveis de lógica para cada caminho
Use um loop para iterar sobre a coleção de caminhos na variável paths_col e extrair o número de níveis de lógica em cada caminho. Salve informações sobre o caminho em uma estrutura de dados da matriz Tcl que será usada para imprimir os resultados. As informações salvas são o número de níveis de lógica, a folga do caminho e os nomes de nó de origem e destino.
foreach_in_collection path_obj $paths_col { # Quantos níveis de lógica existem no caminho? set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Adicionar as informações de caminho a uma matriz. $logic_levels_matrix add row [list \ $levels_of_logic \ [get_path_info -slack $path_obj] \ [get_node_info -name [get_path_info -from $path_obj]] \ [get_node_info -name [get_path_info -to $path_obj]] ] ]
Etapa 3: Exibir informações sobre o caminho em um gráfico
Por fim, mostre todas as informações de caminho armazenadas na variável matriz. Este exemplo usa o pacote de relatório Tcl para formatar a matriz para imprimi-la. O código a seguir adiciona uma linha de título à matriz, define o estilo visual do relatório, define o preenchimento da célula e exibe o relatório.
# Coloque na linha de cabeçalho $logic_levels_matrix insert row 0 \ [list "Níveis de lógica" "Slack" "From" "To"] # Precisamos de um estilo definido para imprimir a tabela de captura de resultados { ::report::rmstyle basicrpt } ::report:report::d efstyle basicrpt {{cap_rows 1}} { conjunto de dados [divisão "[string repeat" [colunas];]] top set [split "[string repeat "+ - " [columns]+"] set inferior [top get] topcapsep set [top get] topdata set [data get] top enable topcapsep enable tcaption bottom enable tcaption $cap_rows } # Crie o relatório, defina as colunas para ter um espaço de preenchimento e # imprima a matriz com a captura do formato especificado { r destroy } ::report::report r 4 style basicrpt para { definir col 0 } { $col < [r colunas]} { incr col } { r pad $col ambos " " } post_message "Níveis de lógica\n[r printmatrix $logic_levels_matrix]".
Procedimento personalizado
O código para o procedimento personalizado listado abaixo inclui opções para escrever o relatório em um arquivo e limitar os caminhos relatados, a menos que o número de níveis de lógica seja maior ou menor do que os valores especificados pelo usuário.
Estes são alguns exemplos de como você pode usar o procedimento personalizado.
- report_levels_of_logic -setup -greater_than 10 a [get_registers dados*] -npaths 1000
- report_levels_of_logic -hold -from_clock core_50 -npaths 50 -file levels.txt
Para usar o procedimento personalizado, salve o código Tcl abaixo em um arquivo chamado report_levels_of_logic.tcl. Em seguida, use a fonte de comando report_levels_of_logic.tcl no prompt Do analisador de sincronização Tcl. A sourcing do arquivo define o procedimento personalizado. Em seguida, você pode usar o comando recém-definido report_levels_of_logic até sair do analisador de sincronização.
pacote requer pacote cmdline requer struct::pacote de matriz requer relatório proc report_levels_of_logic { args } { opções de conjunto { {"less_than.arg" "" "" "Limite para caminhos com menos que este número" } { "greater_than.arg" "" "" " "Limite para caminhos com maior que este número" } { "file.arg" "" "Nome do arquivo de saída" } conjunto de matriz optes [:cmdline::getKnownOptions args $options] # Certifique-se de que o procedimento seja chamado com alguns argumentos se { [string igual a "" $opts(less_than)] && [string igual a "" $opts(greater_than)] } { aviso do tipo post_message "Você deve especificar um valor numérico\ para -less_than ou -greater_than" retornar } # Certifique-se de que o procedimento seja chamado com valores de argumento numéricos se { ![ string é o dobro $opts(less_than)] } { aviso do tipo post_message "Você deve especificar um valor numérico\ para -less_than" de devolução } se { ![ string é o dobro $opts(greater_than)) } { aviso do tipo post_message "Você deve especificar um valor numérico\ para -greater_than" retornar } # Crie uma matriz para manter informações sobre os caminhos logic_levels_matrix [::struct::matrix] $logic_levels_matrix adicionar colunas 4 # Passe todos os argumentos desconhecidos direto para get_timing_paths se { [catch { eval get_timing_paths $args } paths_col] } { erro do tipo post_message -tipo $paths_col return } # Ande pela lista de caminhos de sincronização, obtendo informações # sobre os níveis de lógica foreach_in_collection path_obj $paths_col { Assumir que o caminho será relatado, a menos que o número de níveis de lógica # esteja fora dos limites especificados. definir include_path 1 # Quantos níveis de lógica existem no caminho? set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Se especificarmos um limite inferior, não relataremos o caminho se os níveis de lógica #são maiores ou iguais ao limite inferior se { ! [string igual a "" $opts(less_than)] } { se { $levels_of_logic >= $opts(less_than) } { definir include_path 0 } } # Se especificarmos um limite superior, não relataremos o caminho se os nºs de lógica são menores ou iguais ao limite superior se { ! [string igual a "" $opts(greater_than)] } { se { $levels_of_logic <= $opts(greater_than) } { definir include_path 0 } } # Se o caminho tiver níveis de lógica que se enquadram em nossos limites, # informe sobre ele se { $include_path } { $logic_levels_matrix add row [list \ $levels_of_logic \ [get_path_info -slack $path_obj] \ [get_node_info -name [get_path_info -from $path_obj]] \ [get_node_info -name [get_path_info -to $path_obj]] } } # Terminei de passar por todos os caminhos da get_timing_paths # Se houver alguma linha na matriz, os caminhos corresponderão aos critérios. # Temos que imprimir a tabela com essas informações. se { 0 == [$logic_levels_matrix rows] } { # Nenhum caminho atender aos critérios # Imprimir uma mensagem rápida post_message "Nenhum caminho atenderá aos critérios para relatar níveis de lógica" # Se houver um erro abrindo o arquivo, imprima uma mensagem dizendo # isso. Caso contrário, diga que não há caminhos que atenderão aos critérios se { ! [string igual a "" $opts(arquivo)] } { se { [catch { open $opts(file) w } fh] } { erro de tipo post_message "Não foi possível abrir o arquivo: $fh" } mais { coloca $fh captura "Nenhum caminho atenderá aos critérios para relatar níveis de lógica" $fh { fechar } } } mais { # Coloque na linha de cabeçalho $logic_levels_matrix insert row 0 \ [list "Níveis de lógica" "Slack" "From" "To"] # Precisamos de um estilo definido para imprimir a tabela de captura de resultados { :: relatório::rmstyle basicrpt } ::report::d efstyle basicrpt {{cap_rows 1}} { conjunto de dados [split "[string repeat " [colunas];"] top set [split "[string repeat "+ - " [columns]+"] set inferior [top get] topcapsep set [top get] topdata set [data get] top enable topcapsep enable tcaption bottom enable tcaption $cap_rows } # Crie o relatório, defina as colunas para ter um espaço de preenchimento e # imprima a matriz com a captura do formato especificado { r destroy } ::report::report r 4 style basicrpt para { definir col 0 } { $col < [r colunas]} { incr col } { r pad $col ambos " " } post_message "Níveis de lógica\n[r printmatrix $logic_levels_matrix]" # Salve o relatório em um arquivo se um nome de arquivo for especificado se { ! [string igual a "" $opts(arquivo)] } { se { [catch { open $opts(file) w } fh] } { erro de tipo post_message "Não foi possível abrir o arquivo: $fh" } outra { coloca $fh "Níveis de lógica" r printmatrix2channel $logic_levels_matrix $fh catch { fechar $fh } } } } }