280 lines
8.6 KiB
Tcl
280 lines
8.6 KiB
Tcl
source ../../scripts/adi_env.tcl
|
|
source $ad_hdl_dir/library/scripts/adi_ip_xilinx.tcl
|
|
|
|
global VIVADO_IP_LIBRARY
|
|
|
|
adi_ip_create data_offload
|
|
adi_ip_files data_offload [list \
|
|
"data_offload_sv.ttcl" \
|
|
"$ad_hdl_dir/library/common/up_axi.v" \
|
|
"$ad_hdl_dir/library/common/ad_mem_asym.v" \
|
|
"$ad_hdl_dir/library/common/ad_axis_inf_rx.v" \
|
|
"data_offload_regmap.v" \
|
|
"data_offload_fsm.v" \
|
|
"data_offload.v" ]
|
|
|
|
## NOTE: To solve the issue AR# 70646 we need to call the following command
|
|
##set_property source_mgmt_mode DisplayOnly [current_project]
|
|
|
|
adi_ip_properties data_offload
|
|
adi_ip_ttcl data_offload "data_offload_constr.ttcl"
|
|
adi_ip_sim_ttcl data_offload "data_offload_sv.ttcl"
|
|
|
|
adi_ip_add_core_dependencies [list \
|
|
analog.com:$VIVADO_IP_LIBRARY:util_cdc:1.0 \
|
|
analog.com:$VIVADO_IP_LIBRARY:util_axis_fifo_asym:1.0 \
|
|
]
|
|
|
|
set_property display_name "ADI Data Offload Controller" [ipx::current_core]
|
|
set_property description "ADI Data Offload Controller" [ipx::current_core]
|
|
|
|
## Interface definitions
|
|
|
|
## destination interfaces (e.g. RX_DMA or DAC core)
|
|
|
|
adi_add_bus "m_axis" "master" \
|
|
"xilinx.com:interface:axis_rtl:1.0" \
|
|
"xilinx.com:interface:axis:1.0" \
|
|
[ list \
|
|
{"m_axis_ready" "TREADY"} \
|
|
{"m_axis_valid" "TVALID"} \
|
|
{"m_axis_data" "TDATA"} \
|
|
{"m_axis_last" "TLAST"} \
|
|
{"m_axis_tkeep" "TKEEP"} ]
|
|
|
|
## source interface (e.g. TX_DMA or ADC core)
|
|
|
|
adi_add_bus "s_axis" "slave" \
|
|
"xilinx.com:interface:axis_rtl:1.0" \
|
|
"xilinx.com:interface:axis:1.0" \
|
|
[ list \
|
|
{"s_axis_ready" "TREADY"} \
|
|
{"s_axis_valid" "TVALID"} \
|
|
{"s_axis_data" "TDATA"} \
|
|
{"s_axis_last" "TLAST"} \
|
|
{"s_axis_tkeep" "TKEEP"} ]
|
|
|
|
adi_add_bus "wr_ctrl" "master" \
|
|
"analog.com:interface:if_do_ctrl_rtl:1.0" \
|
|
"analog.com:interface:if_do_ctrl:1.0" \
|
|
[list {"wr_request_enable" "request_enable"} \
|
|
{"wr_request_valid" "request_valid"} \
|
|
{"wr_request_ready" "request_ready"} \
|
|
{"wr_request_length" "request_length"} \
|
|
{"wr_response_measured_length" "response_measured_length"} \
|
|
{"wr_response_eot" "response_eot"} \
|
|
{"wr_overflow" "status_overflow"} \
|
|
]
|
|
|
|
adi_add_bus "rd_ctrl" "master" \
|
|
"analog.com:interface:if_do_ctrl_rtl:1.0" \
|
|
"analog.com:interface:if_do_ctrl:1.0" \
|
|
[list {"rd_request_enable" "request_enable"} \
|
|
{"rd_request_valid" "request_valid"} \
|
|
{"rd_request_ready" "request_ready"} \
|
|
{"rd_request_length" "request_length"} \
|
|
{"rd_response_eot" "response_eot"} \
|
|
{"rd_underflow" "status_underflow"} \
|
|
]
|
|
|
|
adi_add_bus "s_storage_axis" "slave" \
|
|
"xilinx.com:interface:axis_rtl:1.0" \
|
|
"xilinx.com:interface:axis:1.0" \
|
|
[list {"s_storage_axis_ready" "TREADY"} \
|
|
{"s_storage_axis_valid" "TVALID"} \
|
|
{"s_storage_axis_data" "TDATA"} \
|
|
{"s_storage_axis_tkeep" "TKEEP"} \
|
|
{"s_storage_axis_last" "TLAST"}]
|
|
|
|
adi_add_bus "m_storage_axis" "master" \
|
|
"xilinx.com:interface:axis_rtl:1.0" \
|
|
"xilinx.com:interface:axis:1.0" \
|
|
[list {"m_storage_axis_ready" "TREADY"} \
|
|
{"m_storage_axis_valid" "TVALID"} \
|
|
{"m_storage_axis_data" "TDATA"} \
|
|
{"m_storage_axis_tkeep" "TKEEP"} \
|
|
{"m_storage_axis_last" "TLAST"}]
|
|
|
|
adi_add_bus_clock "m_axis_aclk" "s_storage_axis:m_axis" "m_axis_aresetn"
|
|
adi_add_bus_clock "s_axis_aclk" "m_storage_axis:s_axis" "s_axis_aresetn"
|
|
|
|
set cc [ipx::current_core]
|
|
|
|
set_property -dict [list \
|
|
enablement_resolve_type dependent \
|
|
driver_value 0 \
|
|
enablement_dependency {MEM_TYPE == 1} \
|
|
] \
|
|
[ipx::get_ports ddr_calib_done -of_objects $cc]
|
|
|
|
set_property -dict [list \
|
|
driver_value 0 \
|
|
] \
|
|
[ipx::get_ports wr_overflow -of_objects $cc]
|
|
|
|
set_property -dict [list \
|
|
driver_value 0 \
|
|
] \
|
|
[ipx::get_ports rd_underflow -of_objects $cc]
|
|
|
|
## Parameter validations
|
|
|
|
## MEM_TPYE
|
|
set_property -dict [list \
|
|
"value_format" "long" \
|
|
"value_validation_type" "pairs" \
|
|
"value_validation_pairs" { \
|
|
"Internal memory" "0" \
|
|
"External memory" "1" \
|
|
} \
|
|
] \
|
|
[ipx::get_user_parameters MEM_TYPE -of_objects $cc]
|
|
|
|
set_property -dict [list \
|
|
"value_format" "long" \
|
|
] \
|
|
[ipx::get_hdl_parameters MEM_TYPE -of_objects $cc]
|
|
|
|
set_property -dict [list \
|
|
"value_validation_type" "pairs" \
|
|
"value_validation_pairs" { \
|
|
"RX path" "0" \
|
|
"TX path" "1" \
|
|
} \
|
|
] \
|
|
[ipx::get_user_parameters TX_OR_RXN_PATH -of_objects $cc]
|
|
|
|
set_property -dict [list \
|
|
"value_validation_type" "pairs" \
|
|
"value" "10" \
|
|
"value_validation_pairs" {\
|
|
"1kB" "10" \
|
|
"2kB" "11" \
|
|
"4kB" "12" \
|
|
"8kB" "13" \
|
|
"16kB" "14" \
|
|
"32kB" "15" \
|
|
"64kB" "16" \
|
|
"128kB" "17" \
|
|
"256kB" "18" \
|
|
"512kB" "19" \
|
|
"1MB" "20" \
|
|
"2MB" "21" \
|
|
"4MB" "22" \
|
|
"8MB" "23" \
|
|
"16MB" "24" \
|
|
"32MB" "25" \
|
|
"64MB" "26" \
|
|
"128MB" "27" \
|
|
"256MB" "28" \
|
|
"512MB" "29" \
|
|
"1GB" "30" \
|
|
"2GB" "31" \
|
|
"4GB" "32" \
|
|
"8GB" "33" \
|
|
"16GB" "34" \
|
|
} \
|
|
] \
|
|
[ipx::get_user_parameters MEM_SIZE_LOG2 -of_objects $cc]
|
|
|
|
## Boolean parameters
|
|
foreach {k v} { \
|
|
"HAS_BYPASS" "true" \
|
|
"DST_CYCLIC_EN" "true" \
|
|
"SYNC_EXT_ADD_INTERNAL_CDC" "true" \
|
|
} { \
|
|
set_property -dict [list \
|
|
"value_format" "bool" \
|
|
"value_format" "bool" \
|
|
"value" $v \
|
|
] \
|
|
[ipx::get_user_parameters $k -of_objects $cc]
|
|
set_property -dict [list \
|
|
"value_format" "bool" \
|
|
"value_format" "bool" \
|
|
"value" $v \
|
|
] \
|
|
[ipx::get_hdl_parameters $k -of_objects $cc]
|
|
}
|
|
|
|
### Customize IP Layout
|
|
|
|
## Remove the automatically generated GUI page
|
|
ipgui::remove_page -component $cc [ipgui::get_pagespec -name "Page 0" -component $cc]
|
|
ipx::save_core [ipx::current_core]
|
|
|
|
## Create a new GUI page
|
|
ipgui::add_page -name {Data Offload} -component [ipx::current_core] -display_name {Data Offload}
|
|
set page0 [ipgui::get_pagespec -name "Data Offload" -component $cc]
|
|
|
|
## General Configurations
|
|
set general_group [ipgui::add_group -name "General Configuration" -component $cc \
|
|
-parent $page0 -display_name "General Configuration" ]
|
|
|
|
ipgui::add_param -name "ID" -component $cc -parent $general_group
|
|
set_property -dict [list \
|
|
"display_name" "Core ID" \
|
|
] [ipgui::get_guiparamspec -name "ID" -component $cc]
|
|
|
|
ipgui::add_param -name "TX_OR_RXN_PATH" -component $cc -parent $general_group
|
|
set_property -dict [list \
|
|
"widget" "comboBox" \
|
|
"display_name" "Data path type" \
|
|
] [ipgui::get_guiparamspec -name "TX_OR_RXN_PATH" -component $cc]
|
|
|
|
ipgui::add_param -name "MEM_TYPE" -component $cc -parent $general_group
|
|
set_property -dict [list \
|
|
"widget" "comboBox" \
|
|
"display_name" "Storage Type" \
|
|
] [ipgui::get_guiparamspec -name "MEM_TYPE" -component $cc]
|
|
|
|
ipgui::add_param -name "MEM_SIZE_LOG2" -component $cc -parent $general_group
|
|
set_property -dict [list \
|
|
"display_name" "Storage Size" \
|
|
"tooltip" "Log2 value of Storage Size in bytes" \
|
|
] [ipgui::get_guiparamspec -name "MEM_SIZE_LOG2" -component $cc]
|
|
|
|
## Transmit and receive endpoints
|
|
set source_group [ipgui::add_group -name "Source Endpoint Configuration" -component $cc \
|
|
-parent $page0 -display_name "Source Endpoint Configuration" \
|
|
-layout "horizontal"]
|
|
set destination_group [ipgui::add_group -name "Destination Endpoint Configuration" -component $cc \
|
|
-parent $page0 -display_name "Destination Endpoint Configuration" \
|
|
-layout "horizontal"]
|
|
|
|
ipgui::add_param -name "SRC_DATA_WIDTH" -component $cc -parent $source_group
|
|
set_property -dict [list \
|
|
"display_name" "Source Interface data width" \
|
|
] [ipgui::get_guiparamspec -name "SRC_DATA_WIDTH" -component $cc]
|
|
|
|
ipgui::add_param -name "DST_DATA_WIDTH" -component $cc -parent $destination_group
|
|
set_property -dict [list \
|
|
"display_name" "Destination Interface data width" \
|
|
] [ipgui::get_guiparamspec -name "DST_DATA_WIDTH" -component $cc]
|
|
|
|
## Other features
|
|
set features_group [ipgui::add_group -name "Features" -component $cc \
|
|
-parent $page0 -display_name "Features" ]
|
|
|
|
ipgui::add_param -name "HAS_BYPASS" -component $cc -parent $features_group
|
|
set_property -dict [list \
|
|
"display_name" "Internal Bypass Data Path Enabled" \
|
|
] [ipgui::get_guiparamspec -name "HAS_BYPASS" -component $cc]
|
|
|
|
ipgui::add_param -name "DST_CYCLIC_EN" -component $cc -parent $features_group
|
|
set_property -dict [list \
|
|
"display_name" "Destination Cyclic Mode Enabled" \
|
|
] [ipgui::get_guiparamspec -name "DST_CYCLIC_EN" -component $cc]
|
|
set_property enablement_tcl_expr {$TX_OR_RXN_PATH == 1} [ipx::get_user_parameters DST_CYCLIC_EN -of_objects $cc]
|
|
|
|
ipgui::add_param -name "SYNC_EXT_ADD_INTERNAL_CDC" -component $cc -parent $features_group
|
|
set_property -dict [list \
|
|
"display_name" "Generate CDC Circuit for sync_ext" \
|
|
] [ipgui::get_guiparamspec -name "SYNC_EXT_ADD_INTERNAL_CDC" -component $cc]
|
|
|
|
## Create and save the XGUI file
|
|
ipx::create_xgui_files $cc
|
|
|
|
ipx::save_core [ipx::current_core]
|
|
|