在systemverilog中,net用于對電路中連線進行建模,driving strength(驅動強度)可以讓net變量值的建模更加精確。net變量擁有4態邏輯值(0,1,z,x),它的driving strength有(supply,strong,pull,weak,highz)。net的值由連接到net的driver源(驅動源)決定的,這些driver源可以是連續賦值語句(例如assign),也可以是門級建模原語(例如門級or或and或cmos等)。
在每個Δ仿真周期中,仿真器通過查看net上所有驅動源的邏輯值(logical value)和強度值(strength level)來決定該net的邏輯值和強度值。如果net沒有驅動源,那么它的值將是’z’態。如果net只有1個驅動源,那么它的邏輯值和強度值等于驅動源的值和強度。但是,如果net有多個驅動源,那么需要比較它們的強度值了,強度最大的驅動源將成功驅動net。不過如果有多個強度最大的驅動源,但它們的邏輯值不一樣的話,net的邏輯值將會是’x’態,強度值是最強的strength。
需要注意的是driving strength是用于gate輸出和連續賦值語句輸出的(assign)。對于非net類型的多驅動,仿真工具會報多驅的編譯錯誤。
Systemverilog的driving strength level(驅動強度)有以下幾種:
上述strength level可以歸為3類:
- Driving strength:supply,strong,pull和weak
- Charge storage strength:large,medium和small
- High impedance:highz
Charge storage strength只用于trireg類型的net。
Driving strength的語法如下:
drive_strength ::=
( strength0 , strength1 )
| ( strength1 , strength0 )
| ( strength0 , highz1 )
| ( strength1 , highz0 )
| ( highz0 , strength1 )
| ( highz1 , strength0 )
strength0 ::= supply0 | strong0 | pull0 | weak0
strength1 ::= supply1 | strong1 | pull1 | weak1
charge_strength ::= ( small ) | ( medium ) | ( large )
strength0表示當驅動源驅動net為0時的驅動強度。Strength1表示當驅動源驅動net為1時的驅動強度。
net默認的strength level是(strong0, strong1)。對于pullup和pulldown gate,默認的strength level是pull。trireg默認的strength level是medium。Supply net的默認strength level是supply。另外從上面syntax看出,(highz1, highz0)和(highz0, highz1)的strength level組合是非法的。
結合上面的理論講解,給出1個例子如下:
module strength;
logic i1, i2;
wire logic out;
assign (supply1, weak0) out = i1;
assign (pull1, supply0) out = i2;
initial begin
i1 = 1'b0;
i2 = 1'b0;
$strobe("[time:%0t],i1:%b, i2:%b, out:%b, out_strength:%v", $time, i1, i2, out, out);
#1ns;
i1 = 1'b0;
i2 = 1'b1;
$strobe("[time:%0t],i1:%b, i2:%b, out:%b, out_strength:%v", $time, i1, i2, out, out);
#1ns;
i1 = 1'b1;
i2 = 1'b0;
$strobe("[time:%0t],i1:%b, i2:%b, out:%b, out_strength:%v", $time, i1, i2, out, out);
#1ns;
i1 = 1'b1;
i2 = 1'b1;
$strobe("[time:%0t],i1:%b, i2:%b, out:%b, out_strength:%v", $time, i1, i2, out, out);
end
endmodule
使用Questasim仿真輸出的log結果為:
# [time:0],i1=0, i2=0, out=0, out_strength=Su0
# [time:1],i1=0, i2=1, out=1, out_strength=Pu1
# [time:2],i1=1, i2=0, out=x, out_strength=SuX
# [time:3],i1=1, i2=1, out=1, out_strength=Su1
"assign (supply1, weak0) out = i1"行給net類型的out驅動i1的值,其中strength1為supply1(level=7),strength0為weak0(level=3)。12行給net類型的out驅動i2的值,其中strength1為pull1(level=5),strength為supply0(level=7)。
" assign (pull1, supply0) out = i2"行給net類型的out驅動i2的值,其中strength1為pull1(level=5),strength為supply0(level=7)。
Driving strength還有很多其它的組合,大家可以復制上述代碼,并修改assign out語句的strength0與strength1去產生其它的組合并分析結果。
另外,大家可能好奇如何打印出net變量的strength level?在systemverilog中提供了%v格式化打印。%v的輸出是3個字符的string類型,前2個字符指示strength類型,第三個字符指示當前邏輯值。比如上述log中的Su0或Pu1或SuX或Su1。
-
驅動器
+關注
關注
52文章
8226瀏覽量
146258 -
仿真器
+關注
關注
14文章
1017瀏覽量
83722 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8224
發布評論請先 登錄
相關推薦
評論