Vivado 2014.1 pozwala na używanie skryptów .tcl do regeneracji projektów.
Aby to zrobić, przy otwartym projekcie przejdź do Plik -> Napisz projekt tcl.
Podstawowe projekty
Zwykle przechowuję źródła i skrypt .tcl w lokalizacji poza katalogiem projektu. Rdzenie Xilinx IP wygenerowane w ramach projektu można skopiować gdzie indziej, klikając prawym przyciskiem myszy rdzeń i wybierając „Kopiuj IP”. I usuwanie oryginału. Po wygenerowaniu skrypt tcl tworzy względne łącza do tych plików. Tak zwykle wygląda moja struktura katalogów:
base_project/
srcs/
project.v
ip/
ip1/
ip1.xml
ip1.xci
genproject.tcl
Należy zatwierdzić tylko pliki .xml i .xci IP. (I nawet to nie jest technicznie konieczne, patrz uwagi na końcu).
To właśnie zobowiązuje się do git, zauważ brak projektu.xpr lub katalogów projektu.
Kiedy uruchamiam genproject.tcl
, tworzy inny katalog dla projektu.
base_project/
srcs/
ip/
genproject.tcl
projectdir/
project.runs/
project.cache/
project.xpr
Ten nowy folder jest całkowicie jednorazowy. Aby utworzyć tę strukturę, modyfikuję skrypt tcl w następujący sposób.
Zmieniam pierwsze 3 linie w następujący sposób:
# 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
Spowoduje to utworzenie nowego katalogu projektu i nowego projektu w tym katalogu.
Następnie modyfikuję ścieżki, aby wskazywały właściwe miejsca. Być może trzeba będzie zmienić te ścieżki w innych miejscach skryptu.
# 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
Zmieniam również przebiegi projektowania rdzeni IP, jak widać w tej odpowiedzi .
Pliki .wcfg można dołączyć w podobny sposób jak pliki ip i srcs.
W tym miejscu przetwarzanie kończy się w przypadku prostszych projektów (zawierających tylko źródła i adres IP, bez schematów blokowych). Aby zapisać dane schematu blokowego, należy również wykonać następujące czynności.
Projekty schematów blokowych
Aby zapisać schemat blokowy, przy otwartym schemacie blokowym, przejdź do Plik -> Eksportuj -> Schemat blokowy do Tcl i zapisz go w tym samym katalogu, co inny plik tcl.
Potem stworzyłem Generate_Wrapper.tcl
skrypt, który tworzy pliki otoki diagramu blokowego, więc nie musisz tego robić ręcznie. Folder project / project.srcs służy do przechowywania danych bd, ale nadal jest całkowicie jednorazowy, ponieważ bd jest przechowywany w skrypcie tcl. Zapisz to z pozostałymi dwoma.
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
Na końcu genproject.tcl
dodaję następujące wiersze, aby wygenerować schemat blokowy i opakowania:
source $origin_dir/Create_bd.tcl
source $origin_dir/Generate_Wrapper.tcl
regenerate_bd_layout
W przypadku projektów bez źródła (tylko schemat blokowy) mój git commit jest następujący:
base_project/
Generate_Wrapper.tcl
Create_Bd.tcl
genproject.tcl
Aby wygenerować wszystko, uruchom genproject.tcl
.
Możesz nawet połączyć je wszystkie w jedno, jeśli jesteś szczególnie wydajny, jeszcze do tego nie doszedłem.
Komponenty niestandardowe: projekt komponentu
Kolejna szybka uwaga na temat tworzenia niestandardowego komponentu. Jeśli masz plik component.xml, dodaj go do listy źródeł tcl:
"[file normalize "$origin_dir/component.xml"]"\
A następnie dodaj także następującą sekcję:
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
Obejmuje to projekt komponentu w projekcie w celu łatwej personalizacji.
Komponenty niestandardowe: Odwoływanie się do komponentu
Ścieżkę repozytorium niestandardowego elementu można rozmieścić w następujący sposób:
# Set IP repository paths
set obj [get_filesets sources_1]
set_property "ip_repo_paths" "[file normalize "$origin_dir/path/to/repository"]" $obj
W moim folderze repo znajdują się pojedyncze foldery zawierające pliki .xml. Więc nie odwołujesz się do folderu zawierającego .xml, ale nadrzędny dla tego. Na przykład:
repository/
component1/component1.xml
component2/component2.xml
Jak uruchamiamy te skrypty tcl?
Otwórz Vivado i bez otwierania żadnych projektów wybierz Narzędzia -> Uruchom skrypt TCL i przejdź do swojego skryptu.
Dodatkowe notatki TCL
Każde polecenie uruchomione w Vivado jest pokazane w konsoli tcl jako polecenie tcl. Na przykład, kiedy wygenerowałem nowy adres IP Xilinx za pomocą GUI, pojawiło się to w konsoli 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]
Oznacza to kilka rzeczy:
Naprawdę nie musisz nawet zapisywać rdzeni ip xilinx - gdy są takie, jakie chcesz, skopiuj polecenia do skryptu tcl i nie musisz już zatwierdzać ip /.
określ katalog IP za pomocą argumentu -dir po opcji -module_name, aby umieścić go w dowolnym miejscu (domyślnie jest to plik project.srcs).
Przeważnie wszystko, co robisz w GUI, można zrobić w tcl, najłatwiejszym sposobem, aby zobaczyć, jak robi to xilinx, jest zrobienie tego w GUI, a następnie sprawdzenie, co jest w konsoli TCL.
Ten obszerny plik PDF szczegółowo opisuje wszystkie polecenia vivado tcl.