这期内容当中小编将会给大家带来有关Quartus命令行及脚本使用介绍是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
Quartus本身除了GUI以外,还可以在不打开GUI的情况下通过命令行执行命令或者脚本来进行工程创建、指定器件及型号、读取源码、引脚分配、编译、布局布线、约束等操作,本教程涉及工程创建、指定器件及型号、读取源码、编译以及生成blif,至于后面的布局布线、引脚分配、约束等功能可以看完教程后查看相关资料搞定。
认真阅读完上面的链接对应的内容,读完以后基本就可以掌握了。
首先将quartus的路径加入到用户变量中去。
quartus的命令行和脚本功能一共包含两个部分:可执行命令和包。不同的命令可以调用不同的包,而不同的包有着不同的功能。
先说在前面,flow
包中的execute_module
指令后面可以接map、fit、sim、sta
等选项,其功能与quartus_map、quartus_fit、quartus_sim、quartus_sta
一致,并且后面可以跟-args
选项,这就将外部命令和内部包联系在了一起,即使在tcl
下面也可以执行外部的命令。
比如,quartus_sh
是一个可执行命令,除了-h、--help等这些所有可执行命令都有的选项以外,quartus_sh
还可以调用project
这个包,而project
这个包内包含的project_new、project_open
等功能都可以被quartus_sh
使用,但每个可执行命令后面跟的选项并没有包含所有可调用包的所有命令,而仅仅包含了少量包的常用命令,比如在终端输入quarus_sh --help
,会显示后面可以跟的选项:
zli@lizhen:~$ quartus_sh --help Quartus Prime Shell Version 18.1.0 Build 625 09/12/2018 SJ Lite Edition Copyright (C) 2018 Intel Corporation. All rights reserved. Usage: ------ quartus_sh [-h | --help[=<option|topic>] | -v] quartus_sh -g | --gui [<project_name>] quartus_sh <other options> quartus_sh -t <script file> [<script args>] quartus_sh -s quartus_sh --tcl_eval <tcl command> Description: ------------ Options: -------- -f <argument file> --archive --clean --flow --ip_upgrade --lower_priority --platform --platform_install --prepare --qboard --qhelp --qslave --relcon --restore --set --simlib_comp --write_flow_template Help Topics: ------------ arguments return_codes tcl For more information on specific options, use --help=<option|topic>.
flow
是一个可以被quartus_sh
调用的包,上面的Option
下面的--flow
就代表了这个包,后面可以接compile
,完整命令是quartus_sh --flow compile xxx
,该命令会打开名为xxx
的project并编译。
但quartus_sh
后面跟的选项并没有包含所有包的所有命令,比如flow
包的delete_netlist、execute_module
等功能并没有在选项中出现,刚刚讲过的project
包及功能也没有在选项中出现,我们如何调用呢?
答案是:进入交互式界面--Tcl Console。
quartus
的每一个可执行命令如quartus_sh、quartus_sta、quartus_map
后面都可以接-s
,回车以后就进入了相应命令的交互式界⾯,注意是相应命令,意思是该界⾯下只 能执⾏该命令对应的包的功能,⽐如我输⼊quartus_sh -s
进⼊quartus_sh
的交互式界 ⾯:
zli@lizhen:~$ quartus_sh -s ...... tcl>
在该界面下quartus_sh
所能调用的包的所有命令都可以执行,但不被quartus_sh
调用的包的命令不能被执行,比如: 当我执行check_timing
这条命令时就会显示不能执行,并且会提示可以调用该命令的可执行命令:
tcl> check_timing ERROR: Quartus Prime Tcl command "check_timing" is only available for use in the following executables: quartus_fit quartus_sta
如果想要执行check_timing
,就需要退出并进入到对应命令的交互式界面,所以这就要求我们操作前想清楚命令属于哪个模块。
一条条打命令再回车非常麻烦,所以还可以把所有的包的命令放在一个.tcl
文件中,然后用对应的可执行命令执行这个脚本,比如写一个创建工程、指定源码、指定器件、进行编译的xxx.tcl
,然后用quartus_sh -t xxx.tcl
执行这个脚本,就会自动完成一系列操作。
当然如果你的脚本里面有类似于check_timing
这种专属命令的话,就需要用对应的可执行命令来执行脚本。
那么如何知道哪些包可以被对应的可执行命令调用呢?两个办法:
1.手册里有讲
实心圆代表可执行语句默认加载了这个包。比如说,所有的可执行语句即quartus_xxx
都加载了project
这个包,那么就默认可以执行project
下面的所有命令。这意味着,不管用任何可执行命令执行.tcl
脚本,脚本中的project
包下命令都可以被执行。
空心圆代表可执行语句无法加载这个包,比如假如用quartus_sh
这条语句执行sdc
这个包下的语句,就是不行的。
半空半满圆表示,可执行语句默认没有加载这个包,要是想用的话需要自己进行手动加载。在.tcl
脚本内相关命令前面写入 load_package <package name>
或者package require ::quartus::<package name>
之后,就可以使用对应包内的指令了。
需要注意的一点是,表格里的Tcl Console
应该是指quartus_sh
对应的Tcl Console
,其可调用包比单纯的quartus_sh
要多一些,同时也等于GUI界面的Tcl Console
。
2.quartus_sh --qhelp
可以显示所有的可执行命令及包
###跑个示例 找一个编译好的工程,从菜单的project那里生成一个xxx.tcl
文件,然后和verilog源码或者vhdl源码一起复制到一个新的文件夹,当前文件夹打开终端执行quartus_sh -t xxx.tcl
,就会得到与原先一模一样的工程。
接下来我们照葫芦画瓢手动写一个xxx.tcl
试一下。
工程叫test_blif,只有一个verilog源码,顶层模块叫top,top.v
文件放在src/v
下面。
新建一个test_blif.tcl文件,前两行载入包并设置一些参数:
package require ::quartus::project set need_to_close_project 0 set make_assignments 1
然后判断test_blif工程有没有打开,以及当前目录下有没有test_blif工程,没有就新建一个:
# Check that the right project is open if {[is_project_open]} { if {[string compare $quartus(project) "test_blif"]} { puts "Projec test_blif is not open" set make_assignments 0 } } else { # Only open if not already open if {[project_exists test_blif]} { project_open -revision top test_blif } else { project_new -revision top test_blif } set need_to_close_project 1 }
注意上面的-revision
后面的top
,这是revision
的名字,即.qsf
文件的名字,也是在不设置TOP_ENTITY
时默认的顶层模块的名字。
注意:
当文件夹内有同样工程(有qsf文件、qpf文件)的时候,上面的代码在改动.tcl
脚本的make_assignments
以后,所做的改变并不会同步到原有的qsf
文件,quartus
只会添加原来qsf
没有的设置,想要每一次运行脚本后qsf
都全部重写的话需要修改.tcl
前半部分的代码:
package require ::quartus::project package require ::quartus::flow set need_to_close_project 0 set make_assignments 1 # Check that the right project is open if {[is_project_open]} { if {[string compare $quartus(project) "test_blif"]} { puts "Projec test_blif is not open" set make_assignments 0 } } else { # Only open if not already open #if {[project_exists test_blif]} { # project_open -revision top test_blif #} else { project_new -revision top test_blif -overwrite #} set need_to_close_project 1 }
这样每一次tcl的改动在执行后都会导致qsf
的完全重写。
接下来设置器件、型号、读取verilog代码、并把设置写入对应的qsf文件:
# Make assignments if {$make_assignments} { set_global_assignment -name FAMILY "Cyclone V" set_global_assignment -name DEVICE 5CGXFC7C7F23C8 set_global_assignment -name VERILOG_FILE src/v/top.v set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files # Commit assignments export_assignments #execute_flow -compile # Close project if {$need_to_close_project} { project_close } }
这里需要注意:
我没有设置TOP_ENTITY
,所以默认用revision
的名字top
作为顶层文件,这是可以的。
整个tcl
文件只用到了project
一个包的命令,所以执行后只是复制了工程,没有编译。
保存后执行quartus_sh -t test_blif.tcl
,就可以在对应文件夹生成工程。
那想要执行编译怎么办呢?可以先quartus_sh -s
进入交互式界面,执行flow
包的execute_flow -compile
指令;也可以在tcl脚本最前面先声明flow
包:package require ::quartus::flow
,再在关闭工程前面加上一句execute_flow -compile
指令,这样执行脚本的时候会执行编译。
上述就是小编为大家分享的Quartus命令行及脚本使用介绍是怎样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。