如何为VHDL自定义记录类型定义自定义属性'depth'
解决VHDL自定义记录类型的'depth'属性定义问题
你遇到的错误原因很明确:CustomRecord是包含非限定signed类型成员的记录类型,类型本身并没有固定的S'length值——S的宽度只有在实例化具体对象(比如信号X)时才会确定。直接对记录类型CustomRecord引用.S成员并取长度,VHDL编译器是不允许的,所以才会报“record type 'CustomRecord' cannot be selected”。
正确的实现方式
要实现用X'depth替代X.S'length的需求,你需要把自定义属性绑定到具体的记录对象(比如信号X),而不是记录类型本身:
- 先声明自定义属性:
attribute depth : integer;
- 在实例化信号
X后,为该信号绑定depth属性,值为X.S'length:
signal X : CustomRecord(S(21 downto 0)); attribute depth of X : signal is X.S'length;
- 之后就可以用
X'depth简化信号Y的声明:
signal Y : CustomRecord(S(X'depth downto 0));
针对复杂场景的扩展(你提到的signed数组成员)
如果你的X.S是signed数组类型,只需要调整属性绑定的取值逻辑即可,比如根据数组维度取对应长度:
-- 假设X.S是二维signed数组,取第一维度的长度作为depth attribute depth of X : signal is X.S'length(1);
之后同样可以用X'depth简化复杂的声明表达式。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

