program與module

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的信號

相關文章
相關標籤/搜索