project.tcl 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package require fileutil
  2. set project_name [lindex $argv 0]
  3. set part_name [lindex $argv 1]
  4. file delete -force tmp/$project_name.cache tmp/$project_name.gen tmp/$project_name.hw tmp/$project_name.ip_user_files tmp/$project_name.runs tmp/$project_name.sim tmp/$project_name.srcs tmp/$project_name.xpr
  5. create_project -part $part_name $project_name tmp
  6. set_property IP_REPO_PATHS tmp/cores [current_project]
  7. update_ip_catalog
  8. proc wire {name1 name2} {
  9. set port1 [get_bd_pins $name1]
  10. set port2 [get_bd_pins $name2]
  11. if {[llength $port1] == 1 && [llength $port2] == 1} {
  12. connect_bd_net $port1 $port2
  13. return
  14. }
  15. set port1 [get_bd_intf_pins $name1]
  16. set port2 [get_bd_intf_pins $name2]
  17. if {[llength $port1] == 1 && [llength $port2] == 1} {
  18. connect_bd_intf_net $port1 $port2
  19. return
  20. }
  21. error "** ERROR: can't connect $name1 and $name2"
  22. }
  23. proc cell {cell_vlnv cell_name {cell_props {}} {cell_ports {}}} {
  24. set cell [create_bd_cell -type ip -vlnv $cell_vlnv $cell_name]
  25. set prop_list {}
  26. foreach {prop_name prop_value} [uplevel 1 [list subst $cell_props]] {
  27. lappend prop_list CONFIG.$prop_name $prop_value
  28. }
  29. if {[llength $prop_list] > 1} {
  30. set_property -dict $prop_list $cell
  31. }
  32. foreach {local_name remote_name} [uplevel 1 [list subst $cell_ports]] {
  33. wire $cell_name/$local_name $remote_name
  34. }
  35. }
  36. proc module {module_name module_body {module_ports {}}} {
  37. set instance [current_bd_instance .]
  38. current_bd_instance [create_bd_cell -type hier $module_name]
  39. eval $module_body
  40. current_bd_instance $instance
  41. foreach {local_name remote_name} [uplevel 1 [list subst $module_ports]] {
  42. wire $module_name/$local_name $remote_name
  43. }
  44. }
  45. proc design {design_name design_body} {
  46. set design [current_bd_design]
  47. create_bd_design $design_name
  48. eval $design_body
  49. validate_bd_design
  50. save_bd_design
  51. current_bd_design $design
  52. }
  53. proc container {container_name container_designs {container_ports {}}} {
  54. set reference [lindex $container_designs 0]
  55. set container [create_bd_cell -type container -reference $reference $container_name]
  56. foreach {local_name remote_name} [uplevel 1 [list subst $container_ports]] {
  57. wire $container_name/$local_name $remote_name
  58. }
  59. set list {}
  60. foreach item $container_designs {
  61. lappend list $item.bd
  62. }
  63. set list [join $list :]
  64. set_property CONFIG.ENABLE_DFX true $container
  65. set_property CONFIG.LIST_SYNTH_BD $list $container
  66. set_property CONFIG.LIST_SIM_BD $list $container
  67. }
  68. proc addr {offset range port master} {
  69. set object [get_bd_intf_pins $port]
  70. set segment [get_bd_addr_segs -of_objects $object]
  71. set config [list Master $master Clk Auto]
  72. apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config $config $object
  73. assign_bd_address -offset $offset -range $range $segment
  74. }
  75. create_bd_design system
  76. source cfg/ports.tcl
  77. source projects/$project_name/block_design.tcl
  78. rename wire {}
  79. rename cell {}
  80. rename module {}
  81. rename design {}
  82. rename container {}
  83. rename addr {}
  84. set system [get_files system.bd]
  85. set_property SYNTH_CHECKPOINT_MODE None $system
  86. generate_target all $system
  87. make_wrapper -files $system -top
  88. foreach ext {srcs gen} {
  89. set files [fileutil::findByPattern tmp/$project_name.$ext system_wrapper.v]
  90. if {[llength $files] > 0} {
  91. add_files -norecurse $files
  92. break
  93. }
  94. }
  95. set_property TOP system_wrapper [current_fileset]
  96. set files [glob -nocomplain cfg/*.mem projects/$project_name/*.v projects/$project_name/*.sv]
  97. if {[llength $files] > 0} {
  98. add_files -norecurse $files
  99. }
  100. set files [glob -nocomplain cfg/*.xdc projects/$project_name/*.xdc]
  101. if {[llength $files] > 0} {
  102. add_files -norecurse -fileset constrs_1 $files
  103. }
  104. set_property VERILOG_DEFINE {TOOL_VIVADO} [current_fileset]
  105. set_property STRATEGY Flow_PerfOptimized_high [get_runs synth_1]
  106. set_property STRATEGY Performance_ExploreWithRemap [get_runs impl_1]
  107. close_project