综合中的Metalogical Value
2012-11-17
峻少
标签:

Metalogical value是指: don't care, unknown和high-impedance这三个值。

我们对这几个 meta-logic 关心的主要有几个问题:

  • 能否与其他信号或者变量进行比较?
  • 能否赋值给其他信号或者变量?

1.Don't-Care

在综合的时候,含有“-”,或者“D”, “X”这类表示don’t-care的值是无法与相关硬件综合的,在<> (p98)这本书上,作者是这样表述的:

“A don’t-care value can be compare using the “=” (equality) operator or the “/=” (inequality) in and if statement. In such a case, the “=” operator always returns false while “/=” operator always returns true.”

这里作者只是表述了if statement 一种状况,但是实际上,我们可以把它推广至所有需要比较的情况。一些表示 don’t-care 的符号例如“-”,“D” 如果从仿真的角度来看,是非常方便的,但是用在综合里面,由于找不到对应的硬件与之关联,很容易发生错误。我们现在用一个Priority Encoder 的例子来看一下。

首先用可综合的VHDL来表述:

LIBRARY IEEE;

USE IEEE.Std_Logic_1164.ALL;

ENTITY priority IS

port(

datain: in std_logic_vector (3 downto 0);

z:out std_logic_vector (1 downto 0)

);

END entity priority;

architecture metalogic of priority IS

begin

Z<="00" when datain(0)=’1’ else

"01" when datain(2 downto 0)="100" else

"10" when datain(1 downto 0)="10" else

"11" when datain(3 downto 0)="1000" else

"00" ;

end architecture metalogic;

综合的结果如下:

而如果我们使用带有“-”的符号来表示 don’t-care,并用VHDL编写代码:

LIBRARY IEEE;

USE IEEE.Std_Logic_1164.ALL;

ENTITY priority IS

port(

datain: in std_logic_vector (3 downto 0);

z:out std_logic_vector (1 downto 0)

);

END entity priority;

architecture metalogic of priority IS

begin

Z<="00" when datain="---1" else

"01" when datain="--10" else

"10" when datain="-100" else

"11" when datain="1000" else

"00" ;

end architecture metalogic;

综合结果如下:

在第二个例子中,可以看到由于前三个判断句

z<="00" when datain="---1" else

"01" when datain="--10" else

"10" when datain="-100" else

中含有“-”,所以它们的值永远为false.所以生成的电路完全忽略了这三个判断分句,而只对

"11" when datain="1000" else

"00" ;

做出综合。

上面是对组合逻辑做出的分析,同样我们可以推知:如果含有“-”的判断条件出现在 if else这样的时序判断分句里面,这样的判断分句相当于无效(null statement), 那样会出现条件覆盖不完整的情况,因此可能出现 latch 等我们不希望出现的东西。

结论:

综合的时候,对 Don't-care 的比较判断永远为 false.所以,对 don’t-care 的比较判断操作一定要小心,最好把 don’t-care只是限定在仿真阶段。

Don't-care可以对其他信号或者变量赋值,而综合工具会自动找出一种消耗资源最少的实现方式来实现。

2.Unknown

我们还是使用上面那个Priority Encoder 的程序,只是把“-”代换为“U”.

程序如下:

LIBRARY IEEE;

USE IEEE.Std_Logic_1164.ALL;

ENTITY priority IS

port(

datain: in std_logic_vector (3 downto 0);

z:out std_logic_vector (1 downto 0)

);

END entity priority;

architecture metalogic of priority IS

begin

Z<="00" when datain="UUU1" else

"01" when datain="UU10" else

"10" when datain="U100" else

"11" when datain="1000" else

"00" ;

end architecture metalogic;

而综合的结果和don’t care一样:

结论:

综合的时候,对 Unknown的比较判断永远为 false.所以,对 Unknown的比较判断操作一定要小心。

Unknown 不可以对其他信号或者变量赋值。如果硬把 unknown 赋给变量或者信号,赋值所在的行完全无效;

3.High-impedance

High impedance 对应电路中的高阻态,也就是三态门。和其他两个一样:

(偷个懒,这里直接给出结论了)

结论:

综合的时候,对 High-impedance 的比较判断永远为 false,所以,对High-impedance 的比较判断操作一定要小心。

High-impedance 可以对其他信号或者变量赋值,会形成三态门,但是必须要引入条件判断,比如 if else, case, when….

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号