Metalogical value是指: don't care, unknown和high-impedance这三个值。 我们对这几个 meta-logic 关心的主要有几个问题:
- 能否与其他信号或者变量进行比较?
- 能否赋值给其他信号或者变量?
1.Don't-Care 在综合的时候,含有“-”,或者“D”, “X”这类表示don’t-care的值是无法与相关硬件综合的,在<<A VHDL Synthesis Primer (2nd Edition)>> (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….
|