如何操作?
以之前写的采用有限状态机实现序列检测模块为例,现在写了个两路“101”序列检测器模块(就是把原来的例化两个),该模块的结构如下:
module fsm_test_top(
//系统IO
input clk,
input rst,
//两路序列输入
input din_0,
input din_1,
//两路序列检测结果输出
output dout_0,
output dout_1
);
fsm_test U_0(
.clk (clk),
.rst (rst),
.din (din_0),
.dout (dout_0)
);
fsm_test U_1(
.clk (clk),
.rst (rst),
.din (din_1),
.dout (dout_1)
);
endmodule
然后要求需要把“fsm_test_top”这个模块生成网表文件,步骤如下
- 将模块设为顶层
将fsm_test_top设为顶层
- 找到综合设置(Synthesis Settings)
Synthesis Settings
- 修改Options选项
修改Synthesis Options
其中需要注意的是,Options中将-flatten_hierarchy设为full,意思是模块综合后的层次结构全部为平级,只剩下顶层,这样产生的网表文件就不易被查看到层级关系了,可详见UG901的第11页[2]
UG901的第11页 -flatten_hierarchy选项
此外,More Options选项设置为-mode out_of_context,原因是因为Vivado在综合的时候会自动将顶层的IO口自动插入buffer,而现在需要生成网表的模块往往不是顶层,生成的文件是需要被其他模块例化的,所以不能含有IO buffer,设为-mode out_of_context即表示不插入IO buffers,注意mode前面有个"-",具体可详见UG901的第26页[2]
UG901的第26页 More Options注意事项
- 对模块综合(Synthesis)
Run Synthesis
- Open Synthesized Design
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
生成只有IO接口信息的.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
生成edf文件
- 获得网表文件
到设置的目录下找到生成的网表文件,一个.v文件和一个.edf文件
可以打开看看里面是个啥
首先fsm_test_top.v里面是只有包含IO接口信息,其他什么内容都没有
fsm_test_top.v
然后打开fsm_test_top.edf可以看到,产生的内容为使用了LUT、FDCE情况和一些连接信息,没有RTL源码
fsm_test_top.edf
怎么使用?
- 将生成的两个文件导入到目标工程中
- 直接例化就可以使用
例如笔者想在模块edf_test.v中使用这个导入的网表文件,那么直接在模块里对其例化就可以使用了,如图
例化使用网表
例化后结构
- 查看综合后的情况
对U_0展开
通过对例化了网表文件的模块,并查看RTL综合后的原理图中可以发现,与原来模块fsm_test_top的结构一致。
如果综合结构层次不选择flatten(根据评论区补充)
即在Synthesis Settings中的-flatten_hierarchy不选择flatten,而保持默认的none,那么在其他所有操作不变的情况下,在其他工程实例化该网表文件,并且对其进行综合,可以得到以下综合后的结果
其他工程调用网表文件综合的结果
其他工程调用网表文件综合的结果(展开)
可以发现如果不将模块的层次打平(flatten),在其他工程使用该网表后依旧可以保留原模块的结构层次。