• systemverilog function的一点小case


    关于function的应用无论是在systemverilog还是verilog中都有很广泛的应用,但是一直有一个模糊的概念困扰着我,今天刚好有时间来搞清楚并记录下来。

    关于fucntion的返回值的问题:

    1. function integer clog2( input logic[255:0] value);
    2. for(clog2 = 0; value>0; clog2= clog2+1)
    3. value = value>>1;
    4. clog2 = clog2-1;
    5. // param = clog2-1;
    6. // return 8;
    7. endfunction
    8. logic[3:0] param;
    9. initial
    10. begin
    11. $display("==========start print sim result============");
    12. $display("clog2 = %b",clog2(256'b1000));
    13. $display("============end print sim result=============");
    14. // $display("param = %b",param);
    15. end

    上述function vcs编译之后打印的结果为:

    1. ==========start print sim result============
    2. clog2 = 00000000000000000000000000000011
    3. ============end print sim result=============

    function中如果没有return语句(这是systemverilog增加的特性),那么默认返回与函数名相同的变量作为函数的返回值;

    如果以下面的方式code:

    1. function integer clog2( input logic[255:0] value);
    2. for(clog2 = 0; value>0; clog2= clog2+1)
    3. value = value>>1;
    4. clog2 = clog2-1;
    5. // param = clog2-1;
    6. return 8;
    7. endfunction
    8. logic[3:0] param;
    9. initial
    10. begin
    11. $display("==========start print sim result============");
    12. $display("clog2 = %b",clog2(256'b1000));
    13. $display("============end print sim result=============");
    14. // $display("param = %b",param);
    15. end

    那么编译之后打印的结果是什么呢?

    1. ==========start print sim result============
    2. clog2 = 00000000000000000000000000001000
    3. ============end print sim result=============

    看到了吧,function会以return语句声明的值作为函数的返回值;

    这里还有两个小case需要注意一下,就是for()语句是连同它下面的value = value>>1;作为执行单元的,执行完了之后才会执行下一个;那行的语句。

    还有这里要另外注意:

    function 返回值的类型:

    void:如果你想调用函数并且忽略它的返回值,可以使用void进行声明函数类型,比如函数只用来打印一些想要的信息:

    1. function void load_array();
    2. int len = 32'b0;
    3. if(len<=0)
    4. begin
    5. $display("bad len");
    6. end
    7. // return;
    8. endfunction
    9. //int arry[];
    10. initial
    11. begin
    12. $display("====================================");
    13. $display("this is the load array function's print");
    14. load_array();
    15. $display("====================================");
    16. //$display("load_array = %d",load_array());
    17. end

    打印结果:

    1. ====================================
    2. this is the load array function's print
    3. bad len
    4. ====================================

    但是你如果把这句解开:

     $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博客

     

  • 相关阅读:
    nginx(六十八)http_proxy模块 nginx与上游的ssl握手
    Linux无文件木马程序渗透测试复现
    2024Selenium自动化常见问题!
    城市区号查询易语言代码
    八股文之springboot
    Lru-k在Rust中的实现及源码解析
    生信教程:多序列比对
    k8s ingress基础
    WiFi蓝牙模块促进传统零售数字化转型:智能零售体验再升级
    docker 常用命令 快捷命令
  • 原文地址:https://blog.csdn.net/dongdongnihao_/article/details/133583010