vivado工程打包

article/2025/10/7 10:37:32

一般使用自带archive功能进行归档,但是归档的工程路径较乱,不能将源文件和工程进行明显的分析。一种比较常用的方法就是使用tcl脚本:

现在已经有了生成的语法模板,需要在修改下自己需要的新工程名称,并去掉一些不需要的功能使得看上去尽可能简洁明了:下面是一份来自vivado_riscv工程的参考:vivado-risc-v/vivado.tcl at master · timewh/vivado-risc-v · GitHub

# If there is no project opened, create a project
set list_projs [get_projects -quiet]
if { $list_projs eq "" } {create_project ${vivado_board_name}-riscv vivado-${vivado_board_name}-riscv -part ${xilinx_part}set_property BOARD_PART ${vivado_board_part} [current_project]
}# Create 'sources_1' fileset (if not found)
if {[string equal [get_filesets -quiet sources_1] ""]} {create_fileset -srcset sources_1
}# Create 'constrs_1' fileset (if not found)
if {[string equal [get_filesets -quiet constrs_1] ""]} {create_fileset -constrset constrs_1
}# Set 'sources_1' fileset object
set source_fileset [get_filesets sources_1]# Set 'constrs_1' fileset object
set constraint_fileset [get_filesets constrs_1]set files [list \[file normalize "rocket.vhdl"] \[file normalize "srams.v"] \[file normalize "system-${vivado_board_name}.v"] \[file normalize "../../uart/uart.v"] \[file normalize "../../sdc/sd_defines.h"] \[file normalize "../../sdc/axi_sd_fifo.v"] \[file normalize "../../sdc/axi_sd_fifo_filler.v"] \[file normalize "../../sdc/axi_sdc_controller.v"] \[file normalize "../../sdc/sd_cmd_master.v"] \[file normalize "../../sdc/sd_cmd_serial_host.v"] \[file normalize "../../sdc/sd_data_master.v"] \[file normalize "../../sdc/sd_data_serial_host.v"] \[file normalize "../../sdc/sd_data_xfer_trig.v"] \[file normalize "../../vhdl-wrapper/src/net/largest/riscv/vhdl/bscan2jtag.vhdl"] \[file normalize "../../board/${vivado_board_name}/ethernet-${vivado_board_name}.v"] \[file normalize "../../board/mem-reset-control.v"] \[file normalize "../../board/fan-control.v"] \
]
add_files -norecurse -fileset $source_fileset $files# Note: top.xdc must be first - other files depend on clocks defined in top.xdc
set files [list \[file normalize ../../board/${vivado_board_name}/top.xdc] \[file normalize ../../board/${vivado_board_name}/sdc.xdc] \[file normalize ../../board/${vivado_board_name}/uart.xdc] \
]
add_files -norecurse -fileset $constraint_fileset $filessource ../../board/${vivado_board_name}/ethernet-${vivado_board_name}.tcl# Note: timing-constraints.tcl must be last
set files [list \[file normalize ../../board/timing-constraints.tcl] \
]
add_files -norecurse -fileset $constraint_fileset $files# Set file propertiesset file_obj [get_files -of_objects $source_fileset [list "*/*.vhdl"]]
set_property -name "file_type" -value "VHDL" -objects $file_objset file_obj [get_files -of_objects $constraint_fileset [list "*/*.xdc"]]
set_property -name "file_type" -value "XDC" -objects $file_obj
set_property -name "used_in" -value "implementation" -objects $file_obj
set_property -name "used_in_synthesis" -value "0" -objects $file_objset file_obj [get_files -of_objects $constraint_fileset [list "*/*.tcl"]]
set_property -name "file_type" -value "TCL" -objects $file_obj
set_property -name "used_in" -value "implementation" -objects $file_obj
set_property -name "used_in_synthesis" -value "0" -objects $file_obj# Create block design
set current_vivado_version [version -short]
source ../../board/${vivado_board_name}/riscv-${current_vivado_version}.tclif { [llength [get_bd_intf_pins -quiet RocketChip/JTAG]] == 1 } {create_bd_cell -type module -reference bscan2jtag JTAGconnect_bd_intf_net -intf_net JTAG [get_bd_intf_pins JTAG/JTAG] [get_bd_intf_pins RocketChip/JTAG]create_bd_cell -type ip -vlnv xilinx.com:ip:debug_bridge:3.0 BSCANset_property -dict [list CONFIG.C_DEBUG_MODE {7} CONFIG.C_USER_SCAN_CHAIN {1} CONFIG.C_NUM_BS_MASTER {1}] [get_bd_cells BSCAN]connect_bd_intf_net -intf_net BSCAN [get_bd_intf_pins BSCAN/m0_bscan] [get_bd_intf_pins JTAG/S_BSCAN]
}set_property CONFIG.CLKOUT1_REQUESTED_OUT_FREQ $riscv_clock_frequency [get_bd_cells clk_wiz_0]
validate_bd_designregenerate_bd_layout
save_bd_designif { [get_files -quiet -of_objects $source_fileset [list "*/riscv_wrapper.v"]] == "" } {make_wrapper -files [get_files riscv.bd] -topadd_files -norecurse [file normalize vivado-${vivado_board_name}-riscv/${vivado_board_name}-riscv.srcs/sources_1/bd/riscv/hdl/riscv_wrapper.v ]
}
set_property top riscv_wrapper $source_fileset
update_compile_order -fileset $source_fileset

结合自动生成的tcl和这份参考简单总结下语法:两步

1,create_project

     指定工程的名字、路径以及器件型号

2,文件集相关操作fileset (一共4-5步:建立、添加、设置文件属性、设置文件集属性、激活当前文件集)一般来说需要3个文件集

  建立sources_1  create_fileset -srcset sources_1

        添加文件  add_files -norecurse -fileset $source_fileset $files

        文件集属性设置:指定top

   建立constrs_1 

       (1) create_fileset -constrset constrs_1

       (2)add_files -norecurse -fileset $constraint_fileset $files

       (3)设置文件属性

       set_property -name "used_in" -value "implementation" -objects $file_obj
       set_property -name "used_in_synthesis" -value "0" -objects $file_obj

      (4)设置文件集属性

  建立sim_1

(一半默认会建立sim_1并active,所以在生成的脚本里面会先判断是否found在创建,如果不需要sim_1,需要先deactive在删除该集)

 其它:

也可以引用其它tcl:

 建立bd:

 这部分应该可以借助write tcl生成。

    ....

整体来说还是比较简单的。

运行时可以在做个脚本直接一键生成:

over


http://chatgpt.dhexx.cn/article/YPWWcUHI.shtml

相关文章

使用vivado封装IP

文章目录 Basics定制IP的参数Enablement Expression封装IP时使用了绝对路径封装IP时设置Address Map Addr相关tcl修正警告Bus Interface clk: ASSOCIATED_BUSIF bus parameter is missing.rst识别成低有效复位Bus Interface up_axi: FREQ_HZ bus parameter missing from AXI in…

vivado使用方法(初级)

文章目录 1 创建新工程1.1 工程创建1.2 新建Verilog文件1.3 仿真 参考 1 创建新工程 1.1 工程创建 1、首先打开Vavido软件,点击Creat Project或者在File——>Project——>New里面进行新工程的创建 2、然后在弹出的界面上点击Next进入下一个界面进行项目的命…

Vivado基础教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、创建项目二、添加设计文件代码 三、综合四、添加约束文件五、上板5.1、生产比特流文件5.2、硬件调试 前言 本文详细的讲述了vivado项目创建到上板的流程。…

vivado基本使用流程(详细版,一步步跟着来一定能成功)

创建工程 1、 2 3、项目名称不能有空格,目录不能含有中文路径 4、 5、 6、 7、 8、 9、 10、 11、 12、 13、 14、 15、 16、 可以查看一下新建的文件 二、设置IP核 1、 2、 3、 4、 5、 6、 7、 可以查看到生成的ip核 8、 找到例化模板,日常…

虚拟基类

对于虚拟基类的个人理解,如有误恳请指正。 1.不用虚拟基类 class cBase_A{int x; public:cBase_A( ){x10;}int getx(){return x;}void setx(int a){xa;}};class cBase_B: public cBase_A{ };class cBase_C: public cBase_A{ };class cDerived_D: public cBase_B…

系统调用。

什么是系统调用,有何作用? 生活场景:你去学校打印店打印论文,当你按下“打印”之后,打印机开始工作。你的论文打印到一半时,另一位同学按下了“打印”按钮开始打印他自己的论文。最终,你的论文和该同学的论…

C++ 基础之虚函数和虚基类

C 基础之虚函数和虚基类 C 有别于 C ,比较重要的就是其抽象、封装、继承和多态等特性。多态又具体地体现在重载、虚函数和模板等等之上。 今天就和大家聊一聊虚函数和虚基类。 虚函数 我们来思考一个问题。假如子(派生)类 B 继承自父(基&…

虚基类 的作用

虚基类 需要解决的问题 当派生类从多个基类派生,而这些基类又共同基类,则在访问此共同基类中的成员时,将产生冗余,并有可能因冗余带来不一致性虚基类声明 以virtual说明基类继承方式例:class B1:virtual public B作用…

虚基类的作用

1 概念 首先还是先给出虚继承和虚基类的定义。虚继承:在继承定义中包含了virtual关键字的继承关系; 虚基类:在虚继承体系中的通过virtual继承而来的基类,需要注意的是: CSubClass : public virtual CBase {}; 其中CB…

系统调用:系统调用的实现

7.3.3 系统调用的实现 1. 中断和陷入硬件机构 (1) 什么是中断和陷入。 中断是指CPU对系统发生某事件时的这样一种响应:CPU暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序;执行完后,再返回到原程序的断点处继…

系统调用、函数调用

1、系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的, 内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口呈现给…

C++ 虚基类

C 虚基类 概述多重继承的问题虚基类初始化例子 总结 概述 虚基类 (virtual base class) 是用关键字 virtual 声明继承的父类. 多重继承的问题 N 类: class N { public:int a;void display(){cout << "A::a" << a <<endl;} };A 类: class A :…

虚基类

虚基类 意义:假设定义了一个公共基类A。类B和类C都由类A公有派生,类D由类B和类C公有派生。显然D包含类A的两个拷贝,不仅多占用内存,而且还造成多个拷贝的数据不一致。 不定义虚基类的效果如下: class A {public:int x;void SetX(int a) { x = a; }A(int a = 0) { x = a…

【操作系统】系统调用

文章目录 系统调用系统调用举例文件拷贝的系统调用过程应用程序接口系统调用接口C语言系统调用接口Windows和UNIX系统调用示例系统调用与的库函数区别补充说明系统调用 系统调用,System call,提供了操作系统的服务接口。这些系统调用通常以C或C++编写,对某些底层任务可能以…

C++之基类调用自己的虚函数

每个类中存在虚函数时&#xff0c;当构造一个对象时&#xff0c;系统会为对象分配相应的内存空间。但是虚函数表存放在程序的只读数据段中&#xff0c;在实例化对象时&#xff0c;编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable&#xff1b; 下面看一个小例子&#x…

如何调用基类私有的虚函数

直接看代码 #include <iostream> #include <stdio.h> using namespace std;class person { public:virtual void name(){cout<<"A::name"<<endl;}private:virtual void sex(){cout<<"A::sex"<<endl;} };class studen…

详解虚函数的实现过程之虚基类(4)

博客虚函数实现过程3 时提到过虚基类&#xff0c;这里呢&#xff0c;我们来详细讲述一下&#xff1a; 当我们在虚函数的声明结尾处添加“0”&#xff0c;这种虚函数就被称为纯虚函数。 它好似一个没有实现只有声明的函数&#xff0c;它的存在就是为了让类具有抽象类的功能&…

虚基类的基本概念

1.虚基类的作用 类B与类C都为类D的基类&#xff0c;而类A为类B与类C的基类&#xff0c;因此类D会继承类B与类C的多份同名成员。如下图所示&#xff1a; 在引用这些同名成员时&#xff0c;必须在派生类对象后增加直接基类名&#xff0c;以避免产生二义性&#xff0c;如&#x…

【虚基类、虚函数及应用】

虚基类 1.虚基类存在的意义 当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处&#xff0c;这个公共的基类就会产生多个实例(或多个副本)&#xff0c;若只想保存这个基类的一个实例&#xff0c;可以将这个公共基类说明为虚基类。 在继承中产生歧义的原因有可能是…