87 lines
3.0 KiB
Tcl
87 lines
3.0 KiB
Tcl
proc init {cellpath otherInfo} {
|
|
set ip [get_bd_cells $cellpath]
|
|
|
|
bd::mark_propagate_only $ip \
|
|
"AXI_ADDR_WIDTH"
|
|
}
|
|
|
|
# Executed when you close the config window
|
|
proc post_config_ip {cellpath otherinfo} {
|
|
set ip [get_bd_cells $cellpath]
|
|
|
|
# Update AXI interface properties according to configuration
|
|
set axi_protocol [get_property "CONFIG.AXI_PROTOCOL" $ip]
|
|
set data_width [get_property "CONFIG.AXI_DATA_WIDTH" $ip]
|
|
|
|
set src_fifo_size [get_property "CONFIG.SRC_FIFO_SIZE" $ip]
|
|
set dst_fifo_size [get_property "CONFIG.DST_FIFO_SIZE" $ip]
|
|
|
|
if {$axi_protocol == 0} {
|
|
set axi_protocol_str "AXI4"
|
|
set max_beats_per_burst 256
|
|
} else {
|
|
set axi_protocol_str "AXI3"
|
|
set max_beats_per_burst 16
|
|
}
|
|
|
|
set num_m [get_property "CONFIG.NUM_M" $ip]
|
|
for {set idx 0} {$idx < $num_m} {incr idx} {
|
|
|
|
set intf [get_bd_intf_pins [format "%s/MAXI_%d" $cellpath $idx]]
|
|
|
|
set_property CONFIG.PROTOCOL $axi_protocol_str $intf
|
|
set_property CONFIG.MAX_BURST_LENGTH $max_beats_per_burst $intf
|
|
|
|
set_property CONFIG.NUM_WRITE_OUTSTANDING $src_fifo_size $intf
|
|
set_property CONFIG.NUM_READ_OUTSTANDING $dst_fifo_size $intf
|
|
|
|
}
|
|
|
|
# For multi master configurations (e.g.HBM) the AXIS data widths must match
|
|
if { $num_m > 1} {
|
|
set src_width [get_property "CONFIG.SRC_DATA_WIDTH" $ip]
|
|
set dst_width [get_property "CONFIG.DST_DATA_WIDTH" $ip]
|
|
if {$src_width != $dst_width} {
|
|
bd::send_msg -of $cellpath -type ERROR -msg_id 1 -text ": For multi AXI master configuration the Source AXIS interface width ($src_width) must match the Destination AXIS interface width ($dst_width) ."
|
|
} else {
|
|
# AXIS Data widths divided by number of masters must be >= 8 and power of 2
|
|
set bits_per_master [expr $src_width/$num_m]
|
|
if {$bits_per_master < 8} {
|
|
bd::send_msg -of $cellpath -type ERROR -msg_id 2 -text ": Number of AXI masters ($num_m) too high. AXIS data widths divided by number of masters ($src_width / $num_m = $bits_per_master) must be >= 8 ."
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
proc log2 {x} {
|
|
return [tcl::mathfunc::int [tcl::mathfunc::ceil [expr [tcl::mathfunc::log $x] / [tcl::mathfunc::log 2]]]]
|
|
}
|
|
|
|
# Executed when the block design is validated
|
|
proc propagate {cellpath otherinfo} {
|
|
set ip [get_bd_cells $cellpath]
|
|
|
|
}
|
|
|
|
proc post_propagate {cellpath otherinfo} {
|
|
set ip [get_bd_cells $cellpath]
|
|
|
|
#Check address space
|
|
set length_width [get_property "CONFIG.LENGTH_WIDTH" $ip]
|
|
set axi_addr_width [get_property "CONFIG.AXI_ADDR_WIDTH" $ip]
|
|
set ddr_base_adddress [get_property "CONFIG.DDR_BASE_ADDDRESS" $ip]
|
|
set hbm_segment_index [get_property "CONFIG.HBM_SEGMENT_INDEX" $ip]
|
|
set mem_type [get_property "CONFIG.MEM_TYPE" $ip]
|
|
if {$mem_type == 1} {
|
|
set addr_width [log2 [expr $ddr_base_adddress + 2 ** $length_width - 1]]
|
|
} else {
|
|
# assumption: 1 segmetn is 256MB
|
|
set addr_width [log2 [expr $hbm_segment_index * 256 * 1024 * 1024 + 2 ** $length_width - 1]]
|
|
}
|
|
|
|
set_property "CONFIG.AXI_ADDR_WIDTH" $addr_width $ip
|
|
bd::send_msg -of $cellpath -type INFO -msg_id 2 -text ": AXI Address Width set to $addr_width"
|
|
|
|
}
|