FPGA辅助设计脚本——Tcl

Tcl(读Tickle) 全称(Tool Command Language),是一种简单易学又十分强大的脚本语言,在数字集成电路设计中应用十分广泛。

  • 利用Tcl脚本,就可以完成工程的创建、综合、布局布线、引脚约束时序约束等过程。
  • Tcl脚本还可以轻松的保存和导出现有工程文件的约束和配置,然后移植到其他工程中。
  • Tcl脚本在 Modelsim 仿真中也有着十分广泛的应用。

一、Vivado Tcl使用 

1.建立工程

  利用Tcl建立工程,配置相关芯片信号、设置工程路径、建立工程名称相关工程的基本参数,一键完成新工程使用。

    #设置器件型号
    set device_model xc7z035fbg676-2
    #设置工程创建路径
    set dev_dir {G:\DeskTop\ZynqCode\11_Tcl_test}
    #切换到工程路径
    cd $dev_dir
    #显示工程路径
    puts "The home_dir is $dev_dir now!"
    #工程名称
    set project_name tlc_test
    #创建工程
    create_project $project_name $dev_dir -part $device_model
    #设置仿真语言为 verilog
    set_property simulator_language Verilog [current_project]

2.添加文件

  利用Tcl脚本将工程所需要的文件添加进入工程。减少手动添加过程。

    # 添加仿真tb文件
    add_files -fileset sim_1 ./Sources/hdl/cpu_tb.v
    # 添加VHDL文件
    add_files [ glob ./Sources/hdl/bftLib/*.vhdl ]
    add_files ./Sources/hdl/bft.vhdl
    # 添加verilog文件
    add_files [ glob ./Sources/hdl/*.v ]
    add_files [ glob ./Sources/hdl/mgt/*.v ]
    add_files [ glob ./Sources/hdl/or1200/*.v ]
    add_files [ glob ./Sources/hdl/usbf/*.v ]
    add_files [ glob ./Sources/hdl/wb_conmax/*.v ]
    # 添加约束文件
    add_files -fileset constrs_1 ./Sources/top_full.xdc
    set_property library bftLib [ get_files [ glob ./Sources/hdl/bftLib/*.vhdl ]]

3.添加初始化脚本

  Tcl脚本在Vivado软件还可以自定义初始化脚本,添加图标,这样软件可以通过点击图标自动运行脚本,非常方便。zynq内嵌了ARM核和FPGA,在工程设计中添加ARM核应该是最常用的操作,因此这里就用添加ARM核作为初始化脚本功能来进行示例。

3.1.设计脚本

首先建立一个Tcl脚本,脚本大致内容为:
1.生成 block design;
2.添加 “processing_system7” IP 核;
3.配置使用的DDR 型号为"MT41J256M16 RE-125"

 1     # 生成block design,命名为“design_1”
 2     create_bd_design "design_1"
 3     # 编译文件 sources_1
 4     update_compile_order -fileset sources_1
 5     # 生成zynq ps的IP核
 6     startgroup
 7     create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0
 8     endgroup
 9     # 配置IP核所用的DDR为“MT41J256M16 RE-125”
10     set_property -dict [list CONFIG.PCW_UIPARAM_DDR_PARTNO {MT41J256M16 RE-125} CONFIG.PCW_UART1_PERIPHERAL_ENABLE {1}] [get_bd_cells processing_system7_0]

3.2.建立命令

  通过vivado 的Tools -> Custom Commands -> Customize Commands,进行配置。

进入配置命令页面:
1.左侧"+" ,添加命令的名称;
2.右侧录入描述,在Source Tcl file 中添加刚才写好的脚本路径;
3.命令可以自己上传图片作为命令的工具栏图标。勾选 “Add to the toolbar”,选择我们的图标,点击"Apply"便完成了一键配置添加、配置PS核的脚本操作。

  由于是在软件中自定义的命令操作,因此重新建立工程也无须重新配置。使用vivado软件时,将通用、重复软件操作配置为命令,在工具栏一键自动完成操作,将大大节省时间,提高工作效率。
下面是刚才建立的Command的相关演示。

4.help使用

  把help 单独立一小节是因为在使用Tcl脚本的过程中,偶尔会忘记脚本使用或者命令名称等。这就需要常常使用Vivado 自带的Tcl help 功能。类似matlab一样,help相关命令会显示相关命令的使用方法、变量参数等,实在是很方便也很重要。

 

 二、Quartus Tcl使用

1.工程复制

  找一个已经编译好的小工程,在Quartus II中打开,点击Project -> Generate Tcl File for Project。

  这时在工程目录下,会生成一个后缀为.tcl的文件。然后,大家把这个Tcl文件,与这个工程的源文件(.v)复制到一个新的文件夹下,注意文件名不要有中文字符。在文件下新建一个空白的txt文档,输入“quartus_sh -t xxx.tcl”,注意后面的tcl名需要与自己的tcl文件相同,最终的结果是这样的。

 

  最后,将txt文档的后缀改为.bat。当双击这个.bat文件时会将原有的工程文件复制到当前目录下。这对于复制一个很大的工程时,只需要把脚本文件与源文件拷贝即可。

2.Tcl脚本介绍

  在Quartus II中,Tcl脚本有3个层次,分别是命令行可执行语句(Command-Line Executables)、Tcl内的包(Packages)与包内的命令(Package commands).

  在Win+R命令行中输入quartus_sh --qhelp,可以打开Quartus II自带的关于Tcl脚本的帮助文档。

  命令行可执行语句(Command-Line Executables)的形式全部为quartus_xx,是直接写入批处理脚本中的。

  这里用的 quartus_sh,其实是所谓的 Quartus shell,是为所有的步骤提供了一个入口。

  为了实现可执行命令所执行的功能,Quartus II里为每一个可执行命令提供了不同的。 而包内的命令,是我们真正要往Tcl脚本里写入的。

指令与包之间的关系如下。

  实心圆代表可执行语句默认加载了这个包。比如说,所有的可执行语句即quartus_xxx都加载了project这个包。这意味着,不管用任何可执行命令执行Tcl脚本,脚本中都可以调用project包下的指令,如 set_global_assignment。

  空心圆代表可执行语句无法加载这个包,比如假如用quartus_sh这条语句执行sdc这个包下的语句,就是不行的。

  半空半满圆代表可执行语句没有默认加载这个包,要是想用的话需要自己进行手动加载。在Tcl脚本内写入 load_package <package name>;之后,就可以使用对应包内的指令了。比如,使用quartus_sh这个指令去执行脚本,又需要执行flow这个包下的指令,如execute_flow,那么我们就需要在Tcl文件中写入 load_package flow 这句话。

  总结:批处理文件(.bat)中写可执行指令,如quartus_xxx;脚本(Tcl)文件中写可执行指令下Tcl包内的指令;如果没有包没有默认导入的话还要在Tcl文件中导入。

3.示例

  前面示例工程生成的Tcl脚本包含两部分,第一部分为工程检测,第二部分为工程配置约束。

 1 package require ::quartus::project
 2 
 3 set need_to_close_project 0
 4 set make_assignments 1
 5 
 6 # Check that the right project is open
 7 if {[is_project_open]} {
 8   if {[string compare $quartus(project) "led_test"]} {
 9     puts "Project led_test is not open"
10     set make_assignments 0
11   }
12 } else {
13   # Only open if not already open
14   if {[project_exists led_test]} {
15     project_open -revision led_test led_test
16   } else {
17     project_new -revision led_test led_test
18   }
19   set need_to_close_project 1
20 }

  这一部分主要是检查目前待创建的工程是否存在,如果不存在的话,就project_new -revision led_test led_test,即创建led_test这个工程。其中-revision后面跟的是一同被创建的qsf文件的名字。

当然如果自己写脚本的话其实没有必要这么多判断,创建工程直接写 project_new -revision <qsf文件名> <工程名> 这样即可。

 三、Modelsim Tcl使用

  以 modelsim <安装路径>/examples/tutorials/verilog/basicSimulation 这个路径下的文件 countrer.v 和 tcounter.v 为例进行说明。

  • 新建一个文件夹,将这两个文件放入,这里取名为modelsim_test。

  • 启动Modelsim,将路径切换到刚才我们新建的文件夹下。

       

 

  Modelsim会把文件的编译结果放到一个虚拟的Work库中。我们要把这个虚拟的work库,与电脑硬盘上一个真正的文件夹联系起来,这个步骤就是所谓的映射。通常这个文件夹我们也会叫work,当然也可以叫其他名字。

  • 新建一个库,取名为work。

 按下图操作,创建真实的work文件夹,和把文件夹与虚拟work库相连的过程。

 

 

 

 这时Transcript的输出是:

vlib work
vmap work work

vlib work是说,在Modelsim中建立了那个真实的work文件夹。

vmap work work是说,将Modelsim中的虚拟work库关联到我们vlib的那个真实的work文件夹。

所以也可以写成:

vlib dework
vmap work dework

  执行这一步后,文件夹下多了一个名为work的文件夹。同时,Modelsim中也多了一个叫做work的库。

点击Compile > Compile,将两个文件都编译到work库下。

【注】如果文件中包含IP核的话,也要将IP核的库文件复制到这个文件夹下,然后一同编译。

  之后点击 compile -> done。此时,work库下面出现了这两个文件。

注意Transcript的输出,这里的vlog就是"编译"的Tcl代码。

vlog -reportprogress 300 -work work C:/Users/13613/Desktop/modelsim_test/counter.v
vlog -reportprogress 300 -work work C:/Users/13613/Desktop/modelsim_test/tcounter.v

  接下来可以进行仿真了,点击Simulate > Start Simulation 将work库中的tcounter选中。将Optimization的小勾去掉(防止非预期优化,也是大多数情况下不出波形的原因)。

以下是Transcript的输出,vsim是Tcl中"仿真"的意思。

vsim -gui -novopt work.test_counter

将信号添加到波形图中。对应输出的Tcl脚本:

add wave sim:/test_counter/*

最后点击执行,对应Tcl脚本。

run

之后就出现波形了。

脚本自动化仿真:

1. 首先建立一个test文件夹,里面放着仿真文件 XX_tb.v,然后在这test文件夹里放一个sim文件夹,在此文件夹内新建一个sim.tcl文件,这样后面的工程和乱七八糟的文件都在内部的sim文件夹里。

2. 在sim .tcl文件里写好以下代码,这些代码建议保存或制作成代码片段,以后只需要稍微改一改就能用。

 1 # ==========================================================================
 2 # ==   清空软件残留信息
 3 # ==========================================================================
 4 
 5 # 退出之前仿真
 6 quit -sim
 7 
 8 # 清空信息
 9 .main clear
10 
11 # ==========================================================================
12 # ==   建立工程并仿真
13 # ==========================================================================
14 
15 # 建立新的工程库
16 vlib work
17 
18 # 映射逻辑库到物理目录
19 vmap work work
20 
21 # 编译仿真文件
22 vlog ./../*.v
23 
24 # 编译设计文件
25 vlog ./../../rtl/*.v
26 
27 # 无优化simulation                                        *** 请修改文件名 ***
28 vsim -novopt work.fsm_tb
29 
30 # 打开波形窗口
31 view wave  
32 view structure
33 
34 #打开信号窗口
35 view signals
36 
37 
38 # ==========================================================================
39 # ==   状态机名称查看器,如若不用请删除!!!
40 # ==========================================================================
41 
42 # 结构体设置
43 virtual type {
44     {4'b0001 S0}
45     {4'b0010 S1}
46     {4'b0100 S2}
47     {4'b1000 S3}
48 } fsm_type;
49 
50 # 结构体和信号名关联,命名为state_name
51 virtual function {(fsm_type)/fsm_tb/u_fsm/state} state_name
52 
53 # ==========================================================================
54 # ==   加载波形
55 # ==========================================================================
56 
57 # 添加波形,高度30,以unsigned格式显示                        *** 请修改路径名 ***
58 add wave -height 30 -radix unsigned /fsm_tb/u_fsm/*
59 
60 #运行
61 run 10 ms
62 
63 # 跑完
64 run -all

 

3.之后在文件夹下再新建一个文本文件,输入

::请按任意键继续...
pause

::打开Modelsim并执行do sim.tcl
vsim -do sim.tcl

再将后缀由.txt改为.bat,使用的时候双击这个bat文件即可。


————————————————
原文链接1:Vivado Tcl使用 —— 自定义命令设计

原文链接2:手把手教你用Tcl脚本进行Modelsim仿真

原文链接3:Modelsim——工程建立和常用设置

posted on 2021-06-22 22:00  一曲挽歌  阅读(3718)  评论(0编辑  收藏  举报

导航