VHDL - 为什么直接在函数上使用长度属性会产生警告?

VHDL - Why does using the length attribute directly on a function produce a warning?

我有一个 VHDL 函数,它 returns 一个 std_logic_vector 记录表示,我想要那个 std_logic_vector 的长度。我可以直接在函数上使用长度属性。为什么这会在 ModelSim 中产生警告?我是在邀请微妙的问题吗?谷歌搜索警告文本没有发现任何我认为有用的东西。

my_function_returns_slv(my_record)'length;

** Warning: ../src/my.vhd(line#): (vcom-1515) Prefix of predefined attribute "length" is function call "my_function_returns_slv"

我已经通过连接记录元素的 std_logic_vector 表示将函数写入 assemble 输出。记录的长度在编译时是固定的,但我不想硬编码长度。我需要长度来创建使用函数输出的信号。所以我不能只在函数的输出上调用 'length(例如:在保存函数输出的信号上调用 'length),因为不可能声明一个不受约束的信号来保存输出。我可以编写一个类似的函数来计算 std_logic_vector 的长度,但这会添加一些重要的代码,尤其是对于我拥有的记录数。我应该接受 ModelSim 警告并继续吗?我是否应该处理从编写函数到 assemble 我记录的位宽的额外代码?有更好的解决方案吗?

有用的记录 pack/unpack 我正在使用的子程序:

http://www.eda-twiki.org/twiki/pub/P1076/RecordReflectionToSlv/standard_functions.vhd

谢谢!

直接在函数上使用'length属性可以看作是函数结果的另一部分而不是主要输出,因此从概念的角度来看应该没有错。

所以我会接受 ModelSim 警告,但也将其视为该工具担心构造的指示,因此我会检查我的其他工具,例如综合工具和代码检查器,接受直接在函数调用上使用属性。

看来您可以通过创建如下函数来避免 ModelSim 警告:

function len(slv : std_logic_vector) return natural is
begin
  return slv'length;
end function;

然后这不会导致 ModelSim 警告:

signal MY_LEN : natural := len(slv_not(CONST));

所以能够使用这种封装避免警告确认警告首先有点不稳定。

"I need the length to create signals for using the function output. So I can't just call 'length on the output of the function (ex: call 'length on a signal holding the function output) because it is not possible to declare an unconstrained signal to hold the output."

调整信号大小的一个有趣的解决方法是:

constant MY_CONST : std_logic_vector := my_function_returns_slv(my_record) ;
signal MySig : std_logic_vector(MY_CONST'range) := MY_CONST ; 

我们有一个 VHDL-2017 的 LCS,它允许信号不受约束并从初始化中获得它们的约束。