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

常量表达式在VHDL case语句中是否有效?,vhdl,verilog,system-verilog,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 //Verilog示例 箱子(1'b1) A[2]:Y以下代码与您

我记得在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
//Verilog示例
箱子(1'b1)

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

这包括:

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;
这并不是:

'1'
不明确(
std\u逻辑
/
字符


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

不,您不能将case语句表示为VHDL case语句

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

可以在以下位置计算案例表达式和案例项表达式: 运行时间;这两个表达式都不要求是常量表达式

在IEEE标准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标准1076-2008对静态索引表达式或静态索引范围作了更改(见IEEE标准1076-2008,9.4.2,n.和o.)。很可能是合成工具滞后,即使你能模拟它,你今天也不能合成它

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

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

其中表达式std_logic'('1')或S的基类型为std_ulogic。这消除了非标准逻辑基本类型的选择(标准逻辑-‘U’、‘X’、‘0’、‘1’、‘Z’、‘W’、‘L’、‘H’、‘Z’、‘W’、‘L’、‘H’、’-’,参见IEEE标准1076-2008 16.7标准多值逻辑包和附录A脚注15,其中提供了到标准逻辑包1164源的链接)

请注意,fru1tbat显示了选项“0”、“1”和其他选项,表达式A(2)、A(1)或A(0)的求值将返回一个标准逻辑子类型,并将为您提供表示相同值(“1”)的多个选项。见IEEE标准1076-1993,8.8第7段:

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

所以case语句不能用VHDL直接表达,我们只对A(2)、A(1)和A(0)为“1”且只允许一个选择的情况感兴趣。相反,我们可以使用条件信号分配语句:

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;
ieee库;
使用ieee.std_logic_1164.all;
实体constexp是
终端实体;
constexp的体系结构foo是
信号A:std_逻辑_向量(2到0):=“001”;
信号Y:标准逻辑向量(1到0);
开始
COND:--条件信号分配语句

我问题中的Verilog代码只是一个常量表达式的例子。我其实并不想用VHDL来重现Verilog代码。虽然这个答案中的例子可以编译,但它们看起来不像使用常量case表达式提供了任何有用的函数。不,不,不可否认,它们没有。因此,我在您的示例中关于
A
的观点需要保持不变。在这种情况下,使用常量作为测试值似乎根本不会产生任何有用的函数。与Verilog或任何其他语言一样,如果您以传统方式使用案例陈述。。。
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;