天天看點

指派語句及綜合結果

本文讨論如何在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之間的連線。

指派語句及綜合結果

這是因為所有的指派都是立即執行的,沒有需要等待的事件。