原创 【转】综合中的 Metalogical Value

2010-11-26 12:45 1161 5 5 分类: FPGA/CPLD
 Metalogical value是指: don't care, unknown和high-impedance这三个值。
   我们对这几个 meta-logic 关心的主要有几个问题:

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

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….


文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条