verilog - xilinx vivado:从 tcl 将 component.xml 文件读入项目
问题描述
假设,我有一个 vivado 项目,我设置如下:
- 创建块设计。
- 例化了一些 IP 核,并将它们连接在一起
- 从块设计中导出了我想要的 IO
- 单击层次结构浏览器中的块设计并创建一个 HDL 包装器
- 使用 IP 封装器创建一个“component.xml”文件,表示封装的 IP 核。(工具->打包IP->打包当前项目)
现在我想在另一个 vivado 项目中使用这个打包的 IP 核,并让它显示在“用户”库下的 IP 集成器下。有没有办法将这个“component.xml”文件从另一个 vivado 项目导入到当前项目中?最好使用tcl?
这是我的 vivado 块设计的样子:
解决方案
答案是您“设置当前项目的 ip_repos_path 属性”以指向包含来自其他项目的“component.xml”文件的目录,然后发出 tcl 命令:update_ip_catalog。这将导致封装内核显示在“用户”选项卡下的 IP 集成器中。
这是一个执行此任务的 vivado tcl 脚本,假设您以前使用过 create_project 或 open_project 命令:
proc tool_add_xact {file_component_xml} {
puts "\n=> add_xact: $file_component_xml"
global current_xml_name
global current_xml_vlnv
if {! [file exists $file_component_xml]} {
puts "ERROR: file doesn't exist: $file_component_xml"
exit 1;
}
if {! [regexp {component\.xml$} $file_component_xml tmp]} {
puts "ERROR: wrong file name ($file). This proc only reads component.xml files created by IP Packager."
exit 1;
}
set xml_dir [file dirname $file_component_xml]
set cfs [current_fileset]
set old_path [get_property ip_repo_paths $cfs]
set new_path [concat $old_path $xml_dir]
puts " xml_dir: ($xml_dir)"
puts " add_repo:($new_path)"
set_property ip_repo_paths $new_path $cfs
puts " update_ip_catalog"
update_ip_catalog
puts " open_core"
set core [ipx::open_core -set_current false $file_component_xml]
set vlnv [get_property vlnv $core]
set tidbits [split $vlnv ":"]
puts " vlnv: $vlnv"
puts " close_core"
ipx::unload_core $core
set current_xml_name [lindex $tidbits 2]
set current_xml_vlnv $vlnv
}
# Instantiate XACT IP
proc tool_add_core {args} {
puts "\n=> add_core: $args"
global current_xml_name
global current_xml_vlnv
#flag defaults
set level 1
set inst ""
# Parse Flags
while {[llength $args]} {
set flag [lindex $args 0]
#puts "flag: ($flag)"
#puts "args: ($args)"
switch -glob $flag {
-level {
# Instantion Generation Level
set level [lindex $args 1]
set args [lrange $args 2 end]
puts "level:($level) args($args)"
} -inst {
# Override default instantation name
set autoname 0
set inst [lindex $args 1]
set args [lrange $args 2 end]
puts "inst:($inst) args($args)"
} -h* {
#help
puts "USAGE:"
puts " tool_add_core \[flags\] <component.xml>"
puts ""
puts "FLAGS:"
puts " -level 0 //Instantiate only"
puts " -level 1 //Instantiate + Generate Instantiation templates"
puts " -level 2 //Instantiate + Generate all"
puts " -level 3 //Instantiate + Synthesize"
puts " -inst <name> //set name of instance, default: \${corename}_1"
exit 1
} -* {
# unknown option
error "unknown option [lindex $args 0]"
} default break
}
}
#puts "args: ($args)"
# remaining argument is component.xml flag
set file_component_xml "$args"
puts "component_xml: $args"
# Add Packaged IP core, aka. "component.xml", to "IP Integator Library"
tool_add_xact $file_component_xml
if {$inst == ""} {
set module_ip "${current_xml_name}_1"
} else {
set module_ip "${inst}"
}
puts "-> level: $level"
puts "-> inst: $module_ip"
# Create XCI by instantiating component just added to "IP Integrator Library"
puts "-> create_ip -verbose -module_name $module_ip -vlnv $current_xml_vlnv"
create_ip \
-verbose \
-module_name $module_ip \
-vlnv $current_xml_vlnv
set ip_obj [get_ips "${module_ip}"]
# Instantate only
if {$level == 0} {
return
}
# Instantiate + Generate Instantiation template only
if {$level == 1} {
puts "\n-> generate_target {instantiation_template}"
#generate_target {instantiation_template} [get_files "${module_ip}.xci"]
generate_target {instantiation_template} $ip_obj
return
}
# Instantiate + Generate all
if {$level == 2} {
puts "\n-> generate_target {all}"
generate_target {all} $ip_obj
return
}
# Instantiate + Generate all + Synthesize Core
if {$level == 3} {
puts "\n-> generate_target {all}"
generate_target {all} $ip_obj
set run_name "${module_ip}_synth_1"
set run_jobs 8
puts "\n-> synth_ip name:${run_name} jobs:${run_jobs}"
create_ip_run $ip_obj
launch_run -jobs $run_jobs $run_name
wait_on_run $run_name
return
}
error "unknown -level $level"
}
推荐阅读
- javascript - 反应 onChange 功能不适用于选择标签
- google-api - 个人资料信息的谷歌旧 api 不起作用,新的 API URL 是什么?
- typescript - 打字稿参数未对齐 (align)tslint(1)
- php - 如何配置 nginx 仅将 URL 中的第一个路径映射到 php 应用程序的特定目录?
- javascript - 在 Javascript(Angular)中调用异步函数的最佳方法是延迟/睡眠。Setimeout 不允许这样做
- kotlin - 类型或类键控映射
- css - 为什么我们需要显示块来使按钮居中
- css - 根据页面滚动固定 div
- pine-script - 如何在 pine 脚本中使用杠杆
- regex - Spark - 使用正则表达式从字母数字字符串中提取数值