System verilog 系统Verilog:ref类成员 可能有一个引用作为类成员,就像C++一样。然而 covergroup smurf_car_covergroup(ref smurf_transaction tx) ; covpt_tx_direction_TURN_LEFT : coverpoint tx.tx_direction { bins left[] = {[ENUM_C_LEFT_TURN:ENUM_C_LEFT_TURN] } ; } endgroup class smurf_coverage_container extends smurf_coverage_object; ref smurf_transaction m_ref_smurf_transaction ; function new(string name, ref smurf_transaction) ; m_ref_smurf_transaction=smurf_transaction ; super.new(smurf_transaction) ; // does the following: // // m_smurf_bicycle_covergroup //= new(smurf_transaction) ; // etc endfunction : new function void smurf_sample() ; // important if (m_ref_smurf_transaction.is_bicycle() ) m_smurf_bicycle_covergroup.sample () ; if (m_ref_smurf_transaction . is_car () ) m_smurf_car_covergroup .sample () ; endfunction : smurf_sample endclass : smurf_coverage_container

System verilog 系统Verilog:ref类成员 可能有一个引用作为类成员,就像C++一样。然而 covergroup smurf_car_covergroup(ref smurf_transaction tx) ; covpt_tx_direction_TURN_LEFT : coverpoint tx.tx_direction { bins left[] = {[ENUM_C_LEFT_TURN:ENUM_C_LEFT_TURN] } ; } endgroup class smurf_coverage_container extends smurf_coverage_object; ref smurf_transaction m_ref_smurf_transaction ; function new(string name, ref smurf_transaction) ; m_ref_smurf_transaction=smurf_transaction ; super.new(smurf_transaction) ; // does the following: // // m_smurf_bicycle_covergroup //= new(smurf_transaction) ; // etc endfunction : new function void smurf_sample() ; // important if (m_ref_smurf_transaction.is_bicycle() ) m_smurf_bicycle_covergroup.sample () ; if (m_ref_smurf_transaction . is_car () ) m_smurf_car_covergroup .sample () ; endfunction : smurf_sample endclass : smurf_coverage_container,system-verilog,hdl,System Verilog,Hdl,这不起作用,因为ref不允许应用于类字段-编译器抱怨以下verilog源代码有语法问题:NNN:token is smurf_transaction 显然,保持一个引用,以便当另一个类将其句柄分配给一个新对象时,采样对象会自动更新,这在技术上是可能的,那么什么样的语法会产生这种效果呢 注意:由于编码准则和常识,我无法向示例方法添加参数。ref关键字仅作为连接类型应用于任务或函数中的参数。类变量声明中不需要允许它,因为类变量始终是对类对象的引用。看我的 ref参数是通过引用传递的变量。这种类型的参

这不起作用,因为ref不允许应用于类字段-编译器抱怨以下verilog源代码有语法问题:NNN:token is smurf_transaction

显然,保持一个引用,以便当另一个类将其句柄分配给一个新对象时,采样对象会自动更新,这在技术上是可能的,那么什么样的语法会产生这种效果呢

注意:由于编码准则和常识,我无法向示例方法添加参数。

ref关键字仅作为连接类型应用于任务或函数中的参数。类变量声明中不需要允许它,因为类变量始终是对类对象的引用。看我的

ref参数是通过引用传递的变量。这种类型的参数不是副本,而是对原始变量的引用。在本例中,是类的对象

通过引用传递的参数不会复制到子例程区域,而是将对原始参数的引用传递给子例程。然后,子例程可以通过引用访问参数数据

摘自[IEEE标准1800-2012]第13.5.2节


因此,不需要对类变量使用ref。您可以直接传递类的对象。

与java一样,“类”类型的每个变量都已经是引用。这并不能回答问题。类变量是对象的句柄-指针。指针本身的值不是一个引用,而是一个实际的存储器。在任务中,可以在单独的线程中更新任务的整数ref参数时传递时间。同样的原则可以也应该适用于指向对象的指针。所以你的推理是无效的,不正确。类变量可以保存表示对象句柄的值。在有人对该变量赋值之前,它不引用null。请参阅非序列号。句柄意味着存储。ref没有。句柄暗示对象的构造是正确的。但是分配给类变量的值不是该对象的实际图像/存储,它只是指向该存储所在位置的指针。在C++中,您将使用SurffTyx*MyRefSmifFuffType,但在SystemVerilog中,总是隐含*,并且没有隐含的形式。