
Vivado生成网表文件是怎么回事呢?Vivado相信大家都很熟悉,但是Vivado生成网表文件是怎么回事呢,下面就让小编带大家一起了解吧。
Vivado生成网表文件,其实就是让写的RTL源码不被看见,大家可能会很惊讶Vivado怎么会生成网表文件呢?但事实就是这样,小编也感到非常惊讶。
这就是关于Vivado生成网表文件的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦![1]

营销号生成器真有意思,不过话说回来,Vivado生成网表文件是怎么回事呢?回答之前先设想以下几个场景:
⭐场景一:多人同时在做一个FPGA项目,如果一个老哥写的模块包含30个RAM、80个FIFO,还位宽深度都不一样,同时还例化了200个子模块,而你作为集成项目的人,该怎么办?
⭐场景二:你和老哥两个人写的模块需要联合调试,然后调试有问题,那个老哥不管三七二十一,先把你的代码改一通,最后崩了,你该怎么办?
⭐场景三:给甲方写了个模块,钱没到位,但是拿着你的源码跑路了,你又该怎么办?
那是不是说如果可以把写的模块封装成一个文件,但是并没有源码且不能修改,直接例化就可以使用,就解决了上述的几个问题?那么网表文件就是在做这样一件事情。
如何操作?
以之前写的采用有限状态机实现序列检测模块为例,现在写了个两路“101”序列检测器模块(就是把原来的例化两个),该模块的结构如下:
module
然后要求需要把“fsm_test_top”这个模块生成网表文件,步骤如下
- 将模块设为顶层

- 找到综合设置(Synthesis Settings)

- 修改Options选项

其中需要注意的是,Options中将-flatten_hierarchy设为full,意思是模块综合后的层次结构全部为平级,只剩下顶层,这样产生的网表文件就不易被查看到层级关系了,可详见UG901的第11页[2]

此外,More Options选项设置为-mode out_of_context,原因是因为Vivado在综合的时候会自动将顶层的IO口自动插入buffer,而现在需要生成网表的模块往往不是顶层,生成的文件是需要被其他模块例化的,所以不能含有IO buffer,设为-mode out_of_context即表示不插入IO buffers,注意mode前面有个"-",具体可详见UG901的第26页[2]

- 对模块综合(Synthesis)

- Open Synthesized Design


- 生成网表文件
生成网表文件前需要先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

然后再生成网表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

- 获得网表文件
到设置的目录下找到生成的网表文件,一个.v文件和一个.edf文件

可以打开看看里面是个啥
首先fsm_test_top.v里面是只有包含IO接口信息,其他什么内容都没有

然后打开fsm_test_top.edf可以看到,产生的内容为使用了LUT、FDCE情况和一些连接信息,没有RTL源码

怎么使用?
- 将生成的两个文件导入到目标工程中


- 直接例化就可以使用
例如笔者想在模块edf_test.v中使用这个导入的网表文件,那么直接在模块里对其例化就可以使用了,如图


- 查看综合后的情况


通过对例化了网表文件的模块,并查看RTL综合后的原理图中可以发现,与原来模块fsm_test_top的结构一致。
如果综合结构层次不选择flatten(根据评论区补充)
即在Synthesis Settings中的-flatten_hierarchy不选择flatten,而保持默认的none,那么在其他所有操作不变的情况下,在其他工程实例化该网表文件,并且对其进行综合,可以得到以下综合后的结果


可以发现如果不将模块的层次打平(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