首页 文章

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

提问于
浏览
4

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

my_function_returns_slv(my_record)'length;

**警告:../ src / my.vhd(line#):( vcom-1515)预定义属性“length”的前缀是函数调用“my_function_returns_slv”

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

有用的记录包/解压缩子程序我正在使用:

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

谢谢!

2 回答

  • 2

    直接在函数上使用 '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));
    

    因此,能够避免使用这种封装的警告确认警告首先有点不稳定 .

  • 1

    “我需要长度来创建使用函数输出的信号 . 所以我不能只调用函数输出上的'长度(例如:在保持函数输出的信号上调用'长度),因为它无法声明一个无约束的信号来保持输出 . “

    测量信号大小的有趣方法是:

    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,它允许信号不受约束并从初始化中获得约束 .

相关问题