O Vivado 2014.1 permite o uso de scripts .tcl para regenerar projetos.
Para fazer isso, com o seu projeto aberto, vá em Arquivo -> Escrever Projeto tcl.
Projetos Básicos
Eu costumo armazenar minhas fontes e o script .tcl em um local fora do diretório do projeto. Os núcleos IP xilinx gerados no projeto podem ser copiados em outro local clicando com o botão direito do mouse no núcleo e selecionando "Copiar IP". E excluindo o original. Quando o script tcl é gerado, ele cria links relativos para esses arquivos. Geralmente é assim que minha estrutura de diretórios se parece:
base_project/
srcs/
project.v
ip/
ip1/
ip1.xml
ip1.xci
genproject.tcl
Apenas os arquivos .xml e .xci do IP precisam ser confirmados. (E mesmo isso não é necessário, tecnicamente, veja as notas no final).
É isso que se compromete com o git, observe a falta de project.xpr ou diretórios do projeto.
Quando executo genproject.tcl
, ele cria outro diretório para o projeto.
base_project/
srcs/
ip/
genproject.tcl
projectdir/
project.runs/
project.cache/
project.xpr
Esta nova pasta é completamente descartável. Para criar essa estrutura, modifico o script tcl da seguinte maneira.
Altero as 3 primeiras linhas da seguinte maneira:
# Set the reference directory for source file relative paths (by default the value is script directory path)
set origin_dir [file dirname [info script]]
# Set the directory path for the original project from where this script was exported
set orig_proj_dir "[file normalize "$origin_dir/projectdir"]"
# Create project
create_project project $projectdir/project
Isso cria um novo diretório de projeto e o novo projeto nesse diretório.
Depois modifico os caminhos para apontar para os lugares corretos. Pode ser necessário alterar esses caminhos em outros lugares do script.
# Set 'sources_1' fileset object
set obj [get_filesets sources_1]
set files [list \
"[file normalize "$origin_dir/srcs/project.v"]"\
"[file normalize "$origin_dir/ip/ip1/ip1.xci"]"\
]
add_files -norecurse -fileset $obj $files
Também modifico as execuções de design para núcleos IP, como visto nesta resposta .
Os arquivos .wcfg podem ser incluídos de maneira semelhante ao ip e srcs.
É aqui que o processamento termina para projetos mais simples (contendo apenas fontes e IP, sem diagramas de blocos). Também é necessário fazer o seguinte para armazenar os dados do diagrama de blocos.
Projetos de diagrama de blocos
Para salvar o diagrama de blocos, com o diagrama de blocos aberto, vá em Arquivo -> Exportar -> Diagrama de Blocos para Tcl e salve-o no mesmo diretório que o outro arquivo tcl.
Então eu criei um Generate_Wrapper.tcl
script que cria os arquivos do wrapper do diagrama de blocos para que você não precise fazer isso manualmente. A pasta project / project.srcs é usada para armazenar os dados bd, mas ainda é completamente descartável, pois o bd é armazenado no script tcl. Salve isso com os outros dois.
set origin_dir [file dirname [info script]]
make_wrapper -files [get_files $origin_dir/project/project.srcs/sources_1/bd/design_1/design_1.bd] -top
add_files -norecurse -force $origin_dir/project/project.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v
update_compile_order -fileset sources_1
update_compile_order -fileset sim_1
No final, genproject.tcl
adiciono as seguintes linhas para gerar o diagrama de blocos e os invólucros:
source $origin_dir/Create_bd.tcl
source $origin_dir/Generate_Wrapper.tcl
regenerate_bd_layout
Para projetos sem fonte (apenas diagrama de blocos), meu commit do git é o seguinte:
base_project/
Generate_Wrapper.tcl
Create_Bd.tcl
genproject.tcl
Para gerar tudo, execute genproject.tcl
.
Você pode até combinar tudo isso em um, se for particularmente eficiente, ainda não cheguei a esse ponto.
Componentes personalizados: O projeto do componente
Outra observação rápida sobre a criação de um componente personalizado. Se você possui um component.xml, adicione-o à sua lista de fontes tcl:
"[file normalize "$origin_dir/component.xml"]"\
E adicione também a seguinte seção:
set file "$origin_dir/component.xml"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property "file_type" "IP-XACT" $file_obj
Isso inclui o design do componente no projeto para facilitar a personalização.
Componentes personalizados: referenciando seu componente
Você pode espaçar seu caminho de repo de componente personalizado assim:
# Set IP repository paths
set obj [get_filesets sources_1]
set_property "ip_repo_paths" "[file normalize "$origin_dir/path/to/repository"]" $obj
Na minha pasta de repositório, há pastas individuais contendo arquivos .xml. Portanto, você não está referenciando a pasta que contém o arquivo .xml, mas o pai dela. Por exemplo:
repository/
component1/component1.xml
component2/component2.xml
Como executamos esses scripts tcl?
Abra o Vivado e, sem abrir nenhum projeto, selecione Ferramentas -> Executar script TCL e navegue até seu script.
Notas extras sobre TCL
Todo comando que você executa no Vivado é mostrado no console tcl como um comando tcl. Por exemplo, quando eu gerei um novo IP Xilinx usando a GUI, isso surgiu no console tcl:
create_ip -name floating_point -vendor xilinx.com -library ip -module_name floating_point_0
set_property -dict [list CONFIG.Operation_Type {Fixed_to_float} CONFIG.A_Precision_Type {Custom} CONFIG.C_A_Exponent_Width {38} CONFIG.C_A_Fraction_Width {0} CONFIG.Result_Precision_Type {Custom} CONFIG.C_Result_Exponent_Width {8} CONFIG.C_Result_Fraction_Width {16} CONFIG.Flow_Control {NonBlocking} CONFIG.Has_ARESETn {true}] [get_ips floating_point_0]
Isso significa algumas coisas:
Você nem precisa salvar os núcleos ip do xilinx - assim que quiser, copie os comandos para o script tcl e não precisará mais confirmar o ip /.
especifique o diretório IP com o argumento -dir após -module_name para colocá-lo onde quiser (no padrão, é em project.srcs).
Principalmente tudo o que você faz na GUI pode ser feito no tcl, a maneira mais fácil de ver como o xilinx faz as coisas é fazê-lo na GUI e depois ver o que está no console do TCL posteriormente.
Este pdf imenso detalha todos os comandos do vivado tcl.