SV学习笔记—function函数和task任务

目录

1.function/task

1.1 function函数

1.2 task任务及和function的不同点


1.function/task

function和task基本用法一致,但是有几个不同点,在后面阐述。

1.1 function函数

verilog中的函数必须有返回值并且必须被使用,且函数不能调用任务,sv中允许函数调用任务,前提是调用的任务不消耗时间:

仿真结果:

  

SV中的function函数和C语言中的用法非常相似;

其可以在参数列表中指定输入参数input、引用参数ref(类似于C语言中的指针)(可输入/出),但不可指定输出参数output、输入输出参数inout

可以返回数值或者不返回数值(void),如果调用具有返回值的函数,但没有使用该返回值,应添加void‘()进行转换:void'(some_function());

program example;
    int A;

    initial begin
        $display(“double of %0d is %0d”, 10, double1(10));//20
        print();//test function
        double2(10,A);
        $display(“double of %0d is %0d”, 5, A);//10
    end

    function int double1(input int a);//SV中不指明输入输出默认是输入;不指明类型,默认是logic类型
        return 2*a;
    endfunction

    function void print();//如果该function不返回值,则声明void,()内可不写形参,函数中也可不写return
        $display("test function");
    endfunction

    function int double2(input int a,output int b);//不可用output返回
         A=2*a;
    endfunction

endprogram

仿真结果: 

需要强调的是,若function( )中的形参是是input而不是ref类型,则function内部产生的行为不会对外部产生影响:

program example1;
    int x=3,y=5;
    initial begin
        $display("In main,互换前:x=%0d,y=%0d",x,y);
        swap(x,y);
        $display("In main,互换后:x=%0d,y=%0d",x,y);
    end

    function swap(input int x,input int y);
        int temp;
        $display("In funtion,互换前:x=%0d,y=%0d",x,y);
        temp=x;
        x=y;
        y=temp;
         $display("In function,互换后:x=%0d,y=%0d",x,y);
    endfunction
endprogram

仿真结果如下: 

 

 可见在函数内部x,y互换,但由于函数在运行时将实参单向传递给形参,因此函数内部的结果并不会影响外部。

如果将input改成ref类型:

program example2;
    int x=3,y=5;
    initial begin
        $display("In main,互换前:x=%0d,y=%0d",x,y);
        swap(x,y);
        $display("In main,互换后:x=%0d,y=%0d",x,y);
    end

    function swap(ref int x,ref int y);
        int temp;
        $display("In funtion,互换前:x=%0d,y=%0d",x,y);
        temp=x;
        x=y;
        y=temp;
         $display("In function,互换后:x=%0d,y=%0d",x,y);
    endfunction
endprogram

仿真结果如下: 

可见由于ref相当于指针的作用,函数直接作用于x,y的内存,因此修改的外部的值。

1.1.1从函数中返回数组

方式一: 

该方法利用函数init返回一个数组的方法,将该数组拷贝到f5中,若数组容量大,可能会导致运行缓慢 

 方式二:

 该方法利用ref方式直接将f5改变,可以提高性能

1.2 task任务及和function的不同点

任务和函数的用法基本一致,但其相比于函数要更加灵活,有以下不同点:

  1. function可以通过return返回结果;而task无法通过return返回结果,因此只能通过output、inout或者ref的参数来返回
  2. task内可以置入耗时语句,而function则不能。常见的耗时语句包括@event、 wait event、# delay等
  3. function和task均可调用function;而task只可被task调用,而不可被function调用(如果task里有耗时语句)
  4. function如果不用return返回值则要声明void,如果用return返回值则需要声明返回什么类型的值;而task并不用声明返回什么类型的值

task mytask1 (output logic [31:0] x, input logic y);
...
endtask
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值