• program与module


    program,各方面与module都类似,其中声明的变量在program中都可见

      生命周期也是static类型的,

    program的结束,也是需要等待其中的所有initial块都执行结束

      与module最大的不同是,program中的时间都是在reactive的区域中执行的

      所以如果clock块写在program中,非阻塞赋值,都先发生在program中的Re_NBA中

      program中的信号的toggle变化,都是在module之后的,且当拍可以看见module中信号的变化。

    共发断言也可以在program中,但是不推荐,

    (concurrent assertion,采样都是在prepone中,evalution在reactive区域。

      其中的property的断言用program中的信号。)

    program中不能例化module,interface,其他program,不能包含always模块

      可以包含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的信号

  • 相关阅读:
    prefixspan python
    python avro 数据格式使用demo
    UEBA 学术界研究现状——用户行为异常检测思路:序列挖掘prefixspan,HMM,LSTM/CNN,SVM异常检测,聚类CURE算法
    Dropout, DropConnect ——一个对输出,一个对输入
    成都Uber优步司机奖励政策(4月12日)
    北京Uber优步司机奖励政策(4月12日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(4月12日)
    MYSQL--慢查询,卡死等处理
    记boost在gcc的一个库链接问题generic_category()
    Linux生成core文件、core文件路径设置
  • 原文地址:https://www.cnblogs.com/-9-8/p/8884275.html
Copyright © 2020-2023  润新知