Vivado生成网表文件

如何操作?

以之前写的采用有限状态机实现序列检测模块为例,现在写了个两路“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),在其他工程使用该网表后依旧可以保留原模块的结构层次。

猜你喜欢

转载自blog.csdn.net/yundanfengqing_nuc/article/details/115351941