我调查了这样的代码。例如:
typedef C;
C::T x; //illegal;
typedef C::T c_t; //legal
c_t y;
class C;
typedef int T;
endclass
为什么第一次使用::
是非法的而第二次使用合法的?
SystemVerilog要求必须先知道类型标识符是一种类型,然后才能引用该类型。在此示例源自的1800-2017 LRM第6.18节的开头对此进行了说明。
x
声明的问题是C::T
在那时不是已知类型。
当您将typedef
放在C::T
前面时,解析器知道它必须是一种类型,没有其他有效的选择。
双冒号用于范围解析运算符。它用于访问包中的类和类中的静态数据。
您可以在this reference manual的第14页中找到良好的用法示例。
这是类范围解析运算符。它用于指定在类范围内定义的标识符。因为类和其他作用域可以具有相同的标识符,所以类作用域解析运算符唯一地标识特定类的成员,参数或局部参数。
更多详细信息,请参见IEEE 1800-2017,第8.23类范围解析运算符。