xilinx的vivado ip生成时候globe和out ofcontex per ip选项区别

在使用xilinx的vivado生成ip时候,有一个globe和out ofcontex per ip的选项,如下图:

xilinx的vivado ip生成时候globe和out ofcontex per ip选项区别

那么,选择哪一个呢?

1: globe ---IP生成的文件将会和其他的用户文件一起进行综合

2:out of context per ip--脱离上下文的模式,仅需要综合一次,且生成.dcp (design checkpoint)文件,工程要用到IP的时候,只需从.dcp文件中解析出对应IP的网表文件即可,而不需对IP进行重新综合,这样的方式可以加快综合的速度;而Gobal选择则是每次工程综合的时候,IP核都会和工程一起综合,综合时间很长,也不会产生.dcp文件。OOC同时会使用一个只在OOC模式下有用的约束文件“_ooc.xdc”。 除了生成.dcp文件,OOC还会生成一个以”stub.v”结尾的HDL文件,是当前IP设计的一个黑盒文件,只有输入输出端口,工程调用这个的时候实际上是在解析.dcp中的网表文件,进而继续综合和布局布线。

 

然而如果设计中存在三态(高阻态),OOC综合操作就会受到影响

FPGA仅支持I/O输出端口的高阻态,在器件内部是不允许的

如果你使用OOC综合方式,Vivado工具并不知道某个具体的信号是连接I/O输出还是在器件内部进行连接

最后,综合工具会将这个高阻信号转换为某个逻辑值,而不是最为高阻态进行综合

举个例子,下面的代码就会带来不好的影响:

assign my_signal = enable?din1:1’bz;

通过OOC方式综合后,my_signal信号值就不会是高阻值Z了

Vivado综合有两个选择:

1. 综合操作完全符合HDL代码

(当这个模块单元与其余部分有连接时,如果这个信号会最为I/O输出,那么就不会有什么影响)

2. 不保留三态

Vivado工具会选择第2项,原因是有可能出现任何问题之前最好让用户知道

这种OOC使用模式比较受到IP开发者的欢迎,但是如果IP集成到大型系统中出现问题就比较麻烦了,因此应该避免第1项

这同时也会给我们带来如下问题:

如果my_signal信号只连接到外部输出I/O呢?

举个例子,所有可用的情况下my_signal都连接到I/O接口,我想让它驱动一个三态

我也希望能够使用OOC方式对这部分模块进行综合——同时保留三态

满足上述需求的方式就是在RTL中实例化一个三态缓存(buffer)

具体如下所示:

OBUF u1(.l(din1), .T(n_enable), .O(my_signal));

这样就能够保证即使采用OOC综合方式,my_signal也会保持三态值

同时,如果该模块与其他部分有连接,那么这个连接也是不可用的(例如my_signal信号与“内部”模块有连接),综合过程会报错。

参考:http://www.sohu.com/a/129575422_292853