![48e1819e2166fbc00dd1db6092fb434f.png](https://i-blog.csdnimg.cn/blog_migrate/182ba2fe51c991386105f530c5410693.jpeg)
Vivado生成网表文件是怎么回事呢?Vivado相信大家都很熟悉,但是Vivado生成网表文件是怎么回事呢,下面就让小编带大家一起了解吧。
Vivado生成网表文件,其实就是让写的RTL源码不被看见,大家可能会很惊讶Vivado怎么会生成网表文件呢?但事实就是这样,小编也感到非常惊讶。
这就是关于Vivado生成网表文件的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦![1]
![28331087d79a94aa0d66e7ed695a2e0d.png](https://i-blog.csdnimg.cn/blog_migrate/d43399133f325a369cb804ec9249b83f.png)
营销号生成器真有意思,不过话说回来,Vivado生成网表文件是怎么回事呢?回答之前先设想以下几个场景:
⭐场景一:多人同时在做一个FPGA项目,如果一个老哥写的模块包含30个RAM、80个FIFO,还位宽深度都不一样,同时还例化了200个子模块,而你作为集成项目的人,该怎么办?
⭐场景二:你和老哥两个人写的模块需要联合调试,然后调试有问题,那个老哥不管三七二十一,先把你的代码改一通,最后崩了,你该怎么办?
⭐场景三:给甲方写了个模块,钱没到位,但是拿着你的源码跑路了,你又该怎么办?
那是不是说如果可以把写的模块封装成一个文件,但是并没有源码且不能修改,直接例化就可以使用,就解决了上述的几个问题?那么网表文件就是在做这样一件事情。
如何操作?
以之前写的采用有限状态机实现序列检测模块为例,现在写了个两路“101”序列检测器模块(就是把原来的例化两个),该模块的结构如下:
module
然后要求需要把“fsm_test_top”这个模块生成网表文件,步骤如下
- 将模块设为顶层
![25e3a3bfcf267c9dee76976ffa2752dd.png](https://i-blog.csdnimg.cn/blog_migrate/5bd4f88e1e2e623eb9f312224674ff7f.jpeg)
- 找到综合设置(Synthesis Settings)
![8e46aa9275adecbd5b39e9d8295602ca.png](https://i-blog.csdnimg.cn/blog_migrate/19810997dac2fa9aa2417920bcf11e1d.jpeg)
- 修改Options选项
![ee4f6f86da2274570dd6ad185b2fdf63.png](https://i-blog.csdnimg.cn/blog_migrate/07240ef878bfcbee76e9229cde22ca25.jpeg)
其中需要注意的是,Options中将-flatten_hierarchy设为full,意思是模块综合后的层次结构全部为平级,只剩下顶层,这样产生的网表文件就不易被查看到层级关系了,可详见UG901的第11页[2]
![5183faea7c463acec9f77647af35bda6.png](https://i-blog.csdnimg.cn/blog_migrate/7a733ca4f40893ee44406ef30e142c14.jpeg)
此外,More Options选项设置为-mode out_of_context,原因是因为Vivado在综合的时候会自动将顶层的IO口自动插入buffer,而现在需要生成网表的模块往往不是顶层,生成的文件是需要被其他模块例化的,所以不能含有IO buffer,设为-mode out_of_context即表示不插入IO buffers,注意mode前面有个"-",具体可详见UG901的第26页[2]
![59b3d2ba1c8e0fb3dd40f6a521d2f007.png](https://i-blog.csdnimg.cn/blog_migrate/91859a022717ff9d109e1382c3b9c4fa.jpeg)
- 对模块综合(Synthesis)
![3b494e3bdb99545e388e49b4030ade50.png](https://i-blog.csdnimg.cn/blog_migrate/462b6b6ecba9ab9afaeba5384ac61108.jpeg)
- Open Synthesized Design
![ac49e9377a64fc8b56954eae6c6343c3.png](https://i-blog.csdnimg.cn/blog_migrate/a84d020d7fcf4eb3c81ac642f64d7f31.png)
![8f545ece17e0cb3cac449346b2882db6.png](https://i-blog.csdnimg.cn/blog_migrate/62770c3798d2d0c79ae5a66be4f988a4.jpeg)
- 生成网表文件
生成网表文件前需要先Open Synthesized Design,然后在Tcl Console中输入[3]
//vivado 2017.4及以前
write_verilog -mode port <design_name>.v
//vivado 2018.1及以后
write_verilog -mode synth_stub <design_name>.v
//例如本次,文件名前面不加地址则默认保存在C:/Users/<user>/AppData/Roaming/Xilinx/Vivado/下
write_verilog -mode synth_stub D:/fsm_test_top.v
![ca25bdf959c7439e289795108298590d.png](https://i-blog.csdnimg.cn/blog_migrate/e5d9b4a031e6f821ddf4a35f1fa3b93c.png)
然后再生成网表edf文件,同样在Tcl Console中输入[3]:
//模块不包含Xilinx的IP
write_edif <design_name>.edf
//模块包含Xilinx的IP
write_edif -security_mode all <design_name>.edf
//本次模块中没有使用Xilinx的IP
write_edif D:/fsm_test_top.edf
![9227d6cc0342e2eec832e6bbaefb088c.png](https://i-blog.csdnimg.cn/blog_migrate/43e51b8fe70022e95c4580073ac265c4.png)
- 获得网表文件
到设置的目录下找到生成的网表文件,一个.v文件和一个.edf文件
![2a8ac5db55f4438fd622f7b15cfde33f.png](https://i-blog.csdnimg.cn/blog_migrate/6f3b1b14fa1dc119debe0b6e04b45913.jpeg)
可以打开看看里面是个啥
首先fsm_test_top.v里面是只有包含IO接口信息,其他什么内容都没有
![1da2a6b262a38a6a34cb74db5d92d97d.png](https://i-blog.csdnimg.cn/blog_migrate/213112994ebb50adb4fc3bec9182702b.jpeg)
然后打开fsm_test_top.edf可以看到,产生的内容为使用了LUT、FDCE情况和一些连接信息,没有RTL源码
![9399c71c66f2e89d7f901a4750243b61.png](https://i-blog.csdnimg.cn/blog_migrate/92dc289afbd7f6b29ca88d3011799180.jpeg)
怎么使用?
- 将生成的两个文件导入到目标工程中
![2eff533569c1521bba543990f9bd6af5.png](https://i-blog.csdnimg.cn/blog_migrate/9f06163a81e7dfcb1623cf2cb12a18c7.jpeg)
![cb42e1b407d52c9a81cdbddc79eac1e4.png](https://i-blog.csdnimg.cn/blog_migrate/c898d1a7355b4b9bf9b3efe94627b6b5.jpeg)
- 直接例化就可以使用
例如笔者想在模块edf_test.v中使用这个导入的网表文件,那么直接在模块里对其例化就可以使用了,如图
![06af7b71755db7558657e7d981bc8bc9.png](https://i-blog.csdnimg.cn/blog_migrate/a18a5fa24ebecaa27af20e8a182b7dcb.png)
![f6b342542c6d34363c3bff91c721e4ef.png](https://i-blog.csdnimg.cn/blog_migrate/fd181a418efd354bbdd72fb08cf16ab5.png)
- 查看综合后的情况
![6eda9aa9124b2a6b40fa24f6cefb3fe0.png](https://i-blog.csdnimg.cn/blog_migrate/6ba301d80cf5341ded73f28771b809d9.jpeg)
![9d5050a7939d28954fb437b8cce611cc.png](https://i-blog.csdnimg.cn/blog_migrate/37f97708179cc90d11acfe9982c896c7.jpeg)
通过对例化了网表文件的模块,并查看RTL综合后的原理图中可以发现,与原来模块fsm_test_top的结构一致。
如果综合结构层次不选择flatten(根据评论区补充)
即在Synthesis Settings中的-flatten_hierarchy不选择flatten,而保持默认的none,那么在其他所有操作不变的情况下,在其他工程实例化该网表文件,并且对其进行综合,可以得到以下综合后的结果
![e0b80d9761a6e153bb2a39fbad09da59.png](https://i-blog.csdnimg.cn/blog_migrate/7be9c4f96fa5778cc7eb9ccd569f98d9.jpeg)
![5cdd48343856293d8e546f577b07665a.png](https://i-blog.csdnimg.cn/blog_migrate/5156f19a562e0cdd5c0bce29ba256a66.jpeg)
可以发现如果不将模块的层次打平(flatten),在其他工程使用该网表后依旧可以保留原模块的结构层次。
总结
当然,笔者只是测试了一个很小很小的模块,如果对于较大的模块,结构会更加复杂,这样一来,使用网表文件的话,就可以对刚开始提到的三个场景的问题进行很好的解决。
大致操作就如上所述的了,之后想到再做补充,如有不足,望批评指正~
参考
- ^营销号生成器 http://kaseidis.gitee.io/interesting_gadgets/marketing_generator/index.htm
- ^abXilinx文档UG901 http://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_3/ug901-vivado-synthesis.pdf
- ^ab使用Vivado将包含Xilinx IP的用户模块封装成网表文件 https://blog.csdn.net/weixin_44384867/article/details/86591338