blob: e45d24df66813016cf9351c62aa3423861784f33 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Check if script is running in correct Vivado version.
set scripts_vivado_version 2020.1
set current_vivado_version [version -short]
if { [string first $scripts_vivado_version $current_vivado_version] == -1 } {
puts ""
catch {common::send_msg_id "BD_TCL-109" "ERROR" "This script was generated using Vivado \
<$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado."}
return 1
}
# Parse argument list, derive the clock to utilize
if { [llength $argv] eq 2 } {
set ip_path [lindex $argv 0]
set vta_config [lindex $argv 1]
} else {
puts "Arg list incomplete: <path to ip dir> <path to vta_config.py>"
return 1
}
# Get the VTA configuration paramters
set target [exec python $vta_config --target]
set device_family [exec python $vta_config --get-fpga-family]
set clock_freq [exec python $vta_config --get-fpga-freq]
# SRAM dimensions
set inp_part [exec python $vta_config --get-inp-mem-banks]
set inp_mem_width [exec python $vta_config --get-inp-mem-width]
set inp_mem_depth [exec python $vta_config --get-inp-mem-depth]
set wgt_part [exec python $vta_config --get-wgt-mem-banks]
set wgt_mem_width [exec python $vta_config --get-wgt-mem-width]
set wgt_mem_depth [exec python $vta_config --get-wgt-mem-depth]
set out_part [exec python $vta_config --get-out-mem-banks]
set out_mem_width [exec python $vta_config --get-out-mem-width]
set out_mem_depth [exec python $vta_config --get-out-mem-depth]
set num_wgt_mem_uram [exec python $vta_config --get-num-wgt-mem-uram]
# AXI bus signals
set axi_cache [exec python $vta_config --get-axi-cache-bits]
set axi_prot [exec python $vta_config --get-axi-prot-bits]
# Address map
set ip_reg_map_range [exec python $vta_config --get-ip-reg-map-range]
set fetch_base_addr [exec python $vta_config --get-fetch-base-addr]
set load_base_addr [exec python $vta_config --get-load-base-addr]
set compute_base_addr [exec python $vta_config --get-compute-base-addr]
set store_base_addr [exec python $vta_config --get-store-base-addr]
# Paths to IP library of VTA modules
set proj_name vta
set design_name $proj_name
set proj_path "."
set ip_lib "ip_lib"
set fetch_ip "${ip_path}/vta_fetch/soln/impl/ip/xilinx_com_hls_fetch_1_0.zip"
set load_ip "${ip_path}/vta_load/soln/impl/ip/xilinx_com_hls_load_1_0.zip"
set compute_ip "${ip_path}/vta_compute/soln/impl/ip/xilinx_com_hls_compute_1_0.zip"
set store_ip "${ip_path}/vta_store/soln/impl/ip/xilinx_com_hls_store_1_0.zip"
# Create custom project
set device [exec python $vta_config --get-fpga-dev]
create_project -force $proj_name $proj_path -part $device
# Update IP repository with generated IP
file mkdir $ip_lib
set_property ip_repo_paths $ip_lib [current_project]
update_ip_catalog
update_ip_catalog -add_ip $fetch_ip -repo_path $ip_lib
update_ip_catalog -add_ip $load_ip -repo_path $ip_lib
update_ip_catalog -add_ip $compute_ip -repo_path $ip_lib
update_ip_catalog -add_ip $store_ip -repo_path $ip_lib
##################################################################
# CONFIGURE BLOCK DIAGRAM DESIGN
##################################################################
# Create bd design
create_bd_design $design_name
current_bd_design $design_name
# Procedure to initialize FIFO
proc init_fifo_property {fifo width_bytes depth} {
set_property -dict [ list \
CONFIG.FIFO_Implementation_rach {Common_Clock_Distributed_RAM} \
CONFIG.FIFO_Implementation_wach {Common_Clock_Distributed_RAM} \
CONFIG.FIFO_Implementation_wrch {Common_Clock_Distributed_RAM} \
CONFIG.Full_Flags_Reset_Value {1} \
CONFIG.INTERFACE_TYPE {AXI_STREAM} \
CONFIG.Input_Depth_axis $depth \
CONFIG.Reset_Type {Asynchronous_Reset} \
CONFIG.TDATA_NUM_BYTES $width_bytes \
] $fifo
}
# Procedure to initialize BRAM
proc init_bram_property {bram width depth} {
set_property -dict [ list \
CONFIG.use_bram_block {Stand_Alone} \
CONFIG.Assume_Synchronous_Clk {true} \
CONFIG.Byte_Size {8} \
CONFIG.Enable_32bit_Address {true} \
CONFIG.Enable_B {Use_ENB_Pin} \
CONFIG.Memory_Type {True_Dual_Port_RAM} \
CONFIG.Read_Width_A $width \
CONFIG.Read_Width_B $width \
CONFIG.Register_PortA_Output_of_Memory_Primitives {false} \
CONFIG.Register_PortB_Output_of_Memory_Primitives {false} \
CONFIG.Use_Byte_Write_Enable {true} \
CONFIG.Use_RSTA_Pin {true} \
CONFIG.Use_RSTB_Pin {true} \
CONFIG.Write_Depth_A $depth \
CONFIG.Write_Width_A $width \
CONFIG.Write_Width_B $width \
] $bram
}
# Create instance: proc_sys_reset, and set properties
set proc_sys_reset \
[ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset ]
# Create instance: pll_clk, and set properties
set pll_clk [ create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz:6.0 pll_clk ]
set_property -dict [ list \
CONFIG.CLKOUT1_REQUESTED_OUT_FREQ $clock_freq \
CONFIG.RESET_PORT {resetn} \
CONFIG.RESET_TYPE {ACTIVE_LOW} \
CONFIG.USE_LOCKED {false} \
] $pll_clk
# Create instance: axi_smc0, and set properties
set axi_smc0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:smartconnect:1.0 axi_smc0 ]
set_property -dict [ list \
CONFIG.NUM_MI {1} \
CONFIG.NUM_SI {5} \
] $axi_smc0
# Create instance: axi_xbar, and set properties
set axi_xbar \
[ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 axi_xbar ]
set_property -dict [ list \
CONFIG.NUM_MI {4} \
CONFIG.NUM_SI {1} \
] $axi_xbar
# Create instance: fetch_0, and set properties
set fetch_0 [ create_bd_cell -type ip -vlnv xilinx.com:hls:fetch:1.0 fetch_0 ]
set_property -dict [ list \
CONFIG.C_M_AXI_INS_PORT_CACHE_VALUE $axi_cache \
CONFIG.C_M_AXI_INS_PORT_PROT_VALUE $axi_prot \
] $fetch_0
# Create instance: load_0, and set properties
set load_0 [ create_bd_cell -type ip -vlnv xilinx.com:hls:load:1.0 load_0 ]
set_property -dict [ list \
CONFIG.C_M_AXI_DATA_PORT_CACHE_VALUE $axi_cache \
CONFIG.C_M_AXI_DATA_PORT_PROT_VALUE $axi_prot \
] $load_0
# Create instance: compute_0, and set properties
set compute_0 [ create_bd_cell -type ip -vlnv xilinx.com:hls:compute:1.0 compute_0 ]
set_property -dict [ list \
CONFIG.C_M_AXI_DATA_PORT_CACHE_VALUE $axi_cache \
CONFIG.C_M_AXI_DATA_PORT_PROT_VALUE $axi_prot \
CONFIG.C_M_AXI_UOP_PORT_CACHE_VALUE $axi_cache \
CONFIG.C_M_AXI_UOP_PORT_PROT_VALUE $axi_prot \
] $compute_0
# Create instance: store_0, and set properties
set store_0 [ create_bd_cell -type ip -vlnv xilinx.com:hls:store:1.0 store_0 ]
set_property -dict [ list \
CONFIG.C_M_AXI_DATA_PORT_CACHE_VALUE $axi_cache \
CONFIG.C_M_AXI_DATA_PORT_PROT_VALUE $axi_prot \
] $store_0
# Create command queues and set properties
set cmd_queue_list {load_queue gemm_queue store_queue}
foreach cmd_queue $cmd_queue_list {
set tmp_cmd_queue [ create_bd_cell -type ip -vlnv xilinx.com:ip:fifo_generator:13.2 $cmd_queue ]
# Width is 16B (128b, as set in hw_spec.h), depth is 512 (depth of FIFO on Zynq 7000 and Zynq Ultrascale+)
# TODO: derive it from vta_config.h
[ init_fifo_property $tmp_cmd_queue 16 512 ]
}
# Create dependence queues and set properties
set dep_queue_list {l2g_queue g2l_queue g2s_queue s2g_queue}
foreach dep_queue $dep_queue_list {
set tmp_dep_queue [ create_bd_cell -type ip -vlnv xilinx.com:ip:fifo_generator:13.2 $dep_queue ]
# Width is 1B (min width), depth is 1024
# TODO: derive it from vta_config.h
[ init_fifo_property $tmp_dep_queue 1 1024 ]
}
# Create and connect inp_mem partitions
for {set i 0} {$i < $inp_part} {incr i} {
# Create instance: inp_mem, and set properties
set inp_mem [ create_bd_cell -type ip -vlnv xilinx.com:ip:blk_mem_gen:8.4 inp_mem_${i} ]
[ init_bram_property $inp_mem $inp_mem_width $inp_mem_depth ]
# If module has more than 1 mem port, the naming convention changes
if {$inp_part > 1} {
set porta [get_bd_intf_pins load_0/inp_mem_${i}_V_PORTA]
set portb [get_bd_intf_pins compute_0/inp_mem_${i}_V_PORTA]
} else {
set porta [get_bd_intf_pins load_0/inp_mem_V_PORTA]
set portb [get_bd_intf_pins compute_0/inp_mem_V_PORTA]
}
# Create interface connections
connect_bd_intf_net -intf_net load_0_inp_mem_V_PORTA \
[get_bd_intf_pins $inp_mem/BRAM_PORTA] \
$porta
connect_bd_intf_net -intf_net compute_0_inp_mem_V_PORTA \
[get_bd_intf_pins $inp_mem/BRAM_PORTB] \
$portb
}
# Create and connect wgt_mem partitions
for {set i 0} {$i < $wgt_part} {incr i} {
# Create instance: wgt_mem, and set properties
set wgt_mem [ create_bd_cell -type ip -vlnv xilinx.com:ip:blk_mem_gen:8.4 wgt_mem_${i} ]
[ init_bram_property $wgt_mem $wgt_mem_width $wgt_mem_depth ]
# If module has more than 1 mem port, the naming convention changes
if {$wgt_part > 1} {
set porta [get_bd_intf_pins load_0/wgt_mem_${i}_V_PORTA]
set portb [get_bd_intf_pins compute_0/wgt_mem_${i}_V_PORTA]
} else {
set porta [get_bd_intf_pins load_0/wgt_mem_V_PORTA]
set portb [get_bd_intf_pins compute_0/wgt_mem_V_PORTA]
}
# Create interface connections
connect_bd_intf_net -intf_net load_0_wgt_mem_${i}_V_PORTA \
[get_bd_intf_pins $wgt_mem/BRAM_PORTA] \
$porta
connect_bd_intf_net -intf_net compute_0_wgt_mem_${i}_V_PORTA \
[get_bd_intf_pins $wgt_mem/BRAM_PORTB] \
$portb
if { $device_family eq "zynq-ultrascale+" && $i < $num_wgt_mem_uram } {
set_property -dict [list CONFIG.PRIM_type_to_Implement {URAM}] $wgt_mem
}
}
# Create and connect out_mem partitions
for {set i 0} {$i < $out_part} {incr i} {
# Create instance: out_mem, and set properties
set out_mem [ create_bd_cell -type ip -vlnv xilinx.com:ip:blk_mem_gen:8.4 out_mem_${i} ]
[ init_bram_property $out_mem $out_mem_width $out_mem_depth ]
# If module has more than 1 mem port, the naming convention changes
if {$out_part > 1} {
set porta [get_bd_intf_pins compute_0/out_mem_${i}_V_PORTA]
set portb [get_bd_intf_pins store_0/out_mem_${i}_V_PORTA]
} else {
set porta [get_bd_intf_pins compute_0/out_mem_V_PORTA]
set portb [get_bd_intf_pins store_0/out_mem_V_PORTA]
}
# Create interface connections
connect_bd_intf_net -intf_net compute_0_out_mem_${i}_V_PORTA \
[get_bd_intf_pins $out_mem/BRAM_PORTA] \
$porta
connect_bd_intf_net -intf_net store_0_out_mem_${i}_V_PORTA \
[get_bd_intf_pins $out_mem/BRAM_PORTB] \
$portb
}
# Create instance: processing_system, and set properties
if { $device_family eq "zynq-7000" } {
set processing_system [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system ]
set_property -dict [ list \
CONFIG.PCW_EN_CLK0_PORT {1} \
CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {100} \
CONFIG.PCW_USE_DEFAULT_ACP_USER_VAL {1} \
CONFIG.PCW_USE_S_AXI_ACP {1} \
CONFIG.preset {ZC702} \
] $processing_system
# Get ports that are specific to the Zynq 7000 processing system
set ps_clk [get_bd_pins processing_system/FCLK_CLK0]
set ps_rstn [get_bd_pins processing_system/FCLK_RESET0_N]
set maxi_clk [get_bd_pins processing_system/M_AXI_GP0_ACLK]
set saxi_clk [get_bd_pins processing_system/S_AXI_ACP_ACLK]
set maxi [get_bd_intf_pins processing_system/M_AXI_GP0]
set saxi [get_bd_intf_pins processing_system/S_AXI_ACP]
} elseif { $device_family eq "zynq-ultrascale+" } {
set processing_system [ create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.2 processing_system ]
set_property -dict [ list \
CONFIG.PSU__FPGA_PL0_ENABLE {1} \
CONFIG.PSU__CRL_APB__PL0_REF_CTRL__FREQMHZ {100} \
CONFIG.PSU__USE__M_AXI_GP0 {1} \
CONFIG.PSU__USE__M_AXI_GP2 {0} \
CONFIG.PSU__USE__S_AXI_GP0 {1}
] $processing_system
# Get ports that are specific to the Zynq Ultrascale MPSoC processing system
set ps_clk [get_bd_pins processing_system/pl_clk0]
set ps_rstn [get_bd_pins processing_system/pl_resetn0]
set maxi_clk [get_bd_pins processing_system/maxihpm0_fpd_aclk]
set saxi_clk [get_bd_pins processing_system/saxihpc0_fpd_aclk]
set maxi [get_bd_intf_pins processing_system/M_AXI_HPM0_FPD]
set saxi [get_bd_intf_pins processing_system/S_AXI_HPC0_FPD]
}
# Create interface connections
connect_bd_intf_net -intf_net axi_xbar_M00_AXI [get_bd_intf_pins axi_xbar/M00_AXI] [get_bd_intf_pins fetch_0/s_axi_CONTROL_BUS]
connect_bd_intf_net -intf_net axi_xbar_M01_AXI [get_bd_intf_pins axi_xbar/M01_AXI] [get_bd_intf_pins load_0/s_axi_CONTROL_BUS]
connect_bd_intf_net -intf_net axi_xbar_M02_AXI [get_bd_intf_pins axi_xbar/M02_AXI] [get_bd_intf_pins compute_0/s_axi_CONTROL_BUS]
connect_bd_intf_net -intf_net axi_xbar_M03_AXI [get_bd_intf_pins axi_xbar/M03_AXI] [get_bd_intf_pins store_0/s_axi_CONTROL_BUS]
connect_bd_intf_net -intf_net fetch_0_l2g_dep_queue_V [get_bd_intf_pins l2g_queue/S_AXIS] [get_bd_intf_pins load_0/l2g_dep_queue_V]
connect_bd_intf_net -intf_net fetch_0_load_queue_V_V [get_bd_intf_pins fetch_0/load_queue_V_V] [get_bd_intf_pins load_queue/S_AXIS]
connect_bd_intf_net -intf_net fetch_0_gemm_queue_V_V [get_bd_intf_pins fetch_0/gemm_queue_V_V] [get_bd_intf_pins gemm_queue/S_AXIS]
connect_bd_intf_net -intf_net fetch_0_store_queue_V_V [get_bd_intf_pins fetch_0/store_queue_V_V] [get_bd_intf_pins store_queue/S_AXIS]
connect_bd_intf_net -intf_net compute_0_g2l_dep_queue_V [get_bd_intf_pins compute_0/g2l_dep_queue_V] [get_bd_intf_pins g2l_queue/S_AXIS]
connect_bd_intf_net -intf_net compute_0_g2s_dep_queue_V [get_bd_intf_pins compute_0/g2s_dep_queue_V] [get_bd_intf_pins g2s_queue/S_AXIS]
connect_bd_intf_net -intf_net store_0_s2g_dep_queue_V [get_bd_intf_pins s2g_queue/S_AXIS] [get_bd_intf_pins store_0/s2g_dep_queue_V]
connect_bd_intf_net -intf_net load_queue_M_AXIS [get_bd_intf_pins load_0/load_queue_V_V] [get_bd_intf_pins load_queue/M_AXIS]
connect_bd_intf_net -intf_net gemm_queue_M_AXIS [get_bd_intf_pins compute_0/gemm_queue_V_V] [get_bd_intf_pins gemm_queue/M_AXIS]
connect_bd_intf_net -intf_net store_queue_M_AXIS [get_bd_intf_pins store_0/store_queue_V_V] [get_bd_intf_pins store_queue/M_AXIS]
connect_bd_intf_net -intf_net l2g_queue_M_AXIS [get_bd_intf_pins compute_0/l2g_dep_queue_V] [get_bd_intf_pins l2g_queue/M_AXIS]
connect_bd_intf_net -intf_net g2l_queue_M_AXIS [get_bd_intf_pins g2l_queue/M_AXIS] [get_bd_intf_pins load_0/g2l_dep_queue_V]
connect_bd_intf_net -intf_net g2s_queue_M_AXIS [get_bd_intf_pins g2s_queue/M_AXIS] [get_bd_intf_pins store_0/g2s_dep_queue_V]
connect_bd_intf_net -intf_net s2g_queue_M_AXIS [get_bd_intf_pins compute_0/s2g_dep_queue_V] [get_bd_intf_pins s2g_queue/M_AXIS]
connect_bd_intf_net -intf_net fetch_0_m_axi_ins_port [get_bd_intf_pins axi_smc0/S00_AXI] [get_bd_intf_pins fetch_0/m_axi_ins_port]
connect_bd_intf_net -intf_net load_0_m_axi_data_port [get_bd_intf_pins axi_smc0/S01_AXI] [get_bd_intf_pins load_0/m_axi_data_port]
connect_bd_intf_net -intf_net compute_0_m_axi_uop_port [get_bd_intf_pins axi_smc0/S02_AXI] [get_bd_intf_pins compute_0/m_axi_uop_port]
connect_bd_intf_net -intf_net compute_0_m_axi_data_port [get_bd_intf_pins axi_smc0/S03_AXI] [get_bd_intf_pins compute_0/m_axi_data_port]
connect_bd_intf_net -intf_net store_0_m_axi_data_port [get_bd_intf_pins axi_smc0/S04_AXI] [get_bd_intf_pins store_0/m_axi_data_port]
connect_bd_intf_net -intf_net axi_smc0_M00_AXI [get_bd_intf_pins axi_smc0/M00_AXI] $saxi
connect_bd_intf_net -intf_net processing_system_m_axi [get_bd_intf_pins axi_xbar/S00_AXI] $maxi
# Create port connections
connect_bd_net -net processing_system_reset \
[get_bd_pins pll_clk/resetn] \
[get_bd_pins proc_sys_reset/ext_reset_in] \
$ps_rstn
connect_bd_net -net ps_clk_net \
[get_bd_pins pll_clk/clk_in1] \
$ps_clk
connect_bd_net -net proc_sys_reset_interconnect_aresetn \
[get_bd_pins axi_xbar/ARESETN] \
[get_bd_pins proc_sys_reset/interconnect_aresetn]
connect_bd_net -net proc_sys_reset_peripheral_aresetn \
[get_bd_pins proc_sys_reset/peripheral_aresetn] \
[get_bd_pins axi_smc0/aresetn] \
[get_bd_pins axi_xbar/M00_ARESETN] \
[get_bd_pins axi_xbar/M01_ARESETN] \
[get_bd_pins axi_xbar/M02_ARESETN] \
[get_bd_pins axi_xbar/M03_ARESETN] \
[get_bd_pins axi_xbar/S00_ARESETN] \
[get_bd_pins fetch_0/ap_rst_n] \
[get_bd_pins load_0/ap_rst_n] \
[get_bd_pins store_0/ap_rst_n] \
[get_bd_pins compute_0/ap_rst_n] \
[get_bd_pins load_queue/s_aresetn] \
[get_bd_pins gemm_queue/s_aresetn] \
[get_bd_pins store_queue/s_aresetn] \
[get_bd_pins l2g_queue/s_aresetn] \
[get_bd_pins g2l_queue/s_aresetn] \
[get_bd_pins g2s_queue/s_aresetn] \
[get_bd_pins s2g_queue/s_aresetn]
connect_bd_net -net processing_system_clk \
[get_bd_pins pll_clk/clk_out1] \
[get_bd_pins proc_sys_reset/slowest_sync_clk] \
[get_bd_pins axi_smc0/aclk] \
[get_bd_pins axi_xbar/ACLK] \
[get_bd_pins axi_xbar/M00_ACLK] \
[get_bd_pins axi_xbar/M01_ACLK] \
[get_bd_pins axi_xbar/M02_ACLK] \
[get_bd_pins axi_xbar/M03_ACLK] \
[get_bd_pins axi_xbar/S00_ACLK] \
[get_bd_pins fetch_0/ap_clk] \
[get_bd_pins load_0/ap_clk] \
[get_bd_pins compute_0/ap_clk] \
[get_bd_pins store_0/ap_clk] \
[get_bd_pins load_queue/s_aclk] \
[get_bd_pins gemm_queue/s_aclk] \
[get_bd_pins store_queue/s_aclk] \
[get_bd_pins l2g_queue/s_aclk] \
[get_bd_pins g2l_queue/s_aclk] \
[get_bd_pins g2s_queue/s_aclk] \
[get_bd_pins s2g_queue/s_aclk] \
$maxi_clk \
$saxi_clk
# Create address segments
create_bd_addr_seg -range $ip_reg_map_range -offset $fetch_base_addr [get_bd_addr_spaces processing_system/Data] [get_bd_addr_segs fetch_0/s_axi_CONTROL_BUS/Reg] SEG_fetch_0_Reg
create_bd_addr_seg -range $ip_reg_map_range -offset $load_base_addr [get_bd_addr_spaces processing_system/Data] [get_bd_addr_segs load_0/s_axi_CONTROL_BUS/Reg] SEG_load_0_Reg
create_bd_addr_seg -range $ip_reg_map_range -offset $compute_base_addr [get_bd_addr_spaces processing_system/Data] [get_bd_addr_segs compute_0/s_axi_CONTROL_BUS/Reg] SEG_compute_0_Reg
create_bd_addr_seg -range $ip_reg_map_range -offset $store_base_addr [get_bd_addr_spaces processing_system/Data] [get_bd_addr_segs store_0/s_axi_CONTROL_BUS/Reg] SEG_store_0_Reg
if { $device_family eq "zynq-7000" } {
create_bd_addr_seg -range 0x40000000 -offset 0x00000000 [get_bd_addr_spaces compute_0/Data_m_axi_uop_port] [get_bd_addr_segs processing_system/S_AXI_ACP/ACP_DDR_LOWOCM] SEG_processing_system_ACP_DDR_LOWOCM
create_bd_addr_seg -range 0x40000000 -offset 0x00000000 [get_bd_addr_spaces compute_0/Data_m_axi_data_port] [get_bd_addr_segs processing_system/S_AXI_ACP/ACP_DDR_LOWOCM] SEG_processing_system_ACP_DDR_LOWOCM
create_bd_addr_seg -range 0x40000000 -offset 0x00000000 [get_bd_addr_spaces fetch_0/Data_m_axi_ins_port] [get_bd_addr_segs processing_system/S_AXI_ACP/ACP_DDR_LOWOCM] SEG_processing_system_ACP_DDR_LOWOCM
create_bd_addr_seg -range 0x40000000 -offset 0x00000000 [get_bd_addr_spaces load_0/Data_m_axi_data_port] [get_bd_addr_segs processing_system/S_AXI_ACP/ACP_DDR_LOWOCM] SEG_processing_system_ACP_DDR_LOWOCM
create_bd_addr_seg -range 0x40000000 -offset 0x00000000 [get_bd_addr_spaces store_0/Data_m_axi_data_port] [get_bd_addr_segs processing_system/S_AXI_ACP/ACP_DDR_LOWOCM] SEG_processing_system_ACP_DDR_LOWOCM
} elseif { $device_family eq "zynq-ultrascale+"} {
create_bd_addr_seg -range 0x80000000 -offset 0x00000000 [get_bd_addr_spaces fetch_0/Data_m_axi_ins_port] [get_bd_addr_segs processing_system/SAXIGP0/HPC0_DDR_LOW] SEG_processing_system_HPC0_DDR_LOW
create_bd_addr_seg -range 0x80000000 -offset 0x00000000 [get_bd_addr_spaces load_0/Data_m_axi_data_port] [get_bd_addr_segs processing_system/SAXIGP0/HPC0_DDR_LOW] SEG_processing_system_HPC0_DDR_LOW
create_bd_addr_seg -range 0x80000000 -offset 0x00000000 [get_bd_addr_spaces compute_0/Data_m_axi_uop_port] [get_bd_addr_segs processing_system/SAXIGP0/HPC0_DDR_LOW] SEG_processing_system_HPC0_DDR_LOW
create_bd_addr_seg -range 0x80000000 -offset 0x00000000 [get_bd_addr_spaces compute_0/Data_m_axi_data_port] [get_bd_addr_segs processing_system/SAXIGP0/HPC0_DDR_LOW] SEG_processing_system_HPC0_DDR_LOW
create_bd_addr_seg -range 0x80000000 -offset 0x00000000 [get_bd_addr_spaces store_0/Data_m_axi_data_port] [get_bd_addr_segs processing_system/SAXIGP0/HPC0_DDR_LOW] SEG_processing_system_HPC0_DDR_LOW
}
save_bd_design
##################################################################
# COMPILATION FLOW
##################################################################
# Create top-level wrapper file
make_wrapper -files \
[get_files $proj_path/$proj_name.srcs/sources_1/bd/$proj_name/$proj_name.bd] -top
add_files -norecurse $proj_path/$proj_name.srcs/sources_1/bd/$proj_name/hdl/${proj_name}_wrapper.v
update_compile_order -fileset sources_1
update_compile_order -fileset sim_1
# Run bistream generation on 8 threads with performance oriented P&R strategy
set num_threads 8
launch_runs impl_1 -to_step write_bitstream -jobs $num_threads
wait_on_run impl_1
# Export hardware description file and bitstream files to export/ dir
if {[file exist $proj_path/$proj_name.runs/impl_1/${proj_name}_wrapper.bit]} {
file mkdir $proj_path/export
file copy -force $proj_path/$proj_name.runs/impl_1/${proj_name}_wrapper.bit \
$proj_path/export/vta.bit
}
exit