在Vivado定制IP的時候,或者在IP Catalog中雙擊一個IP,不論該IP是我們自己添加到工程的自定義IP,還是Vivado自己帶的IP,選擇"Customize IP"后都會彈出如下圖所示的框框。可以看到一種叫做”Global”,一種叫”Out of Context (OOC)”。

Global 即全局
如果選擇的是全局綜合選項,那IP生成的文件將會和其他的用戶文件一起進行綜合,這也就意味着,每一次用戶文件被修改后,源碼級IP都會跟着一起綜合一遍。
Out-Of-Context (OOC) 即脫離上下文
OOC選項是Vivado給我們的默認選項,在OOC模式下,Vivado將會把生成的IP當成一個單獨的模塊來進行綜合,生成.dcp (design checkpoint)文件,工程要用到IP的時候,只需從.dcp文件中解析出對應IP的網表文件即可,而不需對IP進行重新綜合,這樣的方式可以加快綜合的速度;而Gobal選擇則是每次工程綜合的時候,IP核都會和工程一起綜合,綜合時間很長,也不會產生.dcp文件。OOC同時會使用一個只在OOC模式下有用的約束文件“_ooc.xdc”。 除了生成.dcp文件,OOC還會生成一個以”stub.v”結尾的HDL文件,是當前IP設計的一個黑盒文件,只有輸入輸出端口,工程調用這個的時候實際上是在解析.dcp中的網表文件,進而繼續綜合和布局布線。
OOC的優勢
通過綜合實現某個模塊的快速迭代,不用綜合系統的其余部分,整個設計的迭代更快了;
利於系統其余部分的快速迭代,如果某部分確定穩定不變了,可以對這個模塊進行OOC綜合操作,保留這個綜合版本,這樣就可以方便迭代其余部分;
OOC將會產生”_sim_netlist.v” 或者 “_sim_netlist.vhdl”仿真文件,如果我們在使用只支持某種語言的仿真器,而IP不提供該語言的RTL文件,我們就可以直接用這些仿真文件進行IP仿真。
關於高阻態和OOC(out of context)綜合方式
如果設計中存在三態(高阻態),OOC綜合操作就會受到影響,FPGA僅支持I/O輸出端口的高阻態,在器件內部是不允許的,如果你使用OOC綜合方式,Vivado工具並不知道某個具體的信號是連接I/O輸出還是在器件內部進行連接,最后,綜合工具會將這個高阻信號轉換為某個邏輯值,而不是最為高阻態進行綜合。
舉個例子,下面的代碼就會帶來不好的影響:
assign my_signal = enable?din1:1’bz;
通過OOC方式綜合后,my_signal信號值就不會是高阻值Z了, Vivado會選擇不保留三態。如果my_signal信號只連接到外部輸出I/O呢?即能夠使用OOC方式對這部分模塊進行綜合,同時保留三態。
滿足上述需求的方式就是在RTL中實例化一個三態緩存(buffer)。
OBUF u1(.l(din1), .T(n_enable), .O(my_signal));
參考:
http://www.sohu.com/a/129575422_292853 關於高阻態和OOC(out of context)綜合方式
