關(guān)于高阻態(tài)和OOC(out of context)綜合方式
Xilinx Vivado工具支持僅將系統(tǒng)設(shè)計的一部分進(jìn)行綜合,即OOC(out of context)綜合方式。OOC綜合方式的流程就是將設(shè)計的某個模塊單獨完成綜合操作,這會帶來如下可能性:
本文引用地址:http://www.ex-cimer.com/article/201710/365492.htm通過綜合實現(xiàn)這個模塊的快速迭代,不用綜合系統(tǒng)的其余部分整個設(shè)計的迭代也更快了
利于系統(tǒng)其余部分的快速迭代,如果某部分確定穩(wěn)定不變了,可以對這個模塊進(jìn)行OOC綜合操作,保留這個綜合版本,這樣就可以方便迭代其余部分
某個模塊的改變只需要再對此模塊進(jìn)行綜合即可,節(jié)省的時間用于模塊功能設(shè)計
OOC綜合方式非常適合IP核的設(shè)計,我們可以將自己的IP核采用OOC方式進(jìn)行綜合然后使用綜合后的輸出結(jié)果
這意味著當(dāng)我們使用IP核時我們不需要在進(jìn)行IP核的綜合操作,就可以完善系統(tǒng)設(shè)計
然而如果設(shè)計中存在三態(tài)(高阻態(tài)),OOC綜合操作就會受到影響
FPGA僅支持I/O輸出端口的高阻態(tài),在器件內(nèi)部是不允許的
如果你使用OOC綜合方式,Vivado工具并不知道某個具體的信號是連接I/O輸出還是在器件內(nèi)部進(jìn)行連接
最后,綜合工具會將這個高阻信號轉(zhuǎn)換為某個邏輯值,而不是最為高阻態(tài)進(jìn)行綜合
舉個例子,下面的代碼就會帶來不好的影響:
assign my_signal = enable?din1:1’bz;
通過OOC方式綜合后,my_signal信號值就不會是高阻值Z了
Vivado綜合有兩個選擇:
1. 綜合操作完全符合HDL代碼
(當(dāng)這個模塊單元與其余部分有連接時,如果這個信號會最為I/O輸出,那么就不會有什么影響)
2. 不保留三態(tài)
Vivado工具會選擇第2項,原因是有可能出現(xiàn)任何問題之前最好讓用戶知道
這種OOC使用模式比較受到IP開發(fā)者的歡迎,但是如果IP集成到大型系統(tǒng)中出現(xiàn)問題就比較麻煩了,因此應(yīng)該避免第1項
這同時也會給我們帶來如下問題:
如果my_signal信號只連接到外部輸出I/O呢?
舉個例子,所有可用的情況下my_signal都連接到I/O接口,我想讓它驅(qū)動一個三態(tài)
我也希望能夠使用OOC方式對這部分模塊進(jìn)行綜合——同時保留三態(tài)
滿足上述需求的方式就是在RTL中實例化一個三態(tài)緩存(buffer)
具體如下所示:
OBUF u1(.l(din1), .T(n_enable), .O(my_signal));
這樣就能夠保證即使采用OOC綜合方式,my_signal也會保持三態(tài)值
同時,如果該模塊與其他部分有連接,那么這個連接也是不可用的(例如my_signal信號與“內(nèi)部”模塊有連接),綜合過程會報錯
評論