Verilog 如何检查信号驱动强度?

Verilog 如何检查信号驱动强度?,verilog,system-verilog,Verilog,System Verilog,我们如何检查导线上的信号驱动强度?可能吗? 通常,我们只能使用条件检查=或三重等于=来检查导线的逻辑值1或0。 但是它并没有告诉我们力量,例如,拉,强或弱等 那么有没有办法检查驱动力?例如,它将被用于如下内容: wire a; //... your a assignment initial begin //... if (a && is_weak1(a)) $display("a is weak 1"); end 驱动力使用特殊的%v字符显示 $display("a is %v

我们如何检查导线上的信号驱动强度?可能吗? 通常,我们只能使用条件检查
=
或三重等于
=
来检查导线的逻辑值
1
0
。 但是它并没有告诉我们力量,例如,

那么有没有办法检查驱动力?例如,它将被用于如下内容:

wire a;
//... your a assignment
initial begin
//...
if (a && is_weak1(a)) $display("a is weak 1");
end

驱动力使用特殊的
%v
字符显示

$display("a is %v" a);
%v

Strength   Value   %v
supply     7       Su
strong     6       St
pull       5       Pu
large      4       La
weak       3       We 
medium     2       Me
small      1       Sm
highz      0       HiZ

要在SystemVerilog中检查条件语句的值,请执行以下操作:

string str; 
initial begin
  //...
  str = $sformatf("%v", my_net);
  if (a && (str == "We1")) $display("a is weak 1");
注意:由于值1编码在字符串中,因此检查a是否为高是多余的,可能只是:

str = $sformatf("%v", my_net);
if (str == "We1") $display("a is weak 1");

正如所指出的,
$psprintf
实际上不是系统verilog标准的一部分,我们应该使用
$sformaf
。第21.3.3节将数据格式化为字符串。

如果信号仅显示1或0,则最多可显示两种状态。是,但这是逻辑值。我想要的是它的力量。逻辑1可以是weak1,也可以是strong1-我想在运行时检查代码中的信号强度。我不知道pull的定义,强还是弱。如果可以从信号中确定它们,则信号应具有多个值,如模拟方式的电压。如果信号小于1.0伏,则为弱信号,如果信号大于4.0伏,则为强信号,等等。您的信号是什么?该值是模拟值还是数字值?您应该详细说明您的系统。@Fumu7驱动器强度不涉及电压。在数字系统中,所有电压都应该相等,这与电阻有关,例如,带有多个驱动器的三态总线通常是通过弱下拉创建的。任何驱动程序都可以驱动1,但没有人驱动0。如果总线值不是您试图驱动的值,则存在总线争用,并且驱动程序会后退…它仅用于$display。在条件
if
语句中检查它怎么样?伪代码:如果(a==weak1)@AldoT如Morgan所示,则使用
$psprintf
返回的字符串进行比较
$psprintf
返回一个字符串,其中包含通过调用
$display
以相同参数打印到控制台的内容。此外,我猜您在条件中并不真正需要
if(a&&
,因为
a
1
这一事实已经在
的“We1”中进行了编码
code.@Tudor,考虑删除
(a&&
但决定离开,只是为了与原始问题相匹配。它可以封装在一个函数中,该函数删除了尾随的0/1。
$psprintf
不是语言标准的一部分,尽管大多数模拟器都支持它。等效的是
$sformaf
第21.3.3节将数据格式化为字符串