关于function的应用无论是在systemverilog还是verilog中都有很广泛的应用,但是一直有一个模糊的概念困扰着我,今天刚好有时间来搞清楚并记录下来。
关于fucntion的返回值的问题:
- function integer clog2( input logic[255:0] value);
- for(clog2 = 0; value>0; clog2= clog2+1)
- value = value>>1;
- clog2 = clog2-1;
- // param = clog2-1;
- // return 8;
- endfunction
- logic[3:0] param;
- initial
- begin
- $display("==========start print sim result============");
- $display("clog2 = %b",clog2(256'b1000));
- $display("============end print sim result=============");
- // $display("param = %b",param);
- end
上述function vcs编译之后打印的结果为:
- ==========start print sim result============
- clog2 = 00000000000000000000000000000011
- ============end print sim result=============
function中如果没有return语句(这是systemverilog增加的特性),那么默认返回与函数名相同的变量作为函数的返回值;
如果以下面的方式code:
- function integer clog2( input logic[255:0] value);
- for(clog2 = 0; value>0; clog2= clog2+1)
- value = value>>1;
- clog2 = clog2-1;
- // param = clog2-1;
- return 8;
- endfunction
- logic[3:0] param;
- initial
- begin
- $display("==========start print sim result============");
- $display("clog2 = %b",clog2(256'b1000));
- $display("============end print sim result=============");
- // $display("param = %b",param);
- end
那么编译之后打印的结果是什么呢?
- ==========start print sim result============
- clog2 = 00000000000000000000000000001000
- ============end print sim result=============
看到了吧,function会以return语句声明的值作为函数的返回值;
这里还有两个小case需要注意一下,就是for()语句是连同它下面的value = value>>1;作为执行单元的,执行完了之后才会执行下一个;那行的语句。
还有这里要另外注意:
function 返回值的类型:
void:如果你想调用函数并且忽略它的返回值,可以使用void进行声明函数类型,比如函数只用来打印一些想要的信息:
- function void load_array();
- int len = 32'b0;
- if(len<=0)
- begin
- $display("bad len");
- end
- // return;
- endfunction
- //int arry[];
- initial
- begin
- $display("====================================");
- $display("this is the load array function's print");
- load_array();
- $display("====================================");
- //$display("load_array = %d",load_array());
- end
打印结果:
- ====================================
- this is the load array function's print
- bad len
- ====================================
但是你如果把这句解开:
$display("load_array = %d",load_array());
那就会报错了,因为这里使用了load_array()的返回值,但是void函数是没有返回值的。
报错:
Void functions cannot be used in contexts which require return values
函数类型还有logic,int,static,automatic,数组,结构体等等类型;
Systemverilog中static、automatic区别_automatic变量-CSDN博客