什么是組合邏輯環(huán)路?
組合邏輯環(huán)路(Combinational Loops):指組合邏輯的輸出信號不經(jīng)過任何時(shí)序邏輯電路(FF等),而直接反饋到輸入節(jié)點(diǎn),從而構(gòu)成的電路環(huán)路。

此外,如果直接將寄存器的輸出端通過組合邏輯反饋到該寄存器的異步端口(異步復(fù)位或異步置位),也會(huì)形成組合邏輯環(huán)路。

為什么要避免組合邏輯環(huán)路?
在FPGA設(shè)計(jì)中,絕大多數(shù)的應(yīng)用場景都不需要使用組合邏輯環(huán)路,我暫時(shí)能想到的例外只有隨機(jī)數(shù)發(fā)生器(評論區(qū)可以補(bǔ)充一下)。

在實(shí)踐中,避免使用組合邏輯環(huán)路主要是因?yàn)樗奶匦运鶎?dǎo)致的危害:
組合邏輯環(huán)路違反了同步設(shè)計(jì)原則,容易振蕩,從而導(dǎo)致整個(gè)設(shè)計(jì)不穩(wěn)定和不可靠。
組合邏輯環(huán)路的行為功能取決于該環(huán)路上的延遲(邏輯延遲和布線延遲),一旦延遲發(fā)生變化,整個(gè)設(shè)計(jì)的行為功能將變得無法預(yù)測。
組合邏輯環(huán)路的振蕩將導(dǎo)致EDA軟件做無窮無盡的計(jì)算。為了完成這種計(jì)算,EDA軟件將會(huì)切割環(huán)路。不同的EDA軟件的切割方式不盡相同,這可能會(huì)與設(shè)計(jì)者的設(shè)計(jì)目的相違背,從而導(dǎo)致邏輯功能錯(cuò)誤。
組合邏輯環(huán)路無法進(jìn)行靜態(tài)時(shí)序分析(STA),可能會(huì)出現(xiàn)時(shí)序違例,或者導(dǎo)致STA過程時(shí)間過長。
什么情況會(huì)導(dǎo)致組合邏輯環(huán)路?
情況1:組合邏輯的輸出信號僅經(jīng)過組合邏輯電路后又反饋到了輸入節(jié)點(diǎn)。比如下面的代碼:


這樣的設(shè)計(jì)在Vivado中不會(huì)報(bào)錯(cuò),但會(huì)報(bào)嚴(yán)重警告(Critical warning)。


情況2:寄存器的輸出端通過組合邏輯直接反饋到該寄存器的異步端口(異步復(fù)位或異步置位)。比如下面的代碼:


這種情況所導(dǎo)致的組合邏輯環(huán)路在實(shí)踐中還是比較少出現(xiàn)的,因?yàn)橐话闱闆r下,寄存器的異步端口都是直接由模塊外部連接的信號所驅(qū)動(dòng)。
如何處理組合邏輯環(huán)路?
最重要的一點(diǎn):一定要堅(jiān)決避免組合邏輯環(huán)路!現(xiàn)在的EDA工具基本上都可以把組合邏輯環(huán)路識別出來,并報(bào)錯(cuò)或者報(bào)警告。寫完RTL代碼后請一定要記得看EDA工具的報(bào)告的錯(cuò)誤和警告信息Message!
組合邏輯環(huán)路的避免首先應(yīng)該通過良好的編碼習(xí)慣來避免。上述的兩種示例代碼就是典型的錯(cuò)誤,請不要在設(shè)計(jì)中使用類似的代碼。
如果出現(xiàn)了組合邏輯環(huán)路且當(dāng)前設(shè)計(jì)修改困難,那么請修改你的RTL代碼--通過添加寄存器的方式來切斷反饋回路。就像這樣:

如果組合邏輯環(huán)路的出現(xiàn)是符合預(yù)期設(shè)計(jì)目的的(比如隨機(jī)數(shù)發(fā)生器),想將其保留該如何操作?只要在XDC約束文件中添加這一句即可:

什么是語言模板?
不論是Xilinx的Vivado,還是Altera的Quartus II,都為開發(fā)者提供了一系列Verilog、SystemVerilog、VHDL、TCL、原語、XDC約束等相關(guān)的語言模板(Language Templates)。
在Vivado軟件中,按順序點(diǎn)擊Tools----Language Templates,即可打開設(shè)計(jì)模板界面。


在Quartus II軟件中,需要設(shè)計(jì)文件(.v文件等)的需要處點(diǎn)擊右鍵,然后點(diǎn)擊Inset Templates,即可打開模板界面。


設(shè)計(jì)模板有什么用?
語言模板的內(nèi)容還是非常豐富的,比如你可以看看xilinx推薦的文件頭是什么樣的:

Verilog語法(邏輯運(yùn)算符):

找不到原語使用方式的時(shí)候,也可以來這里查找(當(dāng)然你也可以查xilinx的官方文檔):

有些時(shí)序約束語法不太好記,你可以用這個(gè)工具查找,比如:

看看xililnx提供的宏XPM(Xilinx Parameterized Macro)是怎么用的,比如CDC這部分的:

最最重要的一點(diǎn)是,它提供了很多典型電路的設(shè)計(jì)方法。
由于各家FPGA的結(jié)構(gòu)差異,可能相同的代碼在不同的器件上生成的結(jié)構(gòu)會(huì)存在很大差異。比如有時(shí)候,可能你想設(shè)計(jì)的是一個(gè)分布式DRAM,但是由于你的代碼風(fēng)格和綜合工具的原因,它給你生成的事BRAM,那這樣就和你的設(shè)計(jì)初衷相違背了(當(dāng)然隨著綜合工具的發(fā)展,這類情況是越來越少了)。所以在設(shè)計(jì)相關(guān)電路時(shí),請盡量參考xilinx提供的代碼,以確保vivado能正確生成你想要的電路(Altera 的FPGA類似)。

總 結(jié)
● 語言模板可以學(xué)習(xí)HDL語言語法、綜合屬性等;
● 語言模板可以快速查找設(shè)計(jì)內(nèi)容、模板;
● 語言模板提供的電路設(shè)計(jì)模板可以保證綜合工具能正確推斷出對應(yīng)的電路。
-
FPGA
+關(guān)注
關(guān)注
1660文章
22394瀏覽量
635461 -
組合邏輯
+關(guān)注
關(guān)注
0文章
48瀏覽量
10367 -
環(huán)路
+關(guān)注
關(guān)注
0文章
51瀏覽量
12431
原文標(biāo)題:FPGA編碼風(fēng)格集錦
文章出處:【微信號:Hack電子,微信公眾號:Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
FPGA實(shí)戰(zhàn)演練邏輯篇39:代碼風(fēng)格與書寫規(guī)范
FPGA實(shí)戰(zhàn)演練邏輯篇41:代碼風(fēng)格
Linux內(nèi)核編碼風(fēng)格(編程代碼風(fēng)格推薦)
Gowin HDL編碼風(fēng)格要求及編碼實(shí)現(xiàn)
基于FPGA的非編碼無線模塊的應(yīng)用設(shè)計(jì)
基于FPGA的非編碼無線模塊的應(yīng)用設(shè)計(jì)
自適應(yīng)算術(shù)編碼的FPGA實(shí)現(xiàn)
高精度增量式編碼器與基于DSP和FPGA編碼器信號測量模塊
基于FPGA的Varint編碼設(shè)計(jì)原理和實(shí)現(xiàn)
關(guān)于Linux的內(nèi)核代碼風(fēng)格
Gowin HDL編碼風(fēng)格用戶指南
Verilog編碼風(fēng)格的建議
FPGA編碼風(fēng)格介紹
評論