将std_logic与'X'进行比较时如何获得模拟警告?

时间:2014-09-09 06:23:47

标签: vhdl

为了捕捉模拟中的更多错误,获得警告是一个优势 如果在std_logic比较中使用'X'=

使用ieee.std_logic_1164包时,std_logic比较功能 =不会在任一操作数中警告'X'。所以'if'分支在 sl_i'1'时会采用以下代码,但会采用else分支 如果sl_i'0''X'等,则

if sl_i = '1' then
  sl_o <= '1';
else  -- sl_i in "UX0ZWLH-"
  sl_o <= '0';
end if;

因此,例如'X''U',由于使用某些未知或未初始化的 值,在模拟过程中默默忽略。但是,如果发出警告, 它会提高在模拟中发现错误的可能性,例如 ieee.numeric_std包警告metavalue('X'等)与之比较 =

?是否有任何标准的VHDL方法可以在std_logic中获取元值的警告 与=比较?

一种可能性是创建一个包含=隐式std_logic的包 重新定义,然后将此包与.all一起使用,以便替换=。这样 包装可能看起来像:

library ieee;
use ieee.std_logic_1164.std_logic;

package std_logic_warning is
  function "="(l, r : std_logic) return boolean;
end package;

library ieee;
use ieee.std_logic_1164.is_x;
use ieee.std_logic_1164;  -- For access to "=" using std_logic_1164."="

package body std_logic_warning is

  function "="(l, r : std_logic) return boolean is
  begin
    assert not (is_x(l) or is_x(r))
      report "std_logic_warning.""="": metavalue detected"
      severity WARNING;
    return std_logic_1164."="(l, r);
  end function;

end package body;

?这样的重新定义是否符合VHDL标准,并且可能有效 一般的工具?

正如吉姆刘易斯在提及ISAC IR2058时提到的那样 在使用时,覆盖隐式=可能不适用于工具 VHDL-2003。 VHDL-2008应该解决这个问题。


请注意,上述问题和建议已根据David Koontz编辑 以前的评论。

1 个答案:

答案 0 :(得分:2)

根据您使用的语言版本,您可能会遇到可移植性问题。我建议你使用VHDL-2008来避免它们,这会消除许多问题。

在VHDL-2008之前,一些工具不允许显式运算符重载隐式运算符。在VHDL-2008之前,工具将引用解释为&#34; ieee.std_logic_1164.std_logic&#34;不同。有关讨论,请参阅ISAC IR2058:http://www.eda.org/isac/IRs-VHDL-2002/IR2058.txt。即使有了IR2058的实现,我的解释是is_x不会包含在你对std_logic的引用中,因为只包含了重载运算符而不是所有函数 - 所以如果它有效,它可能在工具之间不可移植。

因此,我会使用VHDL-2008和以下代码。我将引用替换为ieee.std_logic_1164。&#34; =&#34;有一个到ieee.numeric_std.std_match,因为我不清楚你是否仍然可以引用隐式运算符一旦显式运算符可见替换它 - 即使它是合法的,我希望这是一个边缘情况,可能会破坏工具(确保报告错误)。使用std_match还具有正确处理&#39; L&#39;或者&#39; H&#39;。

library ieee;
use ieee.std_logic_1164.all;

package std_logic_warning is
  function "="(l, r : std_logic) return boolean;
end package;

package body std_logic_warning is

  function "="(l, r : std_logic) return boolean is
  begin
    assert not (is_x(l) or is_x(r))
      report "std_logic_warning.""="": metavalue detected"
      severity WARNING;
    return ieee.numeric_std.std_match(l, r);
  end function;

end package body;

如果您不喜欢std_match的行为,可以使用std_match作为模板来创建功能,但是,我不建议这样做,因为综合工具可能不喜欢它。

虽然您可以使用修改后的&#34; =&#34;作为计数器建议,但有两个X源,其他设计为外部,未初始化寄存器为内部。我不担心未初始化的寄存器,因为我对我的重置非常严格。因此,在核心层面,我可以(取决于我对其他人或测试平台的信心),直接在核心输入上使用断言语句。

assert not is_x(core_input_1) 
  report "meta value detected on core_input_1" severity ERROR ;