本文讨論如何在Verilog中的實作不同的指派,以及它們在邏輯綜合中會推斷出什麼樣的電路。
1、當對同一個net,使用多個assign語句,會綜合出什麼樣的邏輯?
在可綜合的verilog代碼中,**為同一個net使用多個assign語句是錯誤的。**綜合工具會報出文法錯誤,即“net is being driven by more than one source”。 例如,以下是錯誤的:
但是,使用多個assign來驅動三态net 是合法的語句(因為判斷條件不同,随意不會同時被執行?),如下示例所示:
2、條件指派在邏輯綜合時會推斷出什麼電路?
條件指派通過“?:”實作。 條件指派在邏輯綜合時被推斷為MUX。 例如,
以下示例是一個簡單的MUX:
3、條件指派嵌套會綜合出什麼樣的電路?
如下例所示,條件指派嵌套會被綜合成MUX “tree ”:
4、 在同一個always語句塊中,對同一個reg變量多次指派會綜合出什麼電路 ?
在同一個always語句塊中,對同一個reg變量進行多次非阻塞指派時,邏輯綜合時會選擇最後一個指派。 例如:
OR邏輯是最後一個指派。是以,綜合出來的邏輯是OR門。
對于組合邏輯中always語句塊中的阻塞指派來說,情況也是如此。
5、為什麼時序邏輯應該用非阻塞指派,如果用阻塞指派會發生什麼?并且與組合邏輯進行比較。
阻塞指派和非阻塞指派之間的主要差別是阻塞指派中的RHS會被立即指派到LHS,而非阻塞指派,LHS的指派是發生在RHS值被計算之後。
以下說明了在時序邏輯中使用阻塞指派和非阻塞指派的不同場景:
5.1、 在時序邏輯中使用阻塞指派
以下是時序邏輯中使用阻塞指派的Verilog子產品示例:
在上面的例子中,reg1,reg2,reg3,out1都是阻塞指派。 綜合結果是單個FF觸發器,輸入為in1,q輸出為out1,如下圖所示:
這是因為in1和out1之間的中間結果是以阻塞指派形式存儲在reg1,reg2和reg3中。 結果,對out1的RHS最終計算會被立即指派到out1, reg1,reg2和reg3已經通過綜合進行了優化。
5.2 、 在時序邏輯中使用非阻塞指派
以下代碼示例了時序邏輯中使用非阻塞指派:
在上面的例子中,reg1,reg2,reg3,out1為非阻塞指派。 綜合結果為4個觸發器。
這是因為in1和out1之間的中間結果是以非阻塞指派存儲在reg1,reg2和reg3中。在這種情況下,輸出是由clk事件控制的移位寄存器。
5.3 、在組合邏輯中使用阻塞指派
以下示例說明了組合邏輯中的阻塞指派的用法:
在上面的使用阻塞指派的組合邏輯語句中,沒有posedge,并且“<=”被“=”替換。 由此綜合的邏輯很簡單,是in1到out1之間的連線。
這是因為所有的指派都是立即執行的,沒有需要等待的事件。