常量表达式在VHDL案例语句中是否有效?

时间:2014-08-20 16:37:23

标签: vhdl verilog system-verilog

我记得在Verilog中,在case语句的表达式中使用常量是有效的,但它在VHDL中是否也有效?

// Verilog example
case(1'b1)                                
  A[2]:   Y<=2'b11;  
  A[1]:   Y<=2'b10;  
  A[0]:   Y<=2'b01;  
  default:Y<=2'b00;
endcase

2 个答案:

答案 0 :(得分:6)

以下代码与您的示例并不完全平行,但它可能很有用:

编译:

process
  constant S : std_logic := '1';
begin
  case S is
    when '0' =>
    when '1' =>
    when others =>
  end case;
end process;

这样做:

process
begin
  case std_logic'('1') is
    when '0' =>
    when '1' =>
    when others =>
  end case;
end process;

process
begin
  case '1' is
    when '0' =>
    when '1' =>
    when others =>
  end case;
end process;

'1'含糊不清(std_logic / character)。

现在,你实际做的事情有点不同,我不确定你的意图是什么。您似乎想要确定设置的最高位。在VHDL中,如果A也是常量(案例选择需要局部静态),那么你的构造只能在语法上有效,在这种情况下,有更简单的方法来实现这一点(例如for循环)。但是存在互斥的问题 - 一般情况下,案例选择必然会重叠,我认为这应该是非法的(尽管ModelSim在我尝试时并没有抱怨 - 综合工具可能是另一个故事)。无论如何,我认为这绝对不是一个好主意。

答案 1 :(得分:2)

不,您不能将案例陈述表达为VHDL案例陈述

与Verilog不同,IEEE Std 1364-2005 9.5案例陈述第4段:

  

案例表达式和案例项表达式可以在   运行;表达式都不需要是一个常量表达式。

在IEEE Std 1076-1993 8.8案例陈述中,第8段(也代表-2008):

  

简单表达式和离散范围作为案例中的选项给出   语句必须是本地静态的。由离散范围定义的选择   代表相应范围内的所有值。别人的选择   只允许最后一种选择,作为唯一的选择;它   代表在选择中没有给出的所有值(可能没有)   以前的选择。元素简单名称(见7.3.2)不是   允许作为案例陈述备选的选择。

来自术语表:

  

局部静态表达式:在分析出现的设计单元期间可以评估的表达式。

     

分析:VHDL设计文件中源代码的语法和语义分析,以及将设计单元的中间形式表示插入到设计库中。

(一种告诉我们编译时间而非详细说明(链接和加载)的奇特方式.VHDL的定义也包含解释性实现。)

本地静态表达式的定义要求A声明为常量,而在VHDL LRM -1993版本中,片名称或索引名称不是本地静态(参见IEEE Std 1076-1993, 7.4.1局部静态原色第1,7.4.2全局静态原色,r。 - 全局静态意味着在精化时间)。对于静态索引表达式或静态索引范围(参见IEEE Std 1076-2008,9.4.2,n。和o。),在IEEE Std 1076-2008中进行了更改。它可能是合成供应商的工具滞后,即使你可以模拟它,你今天很可能无法合成它。

还存在具有相同值的多个选项的问题。参见IEEE Std 1076-1993 8.8案例陈述,第3段(此问题也代表-2008):

  

表达式必须是离散类型,或者是一维的   数组类型,其元素基类型是字符类型。这种类型必须   可以独立于表达式的上下文来确定   发生,但使用表达式必须是离散的事实   类型或一维字符数组类型。案例中的每个选择   声明替代必须与表达式具有相同的类型;该   选项列表指定表达式的值   选择替代方案。

表达式std_logic&#39;(&#39; 1&#39;)或S的基本类型为std_ulogic。这消除了不属于std_logic基本类型的选择(std_ulogic - &#39; U&#39;&#39; X&#39;,&#39; 0&#39;,&#39; 1&#39 ,&#39; Z&#39;&#39; W&#39;,&#39; L&#39;,&#39; H&#39;,&#39; - &#39;,参见IEEE Std 1076-2008 16.7标准多值逻辑包和附件A脚注15,它提供了包std_logic_1164的源代码链接

请注意,fru1tbat显示了选择&#39; 0&#39;,&#39; 1&#39;和其他人一样,对表达式A(2),A(1)或A(0)的评估会返回一个std_ulogic子类型,并为您提供多个表示相同值的选择(&#39; 1&#39;)。参见IEEE Std 1076-1993,8.8 para 7:

  

对于其他形式的表达式,(基本)类型的每个值   表达式必须在集合中表示一次且仅表示一次   选择,不允许其他任何值。

因此,案例陈述不能在VHDL中直接表达,我们只对A(2),A(1)和A(0)是&#39; 1&#39;并且只允许一个选择。相反,我们可以使用条件信号赋值语句:

library ieee;
use ieee.std_logic_1164.all;

entity constexp is
end entity;

architecture foo of constexp is
    signal A:   std_logic_vector (2 downto 0) := "001";
    signal Y:   std_logic_vector (1 downto 0);
begin

COND: -- Conditional Signal Assignment statement

    Y <= "11" when A(2) = '1' else
         "10" when A(1) = '1' else
         "01" when A(0) = '1' else
         "00";

end architecture;

(此设计规范分析,阐述和模拟。)

条件信号分配是1076-1993标准中的并发语句(参见9.5.1条件信号分配),而条件信号分配也可用作1076中的顺序语句-2008标准(参见11.6并发信号分配语句和10.5.3条件信号分配)。今天,它可能的综合供应商将符合-1993标准。

根据定义,这里的任何构造都可以转换为if语句,这些语句是顺序语句。