【问题标题】:How to check signal drive strength?如何检查信号驱动强度?
【发布时间】:2015-02-09 04:08:05
【问题描述】:

我们如何检查电线上的信号驱动强度?是否可以? 通常,我们只能使用条件检查== 或三等于=== 来检查10 的逻辑值。 但它并没有告诉我们强度,例如pullstrongweak

那么有没有办法检查驱动力?例如,它会像这样使用:

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

【问题讨论】:

  • 如果信号只显示 1 或 0,则最多可以显示两种状态。
  • 是的,但这是合乎逻辑的价值。我想要的是它的力量。逻辑 1 可以是弱 1 或强 1 - 我想在运行时检查我的代码中的这个信号强度。
  • 我不知道拉力的定义,强或弱。如果您可以从信号中确定它们,则信号应该具有多个值,例如模拟方式的电压。如果信号小于 1.0 伏特弱,如果信号大于 4.0 伏特强,等等。你的信号是什么?那个值是模拟的还是数字的?您应该指定有关系统的更多详细信息。
  • @Fumu7 驱动强度不涉及电压,在数字系统中所有电压都应该相等,这是关于电阻,例如具有多个驱动器的三态总线通常是通过弱下拉创建的。任何驱动程序都可以驱动 1,但没有人驱动 0。如果总线值不是您尝试驱动的值,则存在总线争用并且驱动程序退出 ...

标签: verilog system-verilog


【解决方案1】:

驱动强度使用特殊的%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

Source.

在 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");

正如Greg 指出的$psprintf 实际上并不是系统verilog 标准的一部分,我们应该使用$sformatf 来代替。 IEEE Std 1800-2012 第 21.3.3 节 将数据格式化为字符串

【讨论】:

  • 仅用于$display。在条件if 语句中检查它怎么样?伪代码:if (a == weak1)
  • @AldoT 正如 Morgan 向您展示的那样,您使用 $psprintf 返回的字符串进行比较。 $psprintf 返回一个字符串,其中包含通过使用相同参数调用 $display 将打印到控制台的内容。
  • 另外,我猜你并不真的需要条件中的if(a &&,因为a1 的事实已经在"We1" 代码中编码。
  • @Tudor,考虑删除(a && 但决定离开,只是为了匹配原始问题。它可以包含在一个删除尾随 0/1 的函数中。
  • $psprintf 不是语言标准的一部分,尽管大多数模拟器都支持它。相当于$sformatfIEEE Std 1800-2012第21.3.3节将数据格式化为字符串
猜你喜欢
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2016-04-24
  • 2017-05-13
相关资源
最近更新 更多