首页 > 其他分享 >sv 变量赋值,参数传递

sv 变量赋值,参数传递

时间:2023-09-25 10:23:25浏览次数:33  
标签:变量 句柄 ca1 sv 参数传递 ca2 拷贝 class 赋值

systemverilog变量赋值,参数传递

1、变量类型

systemverilog中的变量可以分为两种,一种普通变量类型,一种是句柄变量类型。

img

  • 普遍变量跟C/C++中的普通变量一样,而句柄变量则与C/C++中的指针变量或者引用变量类似。
  • 内置类型,比如int,bit,这些类型定义的变量都是普通变量。
  • 自定义的class通过new的方式定义的变量都是句柄变量。

2、变量赋值

  1. 普通变量赋值,直接是拷贝值。
  2. 句柄变量赋值,只是拷贝了句柄,使得两个句柄指向同一个空间。
  3. systemverilog没有拷贝构造函数,所以句柄变量拷贝的时候只是进行了句柄的拷贝,没有进行指向空间的拷贝。为了完成指向空间的拷贝,一般实现的方式是先new一块空间,让后调用copy函数,copy函数实现了拷贝构造函数的功能。
class_A ca1 = new(10);
class_A ca2 = new(12);  // ca2要先new好,分配空间。

ca2.copy(ca1);          // ca2拷贝ca1的数据

3、参数传递

参数传递默认跟变量赋值一样,普通变量拷贝值,句柄变量拷贝句柄。

(1)、ref修饰

如果普通变量想传递句柄到function或task中,可以添加ref修饰,这样传递给function或task的是原变量的句柄(这个时候要求参数必须是变量而不能是字面值)

这种方式跟C/C++中传递引用有点类似,如果传递的数据量比较大的时候,通过这种方式可以避免数据的拷贝,同时通过这种方式还可以将funciton和task的对这个变量的修改传出来。

(2)、input、output、inout

这几种修饰不能和ref修饰同时一起使用,因为这些修饰都是进行值拷贝的方式传递数据的,其中inout是进行了两次值的拷贝,输入的时候一次,输出的时候一次。

class class_A;
    int a;
    function new(int a);
        this.a = a;
    endfunction

    function void getA_ref(ref int a);
        a = this.a;
    endfunction

    function void getA_value(int a);
        a = this.a;
    endfunction

    function void setA(int a);
        this.a = a;
    endfunction

    function int getA();
        return a;
    endfunction

    function void copy(class_A ca);
        this.a = ca.a;
    endfunction
endclass

class class_B;
    class_A ca;
    function new(class_A ca);
        this.ca = ca;
    endfunction

    function int setA(int a);
        ca.setA(a);
    endfunction
endclass

program automatic test;
    initial begin
        class_A ca1;
        class_A ca2;
        class_B cb1;
        int a = 1;
        int b;

        b = a;            // 值拷贝
        b = 2;
        $display(a);    // 因为b是值拷贝,修改b不影响a,所以输出1

        ca1 = new(10);
        ca1.getA_value(a);  // 通过值传递方式获取函数内部值(且没有加output和inout)
        $display(a);            // 输出1,应为函数内部的a是a的一个值拷贝,函数修改不影响函数外的值。

        ca1.getA_ref(a);      // 同ref方式获取返回值。
        $display(a);             // a传递给函数内部的是引用,所以函数内部的修改,等效于修改了函数外的值。所以输出10

        ca2 = ca1;               // ca1为句柄变量,句柄拷贝    
        ca2.setA(20);           // 通过句柄ca2修改内部的域。
        $display(ca1.getA());// 因为ca2是ca1的句柄拷贝,所以ca2修改内部与,相当于修改了ca1的内部域,ca1和ca2指向相同空间。

        cb1 = new(ca1);
        cb1.setA(30);
        $display(ca1.getA());// 输出30,通过非ref的参数传递ca1其实也是传递的是ca1的句柄,所以在函数内修改ca1能够体现到函数外。

        ca2 = new(40);        // 分配一块新的空间,让ca2指向,这个时候ca1和ca2指向了不同的空间。
        $display(ca1.getA());// 输出30
        $display(ca2.getA());  // 输出40
    end
endprogram

标签:变量,句柄,ca1,sv,参数传递,ca2,拷贝,class,赋值
From: https://www.cnblogs.com/yuandonghua/p/17727321.html

相关文章

  • sv fork_join
    forkjoin在systemverilog中可以用fork……join、fork……join_any、fork……join_none来实现多个线程的并发执行。1、父线程、子线程调用fork……join的线程为父线程,fork……join中并发执行的是子线程,子线程可有多个,父线程只有一个。无延时情况下竞争问题:无延时情况下,主......
  • python教程:调用svn status命令对提交的文件进行add状态过滤(只保存新增加的文件)
    需求说明编写一段python程序,用于对svnadd状态的文件进行过滤,并用列表对这些文件进行保存。代码实现以下是一个示例的Python程序,用于对SVN的svnstatus命令中状态为“A”(新增)的文件进行过滤,并将它们存储在一个列表中:importsubprocessdefget_added_files():added_fi......
  • linux教程:centos7安装svn 1.10客户端(subversion指定版本安装)
    repotee/etc/yum.repos.d/wandisco-svn.repo<<-'EOF'[WandiscoSVN]name=WandiscoSVNRepobaseurl=http://opensource.wandisco.com/centos/7/svn-1.10/RPMS/$basearch/enabled=1gpgcheck=0EOF在线安装yumcleanallyuminstall-ysubversion离线安装从如下地址......
  • 【7.0】Pandas csv读写文件
    【一】PythonPandas读取文件当使用Pandas做数据分析的时,需要读取事先准备好的数据集,这是做数据分析的第一步。Panda提供了多种读取数据的方法:read_csv()用于读取文本文件read_json()用于读取json文件read_sql_query()读取sql语句的,【1】CSV文件读......
  • golang 把内容写到 csv 文件或者 xlsx 文件里
    内容来自对chatgpt的咨询csv格式csv格式的文件使用wps或者office打开后是一个excel表格的形式,很容易看到表格里的数据。csv格式跟markdown格式有点像,只需要按照固定的语法放置文本,保存后,用对应的渲染软件打开,就能得到想要的效果。比如下面这段json,用文本编辑器......
  • MySQL赋值操作
    在MySQL中,赋值操作用于将一个值赋给一个变量或者一个字段。赋值操作使用赋值运算符(=)来完成。以下是一些具体的示例说明:赋值给变量:在MySQL中,您可以使用SET语句将一个值赋给一个变量。例如,假设我们要将数字10赋给一个名为num的变量:SET@num=10;在上述示例中,我们使用SET语句......
  • Python处理CSV文件
    python处理CSV文件CSV文件CSV(comma-separatedvalues)文件是一种文本文件格式,允许以表格结构保存数据。这是一种流行的格式,用于从数据库和电子表格导出和导入数据,CSV文件中的每条数据都用逗号(,)分隔,例如,第一行数据可以选择用作标题,标明其下方的每一列数据:处理CSV文件CSV......
  • Eclipse 安装SVN
    https://blog.csdn.net/weixin_49343190/article/details/112518794这个更靠谱https://blog.csdn.net/qq_45305209/article/details/118354171......
  • SVN 学习
    SVNSVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。SVN属于C/S结构软件,分为客户端和服务器端服务端软件:VisualSVN网址:https://www.visualsvn.com/客户端软......
  • SVN服务器安装与常用操作(超详细)
    SVN服务器安装与常用操作(超详细)服务器1、下载SVN服务器,地址:http://subversion.apache.org/packages.html进入网址后,滚动到浏览器最底部看到如下截图:  点击,下载 2、在服务器把下载的VisualSVNserver双击安装,文件名:(VisualSVN-Server-4.3.3-x64.msi) 3、点击Next 选择......