GHDL中端口名与实体名同名为何触发隐藏警告?
关于GHDL中“declaration of 'gsr' hides entity 'gsr'”警告的解释与问题示例
警告原因
这是VHDL标识符可见性规则和大小写不敏感特性共同导致的:
- 在实体的端口声明上下文里,当前实体的名称(
GSR)属于可见的标识符范围。 - VHDL对标识符大小写不敏感,所以端口名
gsr和实体名GSR会被视为同一个标识符。 - 当你在端口列表中声明
gsr时,这个端口标识符会覆盖(隐藏)外层的实体名称标识符,GHDL的-Whide警告就是在提示你这个命名冲突导致了标识符隐藏。
由于你需要Mock第三方库实体,必须保持实体名和端口名一致,所以这个警告是不可避免的命名规则冲突,但基本不影响简单仿真的运行。
可能引发的问题示例
如果后续代码中需要引用实体的相关属性或关联元素,端口名对实体名的隐藏就会导致编译错误。比如下面的架构代码:
architecture sim of GSR is begin process begin -- 意图:获取实体GSR的实例名称属性 report "Instance name: " & GSR'INSTANCE_NAME; wait; end process; end sim;
这段代码会编译失败,因为此时GSR(大小写不敏感)会被解析为端口gsr,而端口属于信号类型,没有'INSTANCE_NAME这个实体专属的属性。原本想引用实体的属性,结果因为端口名的隐藏,被错误解析为端口,触发属性不存在的错误。
再比如,若实体GSR带有自定义类型定义,你试图通过GSR.my_type引用该类型时,也会被解析为端口gsr,导致类型引用错误。
处理方式
如果必须保留实体名和端口名的一致性,可以:
- 忽略该警告(仅在确认不会引用实体相关属性时);
- 编译时添加
-Wno-hide选项关闭隐藏类警告:ghdl -a -Wno-hide mock.vhd testbench.vhd
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

