Systemverilog作為面向?qū)ο蟮木幊陶Z言,很多特性參考Java,CPP。
作用域解析運(yùn)算符(Class scope resolution operator) :: :用于顯式的對標(biāo)識符identifier的命名空間namespace做出解析。
Systemverilog中的形式:class_type :: { class_type :: } identifier
常見歸類如下:
包packet的使用,如import packets::*
內(nèi)建類調(diào)用函數(shù),如process::self;內(nèi)建packet調(diào)用函數(shù),如std::randomize()
class endclass內(nèi)部聲明,外部定義function constraint,需要通過class_name::指定。
在class外部,對常量parameter localparam的引用。(parameter localparam為elaboration-time賦值,const為run-time賦值,常量constans為 read only)
對 靜態(tài)變量static variable 靜態(tài)方法static method 的調(diào)用
對靜態(tài)成員static member的調(diào)用,如typedef創(chuàng)建新類型,enmu枚舉變量
調(diào)用randomize with {}時使用local::identifier對重名的標(biāo)識符做出區(qū)分
派生類內(nèi)部訪問父類的public變量和方法
covergroup coverpoint cross的使用
如下示例:
package?SEASONS_PKG;
???typedef?enum?{SPRING,SUMMER,AUTUMN,WINTER}?seasons_t;
endpackage
package?TEST_PKG;
import?SEASONS_PKG::*;
class?SEED;
???rand?int?seed;
???constraint?seed_value;
endclass
constraint?SEED::seed_value?{
???seed?inside?{[0:100]};
}
//class?Packet?#(localparam?NAME?=?"DEFAULT_PKT");?//?not?work
class?Packet?#(parameter?NAME?=?"DEFAULT_PKT");
???localparam?NUMBER?=?100;
???localparam?WIDTH??=?32;
???static?string?id;
???enum?{RED,BLUE,GREEN}?COLOR_e;
???typedef?bit?[15:0]?b16;
???const?int?seed;
???bit?[WIDTH-1:0]?value?=?1;
???struct?packed?{
??????bit?[31:16]?head;
??????bit?[15:?0]?data;
???}?frame_s;
???SEED?m_seed;
???function?new();
??????seed?=?100;
??????m_seed?=?new();
??????void'(std::randomize(frame_s)?with?{frame_s.head?inside{1,3,5};frame_s.data?inside?{2,4,6};});
???endfunction
???extern?static?function?void?show_id();
???extern?function?int?get_seed();
???extern?function?bit?[WIDTH-1:0]?get_value();?
endclass
static?function?void?Packet::show_id();
???$display("class?Packet?ID:%s",id);
endfunction
function?int?Packet::get_seed();
???void'(m_seed.randomize()?with?{seed?==?local::seed;});
???return?m_seed.seed;
endfunction
function?bit?[Packet::WIDTH-1:0]?Packet::get_value();
????return?value;
endfunction
class?Packet_e?extends?Packet;
???static?function?void?get_number();
??????$display("Packet?number:%0d",Packet::NUMBER);
???endfunction
???function?void?get_value();
??????//$display("Packet?value:%0d",value);
??????$display("Packet?value:%0d",Packet::value);
???endfunction
???function?void?get_seed();
??????//$display("Packet_e?seed:%0d",get_seed());
??????$display("Packet_e?seed:%0d",Packet::get_seed());
???endfunction
endclass?
endpackage
module?test();
???import?TEST_PKG::*;
???Packet#("DATA_PKT")?pkt;
???initial?begin
??????Packet#()::id?=?"PKT_1";
??????Packet#()::show_id();?//?class?Packet?ID:PKT_1
??????Packet#("DATA_PKT")::show_id();?//?class?Packet?ID:
??????pkt?=?new();
??????$display("frame_s?:?%p",pkt.frame_s);?//?frame_s?:?'{head:'h3,?data:'h6}
??????$display("name:%s",pkt.NAME);?//?name:DATA_PKT
??????$display("name:%s",Packet#("CTRL_PKT")::NAME);?//?name:CTRL_PKT
??????$display("number:%0d",Packet#()::NUMBER);?//?number:100
??????$display("COLOR_e:%s",Packet#()::GREEN);?//?COLOR_e:GREEN
??????$display("seed:%0d",pkt.get_seed());?//?seed:100
??????$display("value:%0d",pkt.get_value());?//?value:1
???end
???initial?begin
??????SEASONS_PKG::seasons_t?seasons_e;
??????#1ns;
??????$display("seasons_e:%s",seasons_e.name());?//?seasons_e:SPRING
??????seasons_e?=?SEASONS_PKG::WINTER;
??????$display("seasons_e:%s",seasons_e.name());?//?seasons_e:WINTER
???end
???initial?begin
??????Packet#()::b16?val?=?16'hABCD;
??????#2ns;
??????$display("val:%0h,type:%s,bits:%0d",val,$typename(val),$bits(val));?//?val:abcd,type:bit[15:0],bits:16
???end
???initial?begin
??????Packet_e?pkt_e;
??????#3ns;
??????Packet_e::get_number();?//?Packet?number:100
??????pkt_e?=?new();
??????pkt_e.get_value();?//?Packet?value:1
??????pkt_e.get_seed();?//?Packet_e?seed:100
???end?
????process?proc;
????initial?begin
????????proc?=?process::self();
????????$display("process?status:%s",proc.status());?//?process?status:RUNNING
????end
endmodule
參數(shù)化的類
class Packet是一個參數(shù)化的類parameterized class,使用時需要調(diào)用#對generic class 進(jìn)行specialization獲得一個concrete type的類 ,否則報(bào)warning。Packet#()使用default值。
每一個concrete type的類,內(nèi)部的靜態(tài)成員都是相互獨(dú)立的。如上述示例的 line 94,打印為空。
localparamlocalparam相比parameter,只能用于class module內(nèi)部。而parameter可以用于class module的參數(shù)化聲明。
new()
