時間一晃,夏和秋開始交替這篇文章通過實際的design compiler綜合來精解verilog**生成latch的問題。有的人準備迎接碩果
而我,在夏天的尾巴焦頭爛額
望著窗外的天,享受吹來的風
仍不知心裡愁緒是真,還是假
逃離秋招季的焦慮
緩緩心情,也好好努力
下面哪種寫法會產生latch?為什麼?
**如下:
a.
always @(*)begin
if(d)
a = b;
end
b
always @(*)begin
if(d)
a = b;
else
a = a;
end
c
always @ (b or d)
case(d)
2』b00: a=b>>1;
2』b11: c=b>>1;
default:
begin
a=b;
c=b;
endendcase
d
always @(b or d)begin
a=b;
c=b;
case(d)
2』b00: a=b>>1;
2』b11: c=b>>1;
endcase
end
e
always@(bor d)begin
case(d) //synopsys full_case
2』b00: a=b>>1;
2』b11: c=b>>1;
endcase
end
**a:是乙個always語句塊構成的組合邏輯,其中缺少else分支。
當d=1'b0時,綜合工具會預設保持a的值,即生成鎖存器。
綜合出的電路圖如上所示,tlatx1就是所使用的標準單元庫的鎖存器的名字。
**b雖然補全了else分支語句。但是,其**依然有保持功能,即會生成鎖存器。
也就是說,組合邏輯是否會生成鎖存器,其根本原因是該組合邏輯存在保持功能!
**c:
module code_c(
input [1:0] d,
input [1:0] b,
output reg [1:0] a,
output reg [1:0] c);
always@(b or d ) begin
case(d)
2'b00:a = b >>1 ;
2'b11:c = b >>1 ;
default:begin
a = b ;
c = b ;
endendcase
endendmodule
**c在always語句塊內使用了case語句,並且case語句中含有default分支。但是,我們可以發現,
d=2』b00時,沒有說明c的賦值;
d=2』b01時,沒有說明a的賦值;
從上面的綜合結果可以看出,綜合出來4個鎖存器。
d=2』b00時,儲存c的值;
d=2』b01時,儲存a的值
**d
module code_d(
input [1:0]d,
input [1:0]b,
output reg [1:0]a,
output reg [1:0]c);
always@(b or d ) begin
a = b ;
c = b ;
case(d)
2'b00:a = b >>1 ;
2'b11:c = b >>1 ;
endcase
endendmodule
**d和**c的不同是,它在always語句塊的開始,對a和c進行了預設賦值。
這就類似於軟體裡面的初始化,當然只是類似而已。
從上面的綜合結果,我們可以看出來,沒有生成任何時序邏輯。
**e
module code_e(
input [1:0] d,
input [1:0] b,
output reg [1:0] a,
output reg [1:0] c);
always@(b or d ) begin
case(d) //synopsys full_case
2'b00:a = b >>1 ;
2'b11:c = b >>1 ;
endcase
endendmodule
使用了//synopsys full_case 選項,
該選項:
1、防止綜合工具將case語句綜合成不必要的優先順序電路,增大硬體開銷
2、和default語句類似,補全case語句沒有列出的情況。
3、但是//synopsys full_case會造成工具之間的移植性問題,改**依然綜合出了鎖存器
由上圖我們可以看出,對於2位元的右移位「>>」
a[1]和c[1]恆等於1』b0
但是**c卻使用了4個鎖存器,這是乙個比較詭異的事情!
Web綜合例項
web綜合例項 要求 l 主站點 www.abc.com ip 位址為 192.168.2.100 任何人都可以訪問,主頁內容為 web 主目錄為 var www html l 市場部站點 mkt.abc.com ip 位址為192.168.2.100 實現 控制及只能允許 ip位址在 192.16...
八 例項綜合
在進行資料運算的時候,有時候會出現資料溢位現象,為了解決這一問題,可採用資料強制轉換的方法。include sbit addr3 p1 3 sbit enled p1 4 sbit key1 p2 4 sbit key2 p2 5 sbit key3 p2 6 sbit key4 p2 7 unsi...
Qt QGroupBox綜合例項
對於qgroupbox常用於作為乙個容器來包含其他控制項,因為在介面的控制項比較多的時候我們需要對其進行區域劃分,那麼qgroupbox就派上用場了,讓其包含子控制項做為乙個區域,其他的在利用其他容器或或者使用布局管理器來對整體的介面進行調整,這樣做的好處就是顯得介面非常的整潔,而不是雜亂無章。一般...