program,各方面與module都相似,其中聲明的變量在program中均可見,react
生命週期也是static類型的,express
program的結束,也是須要等待其中的全部initial塊都執行結束。函數
與module最大的不一樣是,program中的時間都是在reactive的區域中執行的。netty
因此若是clock塊寫在program中,非阻塞賦值,都先發生在program中的Re_NBA中。code
program中的信號的toggle變化,都是在module以後的,且當拍能夠看見module中信號的變化。生命週期
共發斷言也能夠在program中,可是不推薦,get
(concurrent assertion,採樣都是在prepone中,evalution在reactive區域。input
其中的property的斷言用program中的信號。)編譯器
program中不能例化module,interface,其餘program,不能包含always模塊。it
能夠包含initial final等。
module中不能調用program中的function,task,
program中能夠調用module中的function,task,此時在program中,task的執行時間片也是在reactive中。
program中特有的控制task,$exit(),exit函數的調用,必須在initial塊中,不然不起做用。
module的聲明有兩種方式:
1) non-ANSI, module_name (port_list);
parameter_declaration_list
port_direction_and_size_declarations
port_type_declarations
2)ANSI,module_name #(para_port_list) (port_direction_and_type_list)
module generic_fifo(clk, read, write, reset, out, full, empty);
parameter MSB=3, LSB=0,DEPTH=4;
endmodule
module generic_fifo #(parameter MSB=3, LSB=0, DEPTH=4) (input wire [MSB:LSB] in,
)
endmodule
module中,能夠聲明function,task,
interface,program,
assertion,assign,checker,clocking,
initial,final,always,generate,
module中還能夠聲明module,這樣的小module,稱爲nest module,與wrap的module scope相同,能夠訪問其中的任何變量。
只是作logic上的區分。
module還能夠聲明extern,來作分步或者partial的編譯,extern module的聲明,包括extern關鍵字,module name,module的list port。
extern module m(a,b,c,d); //以後定義該module的時候,port聲明能夠省略,inst鏈接可使用通配符,.*
module m (.*);
endmodule
module top ();
m mm(.*);
endmodule
module的port,能夠鏈接一個interface,event,var,net,array,或者struct,union。
若是direction,被省略,SV默認爲inout;
若是port kind,被省略,SV默認爲`default_nettye類型定義,能夠是wire,tri等。
若是data type,被省略,SV默認爲logic,除了interconnect類型port。
module中的hier引用,可使用a.b.c來表示,沒法區分root層與地下某一層這樣的hier。
也能夠經過$root.a.b.c來表示最頂層的hier。
module例化時的信號鏈接,有三種方法:
1) module alu_accum1 () //按order來進行鏈接
alu u_alu (alu_out, , ain, bin, opcode); //在逗號之間空格表示該值使用module內部的default value、
endmodule
2) module alu_accum1 () //按name來進行鏈接
alu u_alu (.alu_out(alu_out), .zero(), .ain(ain), .bin(bin), .opcode(opcode)); // .zero()表示使用module內部的default value,
endmodule
隱式的name鏈接,要求port_name與expression的name相同,只保留port_name便可。
module alu_accum1 ()
alu u_alu (.alu_out, .zero(), .ain, .bin, .opcode); // .zero()表示使用module內部的default value,
endmodule
3) module alu_accum1() //按.*的匹配來進行鏈接,自動鏈接name相同的port,剩下的單獨鏈接
alu u_alu (.*, .zero()); // .zero()表示使用module內部的default value,
endmodule
bind結構能夠將一個或多個module,interface,program,checker,例化在一個module中。
bind結構有兩種:
1) bind target_scope :instance_list bind_module_inst;
編譯器會在scope指定的範圍內,找齊instance_list,而後將bind_module的inst插入到target_scope的末尾進行例化,不然就在全部的inst中都插入bind_module。
2) bind target_inst bind_mdule_inst;
編譯器直接將bind_module的inst插入到target_inst中。
bind cpu fpu_props fpu_rules_1(
.a1 (a),
.b1 (b1));
表示將program fpu_props例化在全部的cpu的instance中,例化的名字叫fpu_rules_1,內部信號的鏈接是
program fpu_props中的a1信號,鏈接到a信號。
指定cpu inst, bind cpu:cpu1,cpu2 fpu_props fpu_rules_1(.a(a), .b(b));
bind的這個預編譯命令,能夠寫在module,interface,或者compilation-unit scope中。bind中的port鏈接,能夠直接經過相對的hier path來鏈接底層module的信號。