Vhdl 定义常量时的函数调用是否有效?

Vhdl 定义常量时的函数调用是否有效?,vhdl,Vhdl,关于另一个,我试图制作一个切片器,它可以声明范围不断扩大的常量。下面的代码似乎具有正确的功能,但操作似乎不稳定 编译器确实给出了警告: (vcom-1515)预定义属性“range”的前缀是函数调用“ifRange” 引用带有属性“range”的常量似乎不稳定,而“left”和“right”工作正常 这是有效的VHDL吗?还有其他方法可以达到同样的效果吗 library ieee; use ieee.std_logic_1164.all; package RangePack is impu

关于另一个,我试图制作一个切片器,它可以声明范围不断扩大的常量。下面的代码似乎具有正确的功能,但操作似乎不稳定

编译器确实给出了警告:

(vcom-1515)预定义属性“range”的前缀是函数调用“ifRange”

引用带有属性“range”的常量似乎不稳定,而“left”和“right”工作正常

这是有效的VHDL吗?还有其他方法可以达到同样的效果吗

library ieee;
use ieee.std_logic_1164.all;

package RangePack is
  impure function ifRange(a     : integer;
                          reset : boolean := false)
    return std_logic_vector;

  type tProtectedInteger is protected
    impure function Get return integer;
    procedure Set(a : in integer);
    procedure Add(a : in integer);
  end protected tProtectedInteger;

end package RangePack;

package body RangePack is

  type tProtectedInteger is protected
    body
      variable vInteger : integer := 0;
    impure function Get return integer is
    begin
      return vInteger;
    end function Get;

  procedure Set(a : in integer) is
  begin
    vInteger := a;
  end procedure Set;

  procedure Add(a : in integer) is
  begin
    vInteger := vInteger + a;
  end procedure Add;

end protected body tProtectedInteger;

shared variable svOffset : tProtectedInteger;

impure function ifRange(a     : integer;
                        reset : boolean := false)
  return std_logic_vector is
  variable vDummy  : std_logic_vector(63 downto 0);
  variable vOffset : integer;
begin
  if(reset) then
    svOffset.Set(0);
  end if;
  vOffset := svOffset.Get;
  svOffset.Add(a);
  return vDummy(vOffset+a-1 downto vOffset);
end ifRange;

end package body RangePack;

library ieee;
use ieee.std_logic_1164.all;
use work.RangePack.all;

entity tb is
end entity tb;

architecture sim of tb is

  constant cB : std_logic_vector(ifRange(8, reset => true)'range) := (others => '1');
  constant cA : std_logic_vector(ifRange(4)'range) := (others => '0');

  signal sVector : std_logic_vector(11 downto 0) := x"CA7";

  signal sA : std_logic_vector(3 downto 0);
  signal sB : std_logic_vector(7 downto 0);

begin

 -- works
  sA <= sVector(cA'left downto cA'right);
  sB <= sVector(cB'left downto cB'right);

  --does't work
  --sA <= sVector(cA'range);
  --sB <= sVector(cB'range);

end architecture sim;
ieee库;
使用ieee.std_logic_1164.all;
包RangePack是
不纯函数ifRange(a:整数;
重置:布尔值:=false)
返回标准逻辑向量;
类型tProtectedInteger受保护
不纯函数得到返回整数;
程序集(a:整数);
程序加法(a:整数);
端部保护的tProtectedInteger;
端包装;
包体RangePack是
类型tProtectedInteger受保护
身体
变量维整数:整数:=0;
不纯函数Get返回整数为
开始
回程葡萄酒蒸馏器;
端函数Get;
过程集(a:整数)为
开始
维特格:=a;
结束程序集;
程序Add(a:整数)为
开始
维特格:=维特格+a;
结束程序添加;
端部保护体t保护集成电路;
共享变量svOffset:tProtectedInteger;
不纯函数ifRange(a:整数;
重置:布尔值:=false)
返回标准逻辑向量为
变量vDummy:std_逻辑_向量(63到0);
变量vOffset:整数;
开始
如果(重置)则
svOffset.Set(0);
如果结束;
vOffset:=svOffset.Get;
增加(a);
返回vDummy(vOffset+a-1向下至vOffset);
终点范围;
端包体范围包;
图书馆ieee;
使用ieee.std_logic_1164.all;
使用work.RangePack.all;
实体结核是
最终实体结核病;
tb-is的sim体系结构
常数cB:std_逻辑_向量(ifRange(8,reset=>true)范围):=(其他=>1');
常数cA:std_逻辑_向量(ifRange(4)范围):=(其他=>'0');
信号向量:标准逻辑向量(11到0):=x“CA7”;
信号sA:std_逻辑_向量(3到0);
信号sB:std_逻辑_向量(7到0);
开始
--工作

sA另一种方法可能是为字段宽度定义一个常量,并从中为字宽度定义一个常量,从而避免使用受保护的类型。此处似乎不需要使用受保护类型。您的作业<代码>--不起作用,因为这是合法的VHDL。IEEE标准1076-2008 16.2.3阵列的预定义属性A'范围[(N)]前缀:适用于数组对象或其别名的前缀,或表示其索引范围由约束定义的数组子类型的前缀。VHDL中没有定义警告,合法手段无错误。合法性可在详细阐述时确定。解决警告的一种方法是创建两个函数分别返回两个边界。也就是说,不要依赖“带有前缀的范围谁的合法性只能在运行时确定……我认为警告不是由注释掉的部分引起的,而是由以下原因引起的:例如,
ifRange(8,reset=>true)
范围。这里,
'range
属性的前缀是函数调用。但是“操作不稳定”是什么意思?是的,正如标题所说,问题是关于常数定义部分。“不稳定”是指使用“范围”,如注释掉的部分。类似地,“范围”的各种使用也会导致运行时错误。错误消息清楚地表明范围失控,如“左侧13到2不是-200到99的一部分”。。。几乎每次引用“范围”时,模拟器都会调用该函数。您是否向我们展示了所有代码?我看不到范围从13到2…另一种方法可能是为字段宽度定义一个常量,并从中为字宽度定义一个常量,避免使用受保护的类型。此处似乎不需要使用受保护类型。您的作业<代码>--不起作用,因为这是合法的VHDL。IEEE标准1076-2008 16.2.3阵列的预定义属性A'范围[(N)]前缀:适用于数组对象或其别名的前缀,或表示其索引范围由约束定义的数组子类型的前缀。VHDL中没有定义警告,合法手段无错误。合法性可在详细阐述时确定。解决警告的一种方法是创建两个函数分别返回两个边界。也就是说,不要依赖“带有前缀的范围谁的合法性只能在运行时确定……我认为警告不是由注释掉的部分引起的,而是由以下原因引起的:例如,
ifRange(8,reset=>true)
范围。这里,
'range
属性的前缀是函数调用。但是“操作不稳定”是什么意思?是的,正如标题所说,问题是关于常数定义部分。“不稳定”是指使用“范围”,如注释掉的部分。类似地,“范围”的各种使用也会导致运行时错误。错误消息清楚地表明范围失控,如“左侧13到2不是-200到99的一部分”。。。几乎每次引用“范围”时,模拟器都会调用该函数。您是否向我们展示了所有代码?我看不到范围从13到2。。。