SystemVerilog中的类范围解析运算符(::)和“extern”

假设有一个类“packet”,它含有一个static属性(或方法)“my_packet”,然后就可以从类外部访问使用类范围解析运算符(::)访问。
packet::my_packet  
需要注意的是“.”访问的是隶属于某个对象实例的成员,而“::”访问的是隶属于这个类的成员。
例如有一个类型为my_class的对象实例“mc” 。
mc.my_x访问的是对象实例的成员my_x;
my_class::my_x访问的是类的成员my_x;
class packet; bit [31:0] addr; //non-static var static bit [31:0] id; //static var typedef enum {red, green, blue} rgb; //typedef enum is static by default extern static function void display (int a, b); endclass static function void packet::display (int a, b); $display(packet values a=%0d b=%0d,a,b); endfunction class eth_packet extends packet; function new; packet::addr = 'hff; // can access non-static members in derived class $display(packet addr = %h, packet::addr); endfunction endclass module sro_class; packet::rgb r1; //scope resolution operator for typedef int id=10; initial begin packet p; eth_packet ep; p = new( ); ep = new ( ); $cast(r1,1); $display(%s,r1); packet::id = 20; packet::display(packet::id, id); //packet::addr = 'hf; //compile error //can't access non-static members outside the class end endmodule  
仿真log:
packet addr = 000000ffgreenpacket values a=20 b=10 v c s s i m u l a t i o n r e p o r t  
在上面的例子中,类 “packet” 中包含non-static属性(“addr”)和static属性 (“id”) 。
从仿真log可以看出可以在扩展类“eth_packet”内使用类范围解析运算符(::)访问非static属性 (“addr”)
而在类的外部访问非static属性 (“addr”)就会导致编译错误。
packet::addr = 'hff;  
编译错误:
error-[sv-irtav] illegal reference to automatic variabletestbench.sv, 34$unit::addrhierarchical reference to automatic variable 'addr' is not legal.  
默认情况下,除了可以使用类范围解析运算符(::)访问静态属性和静态方法,还可以访问
– static properties– static methods– typedefs– enumeration– structures– unions  
另外,这个类范围解析运算符(::)的作用可以只需要在类中定义方法的模版,具体的实现可以在类的外部:
class packet; //function prototype extern static function void display (int a, b);endclass //function body outside the class static function void packet :: display (int a, b); $display(packet values a=%0d b=%0d,a, b); endfunction  
这个extern方法可以访问类中的一些属性声明。


2020年TWS蓝牙耳机销量增长近90%,推动蓝牙耳机细分市场的全球销量
华米AMAZFIT米动手环2高清图赏
新能源车电池管理系统BMS快速原型开发平台
泰星5号卫星参数表
防爆激光探测器的特点
SystemVerilog中的类范围解析运算符(::)和“extern”
用NVIDIA DGX cuQuantum设备实现超级计算规模的量子电路仿真
发动机启停技术能省油吗_发动机启停技术到底伤不伤车
HALFCD 是什么?其优点是什么?
飞兆半导体推出音频插孔检测和配置开关FSA8008
兆易创新推出GD32V系列,RISC-V内核32位通用MCU新品
关于连接的问答:处理 WI-FI 前端的热挑战
小米MAX2发布会正式开始:小米MAX2发布会直播地址、直播平台奉上,和雷军一起见证奇迹
一款防水模块化四轴飞行器无人机,适用于各种商业和工业应用
iphone8什么时候上市?iphone8即将发布:外观已基本确定,价格上涨但搭载更多黑科技的iPhone8你买不买?
免动手摄影 眨眼时便按下快门
AI助力Photoshop
自带后备电源的便携显示器diy图解
掉电保护在嵌入式系统中的设计应用
5G在技术终端和业务等层面给社会带来了巨大的变化