xilinx vivado:从tcl中读取组件.xml文件到项目中。

问题描述 投票:0回答:1

假设,我有一个vivado项目,我的设置如下。

  1. 创建一个模块设计
  2. 实例化了一些IP核,并将它们连接在一起。
  3. 从模块设计中导出我想要的IO。
  4. 在层次结构浏览器中点击区块设计,并创建了一个HDL包装器。
  5. 用IP打包器创建一个 "component.xml "文件,代表打包后的IP核。 (Tool->Package IP->打包当前项目)

现在我想在另一个vivado项目中使用这个打包好的IP核,并让它显示在IP集成器的 "用户 "库下。 有没有办法把这个 "component.xml "文件从另一个vivado项目导入到当前项目中? 最好用tcl来导入?

我的vivado块设计是这样的。

IP packager block design

vhdl verilog xilinx vivado
1个回答
0
投票

答案是你将当前项目的 "设置ip_repos_path属性 "指向另一个项目的 "component.xml "文件所在的目录,然后你发出tcl命令: update_ip_catalog。 这将导致打包后的核心显示在IP integrator的 "用户 "标签下。

下面是一个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"
}
© www.soinside.com 2019 - 2024. All rights reserved.