zoukankan      html  css  js  c++  java
  • SV中的task和function

    SV中class的properties和methods默认都是public的,但是可以声明为local和protected。

    一个properties声明为local类型的,则只在该class中的methods可以调用该变量。即使subclass也不可以调用。

    local interger i;

    一个properties或者methods声明为protected,与local类似,但是在subclass中可见。

    extern protected virtual automatic task_name();

    SV中的Task和Function不需要,必须加一个begin..end来指明body,但是需要加入标识符。

                     task    muliple_line;

                               ......body...

                     endtask :multiple_line

    子功能模块(funciton)在执行到子程序的最后一行就返回,将返回值赋给与功能同名的变量,也可以显式的调用return来返回。

    在function中不能再声明一个同名的var,会造成冲突。

    task内部是不会返回值的,但是也可以调用return,但是不带返回值。program直接显示调用return。

    数组变量到function的传递,通过ref模块或者直接数组变量(数据量会比较大)

    SV中module和program,package的子程序默认是静态存储的,当需要动态存储时,仍然需要显式的用automatic显式指出。(class中默认是automatic的)

    SV对task和function的参数声明做了优化,声明需要方向声明和类型声明;参数传递可以按port名称对应,也可以按顺序对应。

    子程序中的参数缺省值是input logic或者与同一task/function前一个参数的类型相同。大小可以指定默认值或者参数传递时赋值。

    verilog对子程序参数的处理是,在进入子程序时,将input和inout的值赋值给子程序本地变量,在子程序返回时将output和

            inout的值赋值给模块中的变量。SV中增加了一种方式ref,指定为引用而不是复制。这种方式只能用在automatic的子程序中,这种参数的好处是在子程序中

            修改变量对调用它的模块随时可见。

            task  bus_read(input  logic [31:0] addr,  ref logic [31:0]data);                initial     fork

                          bus.request = 1'b1;                                                                               bus_read(addr,data);

                          @(posedge bus.grant)  bus.addr =addr;                                                  thread2:  begin          //使用ref类型传递data,这样不需

                          @(posedge bus.enable)  data = bus.data;                                                                 @data;    //要等到bus_read进程结束,

                          .......                                                                                                                      $display; //thread2便可以看见data的变化

            endtask:bus_read                                                                                                             end

                                                                                                                                   join

    SV新增的系统函数

    elaborate时的函数:

    1)$typeof(data_type), 判断某个data或者expression的类型

       bit [12:0] A_bus, B_bus;

       parameter type bus_t = $typeof(A_bus);

       generate

        case ($typeof(bus_t))

          $typeof(bit[12:0]): addfixed_int #(bus_t) (A_bus, B_bus);

          $typeof(real): add_float #($typeof(A_bus)) (A_bus, B_bus);

          endcase

       endgenerate

    关于array的:

    1)$size(), 表示array的元素个数

    2)$left()/$low(), 表示array的最小元素索引

    3)$right()/$high(), 表示array的最大元素索引

    4)$dimensions, 表示array的维数

  • 相关阅读:
    SCOI2003 字符串折叠
    UVA1629 Cake slicing
    POI2008 KLO-Building blocks
    NOI导刊2010提高 符文之语
    MongoDB数据库的基本操作
    React Naive 解决防止多次点击的解决方法
    如何自定义修改博客园样式
    语法对照表ES5VSES6
    MongoDB数据库安装
    小程序学习2 常用小程序概念以及代码实现
  • 原文地址:https://www.cnblogs.com/-9-8/p/4421548.html
Copyright © 2011-2022 走看看