如何在常数中设置案例语句中的分支?错误:选择必须是局部静态表达式



verilog允许案例语句的分支定义为其他文件中的常数。示例:

`define COND1 3'b001
`define COND2 3'b010
`define COND3 3'b100
module xyz(input wire [2:0] select, output reg value);
    always @* 
    case(select)
    `COND1: value = 1'b0;
    `COND2: value = 1'b1;
    `COND3: value = 1'b0;
    default: value = 1'b0;
endmodule

我该如何在VHDL中执行相同的操作?我想为包装中定义的案例定义,并将这些常数拉到当前体系结构中,并使用常数将其定义为案例语句的分支。工作示例:

library ieee;
use ieee.std_logic_1164.all;
entity stuff is
   port(
       sel1: in std_logic_vector(2 downto 0);
       val1:  out std_logic
   );
end entity;
architecture rtl of stuff is
    constant COND1 : std_logic_vector(2 downto 0) := "001";
    constant COND2 : std_logic_vector(2 downto 0) := "010";
    constant COND3 : std_logic_vector(2 downto 0) := "100";
begin
    process(sel1) 
    begin 
        case sel1 is
        when COND1 => val1 <= '0';
        when COND2 => val1 <= '1';
        when COND3 => val1 <= '0';
        when others => val1 <= '0';
        end case;
    end process;
end architecture;

哪个工作正常...

但是,当我在VHDL代码中尝试它时,我会遇到一个奇怪的错误:

..simtoolsghdlbinghdl.exe -a stuff2.vhdl
stuff2.vhdl:40:18: choice must be locally static expression   
stuff2.vhdl:41:18: choice must be locally static expression
stuff2.vhdl:42:18: choice must be locally static expression

这是给出此错误的代码:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity stuff is
    generic(
        CW : integer := 3
    );
    port(    
        sel1 : in    std_logic_vector(CW-1 downto 0);
        val1 : out   std_logic
    );
end entity;
architecture rtl of stuff is
    function n(n_value:integer; n_width:integer) 
        return std_logic_vector is
    begin
        return std_logic_vector(to_unsigned(n_value, n_width));
    end function;
    constant CMD1 : std_logic_vector(2 downto 0) := n(0, 3);
    constant CMD2 : std_logic_vector(2 downto 0) := n(1, 3);
    constant CMD3 : std_logic_vector(2 downto 0) := n(2, 3);
    constant CMD4 : std_logic_vector(2 downto 0) := n(3, 3);
    constant CMD5 : std_logic_vector(2 downto 0) := n(4, 3);
    signal sel2 : std_logic_vector(2 downto 0);
begin
    sel2 <= sel1(2 downto 0);
    process(sel2)
    begin
        case sel2 is
            when CMD1   => val1 <= '0';     
            when CMD2   => val1 <= '1';     
            when CMD3   => val1 <= '0';     
            when others => val1 <= '0';     
        end case;
    end process;
end architecture;

凯文·克鲁斯(Kevin Kruse(的答案取决于-2008:

9.4.2本地静态原始

当表达式中的每个运算符表示一个隐式定义的操作员或在包装之一中定义的操作员STD_LOGIC_1164,numeric_bit,numeric_std,numeric_bit_bit_unsigned或numeric_std_unsigned在库IEEE IEEE以及IF库中,以及If thumeric_bit,以及If if sTD_LOGIC_1164,以及IFNUMERIC_BIT,numeric_bit,numeric_bit,numeric_bit,numeric_bit,numeric_bit,numeric_bit,numeric_bit,以及表达式中的每一个主要都是局部静态的主要原理,其中将局部静态主要定义为以下一个:

...
e(函数名称的函数调用表示隐式定义的操作或在软件包之一中定义的操作std_logic_1164,numeric_bit,numeric_bit,numeric_bit,numeric_bit_unsigned或numeric_std_unsign of在库中且其实际参数是局部静态的静态参数

尚未实现GHDL-0.36。否则,凯文的答案对于完全符合-2008的本地静态原则似乎有效。

在较早的修订中,由于函数n或to_unsigned的返回值,常数值表达式不是局部静态的。

请参见-2002或更早的7.4.2全球静态原则(9.4.3-2008(" i(函数呼叫的函数名称表示纯函数,其实际参数每个是全球静态表达式"也是全球静态的。

-2008更改添加IEEE软件包中的称为函数,不允许其函数声明和功能更改,允许它们作为本地静态视为局部静态,并由软件包源的版权许可项控制。

对于标准标准的-2008或更早的修订版,可以定义CMD1-4的数值,然后将SEL(2向下0(转换为本地静态整数子类型值:

>
architecture rtl of stuff is
    constant CMD1:  natural range 0 to 7 := 0;  -- "000"
    constant CMD2:  natural range 0 to 7 := 1;  -- "001"
    constant CMD3:  natural range 0 to 7 := 2;  -- "010"
    constant CMD4:  natural range 0 to 7 := 3;  -- "011"
    constant CMD5:  natural range 0 to 7 := 4;  -- "100"
    signal sel2:    natural range 0 to 7;  -- locally static subtype
begin
    sel2 <= to_integer(unsigned(sel1(2 downto 0)));
    process (sel2)
    begin
        case sel2 is
            when CMD1   => val1 <= '0';
            when CMD2   => val1 <= '1';
            when CMD3   => val1 <= '0';
            when others => val1 <= '0';
        end case;
    end process;
end architecture;

但是问题的第一个VHDL示例最紧密地实现了Verilog片段。

可以使用固定切片进行解码的SEL1的全球静态范围,这需要SEL2的声明为情况表达式提供局部静态亚型:

architecture equiv_w_generic_sel1 of stuff is
    constant COND1:  std_logic_vector (2 downto 0) := "000";
    constant COND2:  std_logic_vector (2 downto 0) := "001";
    constant COND3:  std_logic_vector (2 downto 0) := "010";
    signal sel2:     std_logic_vector (2 downto 0);
begin
    sel2 <= sel1(sel2'range);  -- locally static subtype
    process (sel2)
    begin
        case sel2 is
            when COND1  => val1 <= '0';
            when COND2  => val1 <= '1';
            when COND3  => val1 <= '0';
            when others => val1 <= '0';
        end case;
    end process;
end architecture;

如果您不使用非静态静态函数调用来重新定义问题,并且也不需要使用条款来提供包装numeric_std声明的可见性。请注意,cond1,cond2和cond3常数与Verilog片段一样具有局部静态值表达式。

用或不带有GHDL的-std = 08的上述两个体系结构分析。


请注意,该问题中显示的GHDL显示的命令行并未指定VHDL修订版和GHDL默认值为-STD = 93C,该= 93C提供了放宽的合规性匹配模型IMM对标准的-1993修订版的实现。

div class =" ans">

您对函数的使用n使常数的值不是本地静态的。

如果用std_logic_vector(to_unsigned(0, 3))替换n(0, 3),它将起作用。或者,如您已经显示的那样,将其替换为"000"

相关内容

  • 没有找到相关文章