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

     

  • 相关阅读:
    【酒店管理系统】(一)需求分析
    公司电脑屏幕录制软件有什么功能
    驱动开发:内核RIP劫持实现DLL注入
    MySQL(8) 优化、MySQL8、常用命令
    IntelliJ IDEA 2022.2 正式发布:已完全支持 Spring 6 和 Spring Boot 3
    Flutter NestedScrollView 、SliverAppBar全解析,悬浮菜单的应用
    竞赛 深度学习 机器视觉 车位识别车道线检测 - python opencv
    GBase 8a数据集成之Kerberos认证
    安全知识普及:什么是垃圾邮件和网络钓鱼欺诈
    为什么我要迁移 SpringBoot 到函数计算
  • 原文地址:https://blog.csdn.net/dongdongnihao_/article/details/133583010