Exemplo de Quartus® II Tcl: tornar todos os pinos virtuais

author-image

Por

Se você usar um fluxo de projeto de região de bloqueio lógico modular em seu projeto, você pode optar por fazer todos os pinos de E/S em um módulo virtual de pinos de E/S como uma maneira de importar facilmente o módulo em um design de alto nível. Além disso, se você quiser compilar um núcleo IP para ver quantos recursos ele usa, mas ele usa muitos pinos para o seu dispositivo de destino, tornando os pinos virtuais podem permitir que o núcleo se encaixe.

O procedimento simples a seguir torna todos os pinos em seus pinos de E/S virtuais de design. Primeiro, o design é sintetizado para determinar quais nós são pinos. Em seguida, uma coleção de IDs de nomes é definida para corresponder aos pinos no design e, em seguida, uma VIRTUAL_PIN é aplicada a cada pino. Por fim, o export_assignments escreve todas as novas atribuições para o arquivo de configurações Quartus II do projeto (.qsf).

O exemplo usa os comandos get_names e get_name_info, que estão disponíveis a partir da versão 4.0 do software Quartus II (versão 2.0 do pacote ::quartus::p roject). Consulte o último exemplo nesta página para obter um código que funcionará a partir da versão 3.0 do software Quartus II e tenha recursos mais avançados.

load_package flow

proc make_all_pins_virtual {} { execute_module -tool map set name_ids

    [get_names -filter * -node_type pin]

    foreach_in_collection name_id $name_ids {
        definir pin_name [get_name_info -info full_path $name_id] post_message "Fazendo uma tarefa VIRTUAL_PIN para
        $pin_name"
        set_instance_assignment -para $pin_name -name VIRTUAL_PIN ON
    } export_assignments
}

Melhorando o código de amostra

Há uma variedade de maneiras pelas quais o código de amostra pode ser aprimorado.

Remova as atribuições VIRTUAL_PIN existentes

Você pode adicionar o comando a seguir ao início do procedimento para remover todas as atribuições VIRTUAL_PIN existentes. Esta é uma etapa útil para garantir que as atribuições estejam em um estado conhecido. Adicione este comando antes do execute_module comando.

remove_all_instance_assignments nome VIRTUAL_PIN

Excluir manualmente certos pinos, como clocks

Para que o software Quartus II execute otimização de tempo conforme se encaixa em um design, os clocks devem ser conectados a pinos de E/S de alto nível no dispositivo de destino, e os clocks devem ter as configurações do clock aplicadas. Isso é verdade, mesmo que todos os outros pinos em um design sejam pinos de E/S virtuais. Portanto, o exemplo básico acima impede que o software Quartus II aprimora o tempo durante a compilação porque todos os pinos, incluindo clocks, têm uma VIRTUAL_PIN atribuição aplicada.

Você pode adicionar um parâmetro ao procedimento que aceita uma lista de sinais para excluir das VIRTUAL_PIN atribuições. Esta lista normalmente seriam os nomes dos pinos de clock em seu design. O exemplo a seguir aceita uma lista de nomes para excluir. Ele também inclui o comando para remover quaisquer tarefas de VIRTUAL_PIN existentes, discutidas acima.

load_package de fluxo requer cmdline proc make_all_pins_virtual { args } { opções de conjunto {\ { "exclude.arg" "" "Lista de sinais a excluir" } \ } opções do conjunto de
    matrizes [:cmdline::getoptions quartus(args) $options remove_all_instance_assignments

    -name VIRTUAL_PIN execute_module -tool map
    set name_ids
    [get_names -filter * -node_type pin]

    foreach_in_collection name_id $name_ids {
        definir pin_name [get_name_info -info full_path $name_id]

        se { -1 == [lsearch -exact $opts(exclui) $pin_name] } { post_message "Fazendo uma atribuição
            VIRTUAL_PIN para $pin_name"
            set_instance_assignment -para $pin_name-name VIRTUAL_PIN ON } outra { post_message "Ignorando VIRTUAL_PIN tarefa para
            $pin_name"
        } export_assignments
} export_assignments }

Você pode ligar para o procedimento com este comando. Este exemplo assume que você tem dois clocks em seu design, chamados clk_a e clk_b.

make_all_pins_virtual -exclude { clk_a clk_b }

Identificar e lidar automaticamente com clocks

O exemplo anterior para excluir determinados sinais tem a desvantagem de que eles devem ser inseridos manualmente. É possível determinar sinais de clock com comandos no pacote::quartus::advanced_timing. Este pacote está disponível para carregar apenas no quartus_tan executável, portanto, você deve usar quartus_tan para executar scripts com o exemplo a seguir. Os comandos neste exemplo são todos suportados a partir da versão 3.0 do software Quartus II.

A identificação automática de clocks tem a vantagem de permitir que você automatize a aplicação da USE_CLK_FOR_VIRTUAL_PIN atribuição. Você pode usar a USE_CLK_FOR_VIRTUAL_PIN em conjunto com a VIRTUAL_PIN para associar as configurações do clock com os clocks em seu design. Isso fornece ao Fitter Quartus II informações precisas sobre os requisitos de sincronização quando você compila um projeto com pinos de E/S virtuais. Para obter mais informações sobre esta atribuição, consulte o tópico da opção opção de opção de lógica de pin clock virtual na Ajuda Quartus II.

O procedimento de exemplo a seguir faz com que todos os pinos de E/S em seus pinos de E/S virtuais de design. Ele também faz tarefas de configuração de clock de pino virtual quando apropriado.

O código de exemplo primeiro sintetiza seu design. Em seguida, ele tenta excluir qualquer netlist de sincronização existente antes de criar uma nova. Os comandos get_timing_nodes criam duas coleções de nós a partir da netlist de sincronização: pin_ids e clk_ids. As duas coleções são exclusivas; nenhum nó na coleção clk_ids está na coleção pin_ids, mesmo que o relógio esteja em um pino de E/S.

O primeiro foreach_in_collection loop recebe o nome de cada pino no design (excluindo pinos de clock) e faz uma VIRTUAL_PIN a ele.

O segundo foreach_in_collection loop recebe o nome de cada clock no design. O get_instance_assignment recupera a configuração correspondente do clock, se ela existir. Se uma configuração de clock para o clock existir (a string não está vazia), o script faz uma atribuição USE_CLOCK_FOR_VIRTUAL_PIN nome do clock com o valor do nome da configuração do clock.

load_package load_package timing load_package timing load_package advanced_timing proc make_all_pins_virtual { { { remove_all_instance_assignments

    -name VIRTUAL_PIN
    remove_all_instance_assignments -name USE_CLK_FOR_VIRTUAL_PIN

    execute_module -tool map catch {
    delete_timing_netlist } create_timing_netlist
    -post_map set pin_ids
    
    [get_timing_nodes -type pin] set clk_ids
    [get_timing_nodes-type clk]
    
    # Faça tarefas VIRTUAL_PIN a cada pino no pino design
    foreach_in_collection pin_id $pin_ids { definir

        pin_name [get_timing_node_info -info name $pin_id] post_message "Fazendo uma atribuição VIRTUAL_PIN para
        $pin_name" set_instance_assignment
        -para $pin_name-name VIRTUAL_PIN ON } #
    Para cada clock no design, verifique se ele tem uma atribuição de CLOCK_SETTINGS # correspondente. foreach_in_collection clk_id $clk_ids { definir

        clk_name [get_timing_node_info -info name $clk_id] conjunto
        clk_stgs [get_instance_assignment -para $clk_name -name \ CLOCK_SETTINGS] # Se houver uma configuração de clock para este clock, faça a tarefa # USE_CLK_FOR_VIRTUAL_PIN se {
        ![ string igual a "" $clk_stgs] } { post_message "Fazendo atribuição de USE_CLK_FOR_VIRTUAL_PIN \ para $clk_name com valor
                $clk_stgs"
            set_instance_assignment -para $clk_name \
                -name USE_CLK_FOR_VIRTUAL_PIN $clk_stgs
        } export_assignments
}

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.