标题:
FPGA开发与学习连载3:Xilinx ISE所涉及的一些命令以及Command Line的使用
[打印本页]
作者:
pengpengpang
时间:
2014-2-25 19:54
标题:
FPGA开发与学习连载3:Xilinx ISE所涉及的一些命令以及Command Line的使用
所有的Commandline都可以在ISE的help->User Manuals里查到,在User Manuals中
XST User Guide -------关于XST的命令单独在这个文档里;
Command line tools user guide ---------ngdbuild、PAR、map、trce、bitgen等其他的都在这里
下面都是转帖:
因为目前进行的一个项目使用了多块容量较大的Xilinx FPGA, 对各块FPGA进行synthesis,map,P&R和generating programming file就成了一个大问题。(惭愧啊,group里没有人有modular design的经验)虽然现在的工作站性能比较强劲,但产生每一个programming file还是要花上好几个小时。所以考虑到在Command Line下面进行所有的编译工作,下面是一点点心得,希望对大家有所帮助。
1.Command的介绍
要完成一次完整的Xilinx FPGA编译过程,涉及到的Command包括了:
XST:
全称为Xilinx Synthesis Technology,这是Xilinx ISE里面附带的一个免费的综合工具。(呵呵,Synplify Pro的购买正在商洽之中)Synthesis完毕后,你可以用任何的文本工具打开后缀名为“.syr”的文件,察看synthesis的具体运行过程及报告。
NGDBuild:
这个命令,其实就是translate啦。这是implementation的第一步。它会把所有的netlist和design constraint合并到一起,生成一个ngd文件供map工具使用。同样的,NGDBuild的报告文件是后缀名为“.bld”的文件。
MAP:
MAP命令是将NGDBuild命令所生成的ngd文件,映射到具体的FPGA器件里面去。MAP将产生一个NCD文件供PAR使用。你可以用任何文本工具打开后缀名为“.mrp”的map报告文件。
PAR:
Place & Route。这个偶就不多说了。免得被砖头砸到。PAR的报告文件后缀名是“.par”。
TRCE:
这个是用来产生偶们最最关心的timing report的。TRCE会分析你的FPGA的设计并且产生一个后缀名为“.twr”的时序报告。你可以用任何文本工具打开它,也可以用xilinx的Timing Analyzer。Timing Analyzer比较直观,推荐新手使用。
Bitgen:
顾名思义,这个Bitgen就是用来generate programming file啦。
2. 使用举例
介绍完Xilinx提供的这些命令后,让我们来看看如何使用它们吧。Xilinx给我们提供了一个很有用的工具:View Command Line Log File。这个工具位于Process for Source窗口的Design Entry Utitlities下面。
双击这个View Command Line Log File,你看到了什么?哈哈,在右边的文本编辑窗口里面出现了类似于下面的语句:
xst -intstyle ise -ifn __projnav/fpga_a.xst -ofn fpga_a.syr
ngdbuild -intstyle ise -dd d:\projects\hardware\hy_multifpga_nwpci_vhd_new_improvetiming/_ngo -uc ./source/hy/fpga_a.ucf -aul -p xc2v6000-ff1152-4 fpga_a.ngc fpga_a.ngd
map -intstyle ise -p xc2v6000-ff1152-4 -cm area -pr b -k 4 -c 100 -tx off -o fpga_a_map.ncd fpga_a.ngd fpga_a.pcf
par -w -intstyle ise -ol high -t 1 fpga_a_map.ncd fpga_a.ncd fpga_a.pcf
trce -intstyle ise -e 1000 -l 1000 -xml fpga_a fpga_a.ncd -o fpga_a.twr fpga_a.pcf
bitgen -intstyle ise -f fpga_a.ut fpga_a.ncd
对了,上面的这些就是你以前曾经使用过的命令啦。其实,我们用ISE作Synthesis,Map,PAR的时候,ISE就会自动调用上面所说的那些command,ISE其实就是一个GUI罢了。:-)
如果双击View Command Line Log File时,出现了下面的错误提示:
Warning: This process is used to display the running command log file that records some application command lines.
这就说明了你还没有implement过你的design,或者你已经清空过了这个design。(在project目录下面,有一个cleanup project files按钮,可以清空)
接下来,就是最后一步啦。你只需要用任何文本编辑器,把上面这段Command的历史纪录Copy&Paste,再存为一个”.Bat”批处理文件,在windows的command line下面执行就可以了。注意需要把这个.bat文件放在你的项目所在目录下。
3. 几点注意
a. 如果要连续跑好几个project,建议先使用Cleanup Project Files.根据偶的经验,如果不进行清空的话,Synthesis和PAR有时会出错。但是这里会出现一个小问题,清空过后,原有的一些文件可能会被删除,比如__projnav目录下面的*.xst(这个时XST的配置文件,做Synthesis的时候,XST会读这个文件以获得相关配置),再比如*.prj(project文件,里面罗列了一些被你的设计所使用的module)以及*.ut文件(ut是Bitgen的配置文件)。这3种文件,在使用Command Line之前最好确认一下是否存在。偶一般会将这3种文件作备份,到时候好拿出来,改一改就用。
b. 在Xilinx的安装目录Xilinx\doc\usenglish\books\docs下,有关于这些command的pdf文件,如果有需要,可以读一读。不过,经过偶苦读一阵之后,偶发现,其实没有太大必要,有问题再说吧。
4. 总结
其实这个话题也比较简单,三言两语也可说清楚,但根据偶过去惨痛的新手经验,偶相信还是比较详细地讲解一些为好。至少可以让新手们多了解一些ISE本身。
[讨论1]
建议综合和布局布线一定要用命令行的方式来跑,包括synplify和ISE对此的支持都很好。
几大好处偶想到的:
1,如果你用的PC工作站,双CPU,那么可以同时跑两个任务。
2,便于归档,进行版本控制,大项目必须要做的工作。 3,便于重现问题,因为命令行可以保证在原始输入(源码、约束)不变的前提下得到只有时间标签不同的bit文件。
4,便于自定义一些非常规的操作,比如自动生成一个插入某些测试引脚的bit文件等等。
除了楼主提到的还建议几点:
1,修改所有目录路径为相对路径,这样同样一个目录复制到别处也不用改命令行。
2,可以直接用ultraedit打开工程目录下的*.cmd_log文件。
3,那些删除临时目录或者复制网表文件之类的动作可以一起加到命令行中执行。总之,修改代码后,直接运行一个命令行全部搞定!
[讨论2]
建议太棒了!小弟获益匪浅。
偶想再请教几个问题:
1。“便于归档,进行版本控制,大项目必须要做的工作。”
目前我是用ISE的Archive进行版本备份,Archive自动生成一个zip文件,然后备份岛服务器。不知道丁丁所说得用command line进行归档是怎么回事,可否讲解几句?
2。“便于重现问题,因为命令行可以保证在原始输入(源码、约束)不变的前提下得到只有时间标签不同的bit文件”
“时间标签”是指什么?我不明白这个术语。如果源代码和约束保持不变的话,唯一可调节的就是map和PAR的effort了。重现问题是指保存以前的bit文件以备将来使用?
3。“自动生成一个插入某些测试引脚的bit文件等等”
丁丁可否介绍一下这个”插入测试引脚“?
4。“那么可以同时跑两个任务”
我觉得CPU倒不是瓶颈,关键是内存到时恐怕不够用。而且win2000 pro好像最多也就支持2G的内存吧。
我们还有另外一台工作站,使用了4个AMD Appro 64-bit processor。但好像兼容性不太好,PAR的时候老是出错。不知道升级到6.2能不能解决这个问题。
但看另外几个贴子说6.2有几个比较严重的bug,请问丁丁使用过6。2没有?值得升级吗?
多谢!
[讨论1]
1,Achieve可以进行版本管理,但是文件太大。一般来说,作版本控制最好是保存所有原始输入,如果做FPGA,原始输入包括HDL代码,综合工程.prj或者脚本.tcl,综合约束.sdc,实现约束.ucf,所有core的网表.edn,实现的脚本.bat,再有就是注意综合工具的版本和实现工具的版本。
如果所有这些都没有变化,那么可以保证再运行一遍得到完全一样的结果。这也是版本控制的一个关键吧,只要保证可重复性,那么那些结果除了bit你要用到其他也可都不保存。
2,时间标签就是time stamp,在网表文件和bit文件头都有,表示这个文件的生成时间记录,这个不会影响到内部的功能。
3,在插入测试引脚这里,可以利用FPGA Editor来操作,直接编辑.ncd文件,再进行bitgen就可以了,那么如果你需要插入很多测试引脚,利用脚本(好像是.scr)可以帮你自动完成,然后只进行bitgen就可以了,避免重新布局布线浪费时间,避免重新布局布线影响timing。当然FPGA Editor还可以做很多修改了,就不多说了。
4,给一个以前的脚本例子:
综合和实现的命令行:
synplify_pro -batch ../script/chip_syn.tcl
ngdbuild -dd ./_ngo -uc ../script/chip_par.ucf -p xc2s200-fg456-5 .\rev_1\chip.edf chip.ngd
map -p xc2s200-fg456-5 -timing -cm speed -detail -ir -pr b -o chip_map.ncd chip.ngd chip.pcf
par -w -ol med chip_map.ncd chip.ncd chip.pcf
bitgen -w -f ../script/chip_par.ut chip.ncd
copy chip.bit ..\bit\
里面这个chip_par.ut保存了bitgen命令的选项,也可以不用这个文件,都加在命令行里。
后面是chip_syn.tcl:
project -new
#add_file options
add_file -constraint "../script/chip_syn.sdc"
add_file -verilog "../src/src1.v"
add_file -verilog "../src/src2.v"
add_file -verilog "../src/src3.v"
add_file -verilog "../src/src4.v"
add_file -verilog "../src/src5.v"
add_file -verilog "../src/src6.v"
add_file -verilog "../src/src7.v"
add_file -verilog "../src/src8.v"
#device options
set_option -technology SPARTAN2
set_option -part XC2S200
set_option -package FG456
set_option -speed_grade -5
#compilation/mapping options
set_option -default_enum_encoding default
set_option -symbolic_fsm_compiler 0
set_option -resource_sharing 0
set_option -use_fsm_explorer 0
#map options
set_option -frequency 50.000
set_option -fanout_limit 100
set_option -disable_io_insertion 0
set_option -pipe 0
set_option -fixgatedclocks 0
set_option -retiming 0
set_option -modular 0
set_option -update_models_cp 0
set_option -verification_mode 0
#simulation options
set_option -write_verilog 0
set_option -write_vhdl 0
#automatic place and route (vendor) options
set_option -write_apr_constraint 0
#set result format/file last
project -result_file "rev_1/chip.edf"
#implementation attributes
set_option -vlog_std v2001
project -run
只是个人的一点建议,版本控制只要做了就可以,保存archive也要知道这个东东怎么来的,下次可以保证还作出来同样的东东。保存命令行也要知道所有的软件版本等。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0