目录
1.function/task
1.1 function函数
1.2 task任务及和function的不同点
function和task基本用法一致,但是有几个不同点,在后面阐述。
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的内存,因此修改的外部的值。
方式一:
该方法利用函数init返回一个数组的方法,将该数组拷贝到f5中,若数组容量大,可能会导致运行缓慢
方式二:
该方法利用ref方式直接将f5改变,可以提高性能
任务和函数的用法基本一致,但其相比于函数要更加灵活,有以下不同点:
task mytask1 (output logic [31:0] x, input logic y);
...
endtask