https://zhuanlan.zhihu.com/p/44073693
FPGA开发中,用的最多的应该是HDL语言,及Verilog HDL,SystemVerilog和VHDL。不过由于FPGA的开发离不开EDA工具,常常会需要一些脚本语言的配合。所以掌握一门脚本语言对实际工作也是有帮助的。
个人用过的脚本语言主要有Perl、Tcl和Python。结合本人过去多年的FPGA开发经历总结了一下,脚本语言在FPGA开发中大概有三个作用:
1. 为了更好地使用EDA工具
最能体现这一作用的编程/脚本语言是Tcl。几乎大部分EDA工具内置的控制Console都是Tcl Console;Mentor ModelSim的do文件本质就是Tcl语言的扩展;SDC和Xilinx基于SDC的扩展XDC也是基于Tcl语言;ISE提供xtclsh,Vivado所有GUI操作都对应具体的Tcl命令;Quartus的qsf文件也是基于Tcl。所以,可以说FPGA开发中几乎不可能完全不涉及Tcl。而Tcl在其中的主要作用,也是为了更好地扩展EDA工具的功能或更好的发挥EDA工具的作用。比如提供可扩展的shell交互平台、统一管理配置参数等。掌握Tcl可以算是熟练使用EDA工具的必要(非充分)条件之一。
ISE提供Perl的解释器xilperl,基于5.8版本。Vivado似乎没有支持Perl。从目前看,FPGA开发领域的工具,对Perl的支持,似乎没有Tcl广泛。不过听闻隔壁ASIC开发领域中Perl还是很流行的。
Python语言在FPGA这个领域的EDA工具中还并不流行,听说过部分工具支持Python,但是似乎没有普及开。本人也没有用过支持Python的EDA工具。
2. 日常的辅助工具
在做FPGA开发的时候,有时候需要一些辅助的功能。当没有现成的工具,就会考虑用脚本语言快速写一个。这些功能可大可小。大到对数G文本报告进行遍历并提取需要的数据进行进一步处理(其实这也并不算大),或者对FPGA设计工程做一定程度的代码分析。小到日常的加减乘除当作一个计算器,或者自动生成一些测试数据。
这样的辅助功能更像是小规模软件开发。由于预期结果仅仅是个随手的小工具,并不需要复杂的测试和长期的维护,所以快速高效的开发更重要。从实际功能看,三种语言都能很好的完成任务。不过当辅助的需求越来越复杂的时候,有着优秀库资源的Python会逐渐体现出优势,而另外两种语言的劣势,相应地会越来越明显。Tcl的劣势在于扩展库不多而且过于陈旧,提高了学习/使用成本;同时内置数据结构过于简单。Perl的劣势在于,一来库的稳定性没有很好的保证,二来Perl更适合文本处理,其它方面没有非常明显的优势,三来Python足够优秀,削弱了Perl的优势。
这里要单独提一句,有一门独立于编程语言但是又依附于编程语言的的编程语言(这一句绕口令还请多练习几遍),叫正则表达式。非常推荐研究一下。三个脚本语言都支持正则表达式,其中以Perl支持的最为紧密。Python的正则表达式兼容Perl的标准(PCRE,Perl Compatible Regular Expressions)。而Tcl使用另一套标准。实际使用结果看,个人觉得Python的正则表达式库re更为易用(这一结论考虑了Python整体的易用性,并选择性地忽略了Perl书写正则表达式代码更简洁的事实,所以这一结论仅代表个人意见)。正则表达式在文本处理方面具有非常强大的功能,代价是又要学一套语言的语法,而且并不是很容易学。
另外两种也许不多见的场景是:
1.如果不熟悉Linux shell,由于大部分Linux版本都自带了这三种脚本语言,可以借用脚本来实现一些基础功能。这种情况对于不熟悉Linux的童鞋临时救个急,也许有帮助。
2.有跨平台的需求。有些小工具要同时兼容Windows和Linux环境。三种脚本语言的跨平台性都很好,所以可以考虑使用脚本语言。
3. 算法辅助工具
算法辅助这一需求,已经有些超过脚本语言的基本工作了。这方面最出名的工具应该是功能异常强大的Matlab(当然Matlab的功能远不限于算法辅助)。最近几年Python的快速发展,导致Python在很多领域足够取代Matlab的工作。不过也不要轻视Matlab的功能。配合多年积累的各种库,目前Matlab很多高级的功能Python还无法涉及。不过Matlab最大的劣势在于——太贵。
下面介绍几个个人在工作中使用到脚本语言的例子,便于更好的理解脚本语言的作用。
3.1 工程版本文件的自动更新
工程设计里面,一般有个版本号信息,用来识别当前使用的是哪个版本。这个版本号可以做成自动生成的。原理就是在工程开始综合的时候可以自动运行一个Tcl文件,读取当前的系统时间,然后将读取的数值写入一个文件中,作为版本参数传递给工程。如果精确到秒的话,并加上计算机名/用户名这样的信息,可以保证版本号的唯一,也免去每次需要手动修改版本号的麻烦。
image
3.2VIO的自动化操作
Xilinx的JTAG调试工具,有一个IP叫VIO。通过VIO可以从计算机往FPGA中传递一些信号。默认只能使用GUI界面,需要点击图形按键等。当需要传递的信号/数据过多时,鼠标点击就显得非常麻烦了。所以可以将相关操作写在脚本中,便于修改/反复调用,比反复点击界面上图形按键要好用的多。
3.3 bit文件的处理
FPGA开发工具一般都提供了对配置镜像的文件格式转换功能,不过大部分是需要使用EDA工具转换的。而启动EDA工具,在一些条件下,就可能是比较麻烦的问题(比如启动速度过慢、license数目不够等)。如果对数据格式比较清楚,可以设计一个脚本进行格式转换。比如Xilinx的bit文件,转为SVF文件,Impact工具和Vivado工具使用起来都稍微麻烦。本人用Tcl写了一个脚本,相比使用EDA工具的官方做法,要方便灵活的多。
3.4 例化模板的生成
ISE有一个功能,就是对任意的HDL文件中的module,可以生成例化模板。
image
这个功能在Vivado取消了,可以在 Xilinx Tcl Store 里面找到(https://www.xilinx.com/support/answers/58023.html)。
image
3. 5算法模拟
前段时间设计一个计算模块,选取了几种方案进行分析。
利用Python进行算法模拟,可以方便快速地验证算法的具体实现方法。然后直接改为模拟二进制实现方式,并利用软件脚本的灵活便捷,进行测试数据的遍历测试和误差分析。最终确定实现方案后,由于整个实现方案都已经模拟二进制化,所以很容易翻译成Verilog。
具体做法:
a)先直接用脚本实现基础运算步骤,用几个测试数据来观察计算结果。实现基本运算的时候就把运算拆解为诸多基础运算单元,可以分析出是否有硬件实现相对困难的单元(比如除法,求log),是否需要迭代等;如此,便于快速熟悉各个方案,并对比出各自方案的优缺点。
b)选择合适的算法进行模拟二进制实现,来模拟硬件实现的过程,并计算结果,进行误差分析。
c)生成相关的测试数据用来给FPGA设计做验证(仿真或者上板验证);
上述例子中:
1、2属于更好地使用EDA工具。这种需求,由于需要配合EDA工具,所以必须使用EDA工具支持的脚本语言,所以Tcl是相对常用的;专栏文章中有几篇就是这个方面的应用:XTWL TPCL:Vivado功能完善:如何用Tcl/VIO更新BRAM中的数据
3、4属于开发日常辅助工具。这样的需求可以任意选择语言,使用自己最熟悉的语言可能是个不错的选择;
5属于算法辅助,具体用什么语言并没有严格要求;这个用途最常用的是Matlab,对于部分行业Matlab甚至有了非常详细的开发库,可以直接使用;
对比三种语言,本人自不量力,粗浅地总结了一下各自的优劣(这里只针对前文提到的在FPGA开发领域中脚本语言的三个作用,而且限于本人的一点经验,不能保证正确、全面、客观):
对于Tcl,最大的优势在于EDA工具支持的程度最好。所以当需要结合EDA工具做一些开发的时候,可能Tcl是唯一的选择。
劣势在于:1)库很少,而且相对旧,除了EDA工具,生态环境并不好;2)数据结构过于简单,复杂系统开发并不方便。
对于Python,最大的优势在于丰富、成熟的库。并且提供了大量便于使用的数据结构,以便应对各种开发需求。
劣势在于:1)EDA工具支持不好;2)分2.7和3.x两个不兼容的版本,略微提高了新手入门难度;
对于Perl,优势之一是丰富的库(CPAN),同时带来的问题是库的质量难以保证;其次是深度集成正则表达式,非常适合文本处理,同时带来的问题是对文本之外的开发并没有太多的优势。尤其是Python的正则表达式可以说已经充分支持PCRE,也足够好用。所以相比Python,并没有太大的优势。所以虽然最早学习的是Perl,但本人近几年已经全面转为Python了(部分原因也是公司环境需要熟悉Python)。关于Python的使用,可以参考之前写过的回答。
你都用 Python 来做什么?www.zhihu.com
图标
三种脚本语言博大精深,都有20余年的发展历程。而本人并非软件开发出身,对这三种语言的理解也很肤浅,只是在多年的FPGA开发过程中略有涉及。在这里抛砖引玉,浅浅地聊一聊自己的经历和一点看法。如果有朋友做过其它应用、有过其它想法,欢迎分享。









网友评论