Systemverilog中的Driving Strength讲解

在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和weakcharge storage strength:large,medium和smallhigh impedance:highzcharge storage strength只用于trireg类型的net。
driving strength的语法如下:
drive_strength ::= ( strength0 , strength1 )| ( strength1 , strength0 )| ( strength0 , highz1 )| ( strength1 , highz0 )| ( highz0 , strength1 )| ( highz1 , strength0 )strength0 ::= supply0 | strong0 | pull0 | weak0strength1 ::= supply1 | strong1 | pull1 | weak1charge_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=su1assign (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。

作为Fab-Liter战略的一部份,安森美剥离晶圆制造厂
IR2117 单通道MOSFET或IGBT栅极驱动器集成电路
电力系统中变压器的中性点为什么要接地?
详解八层PCB主板设计要点
宽带无线电需要宽动态范围转换器
Systemverilog中的Driving Strength讲解
逆变器和转换器的差别,经久耐用而广泛应用
介绍物联网技术带来的最新应用
自治系统稳定性分析
全面屏大战进入白热化,双屏设计成风潮
同样是2千左右的价格,华为、小米、魅族、锤子、一加、哪个好?
思爱普:AI成为工业4.0主干力量
压铸铝双金属散热器的详细介绍
D类音频放大器的原理及其应用
侧边指纹和屏幕指纹谁更实用呢?
4mA至20mA压力传感器变送器,集成电压或电流驱动
光耦合器如何提供电气安全及其安全相关特性
【世说设计】轻松掌握学会一个低成本仪表放大器设计方法
UltraFast 设计方法--赛灵思强烈推荐
什么是ATE测试?ATE测试的工作内容和要求?