System verilog SystemVerilog-如何使用初始化编写构造函数?

System verilog SystemVerilog-如何使用初始化编写构造函数?,system-verilog,uvm,System Verilog,Uvm,我有以下交易: typedef enum {READ = 0, WRITE = 1} direction_enum; //Transaction class axi_transaction extends uvm_sequence_item(); bit id = 0; //const bit [31:0] addr; bit [2:0] size = 0'b100;//const direction_enum rw; bit [31:0] transfer

我有以下交易:

typedef enum {READ = 0, WRITE = 1} direction_enum;

//Transaction

class axi_transaction extends uvm_sequence_item();
   bit id = 0;  //const
   bit [31:0] addr;
   bit [2:0]  size = 0'b100;//const
   direction_enum rw;
   bit [31:0] transfers [$];



   //factory registration
   `uvm_object_utils_begin(axi_transaction)
   `uvm_field_int(id, UVM_ALL_ON)
   `uvm_field_int(addr, UVM_ALL_ON)
   `uvm_field_int(size, UVM_ALL_ON)
   `uvm_field_enum(rw, UVM_ALL_ON)
   `uvm_field_int(transfers, UVM_ALL_ON)      
   `uvm_object_utils_end  

   //constructor
   function new(string name = "axi_transaction");
      super.new(name);
   endfunction: new

endclass: axi_transaction
我想扩展这个新函数,这样我就可以用参数按顺序初始化事务,这些参数通过以下方式初始化一些事务成员(如addr、transfer):


如何编写事务的构造函数以及如何从sequencer初始化事务?

使用UVM工厂时,不能向类构造函数添加参数。一般来说,对于重用来说,这不是一个好的OOP编程实践,因为如果要向基类或扩展类添加参数,则必须修改构建该类的每个位置

更好的选择是使用uvm_config_db或设置构建对象后所需的各个字段

ax_trx =  axi_transaction::type_id::create(); 
ax_trx.addr = some_address
ax_trx.transfers = '{word1,word2,word3};

使用UVM工厂时,不能向类构造函数添加参数。一般来说,对于重用来说,这不是一个好的OOP编程实践,因为如果要向基类或扩展类添加参数,则必须修改构建该类的每个位置

更好的选择是使用uvm_config_db或设置构建对象后所需的各个字段

ax_trx =  axi_transaction::type_id::create(); 
ax_trx.addr = some_address
ax_trx.transfers = '{word1,word2,word3};

您可以使用uvm_config_db类进行初始化

可以使用以下语法设置该值。然后您可以在该类的构造函数中获得该值

uvm_config_db#(int)::set(this,“my_subblock_a”,“max_cycles”,max_cycles)
uvm_config_db#(int)::get(this,“”, “max_cycles”,max_cycles)
有关“uvm_config_db”的更多信息,请参阅以下文章。

您可以使用uvm\u config\u db类进行初始化

可以使用以下语法设置该值。然后您可以在该类的构造函数中获得该值

uvm_config_db#(int)::set(this,“my_subblock_a”,“max_cycles”,max_cycles)
uvm_config_db#(int)::get(this,“”, “max_cycles”,max_cycles)
有关“uvm_config_db”的更多信息,请参阅以下文章。

@dave_59-你能给我举个例子吗?我不明白你关于构造函数参数不是好的OOP编程实践的观点。当然,添加新参数会破坏用户代码,但通过配置数据库传递内容或直接设置变量也是如此。如果类的依赖项发生变化,则没有变通方法来修改客户端代码。继承和多态性的要点是能够扩展对象的功能,而不会干扰使用这些扩展对象的代码。创建事务也是如此。我们将这些参数放入事务中,并根据需要扩展事务,而不是使用具有长参数列表的方法。@dave_59-我是uvm_config_db的新手。例如,你能解释一下我应该如何通过uvm_config_db将队列从序列传递到事务吗?我认为对你来说,最简单的事情是在创建对象后设置各个字段。我已经更新了我的答案。@dave_59-你能给我举个例子吗?我不明白你关于构造函数参数不是好的OOP编程实践的观点。当然,添加新参数会破坏用户代码,但通过配置数据库传递内容或直接设置变量也是如此。如果类的依赖项发生变化,则没有变通方法来修改客户端代码。继承和多态性的要点是能够扩展对象的功能,而不会干扰使用这些扩展对象的代码。创建事务也是如此。我们将这些参数放入事务中,并根据需要扩展事务,而不是使用具有长参数列表的方法。@dave_59-我是uvm_config_db的新手。例如,你能解释一下我应该如何通过uvm_config_db将队列从序列传递到事务吗?我认为对你来说,最简单的事情是在创建对象后设置各个字段。我已经更新了我的答案。根据这篇论文,“得到”应该是。我在构造函数中没有看到任何“get”。get和“set”方法是uvm_config_db类的静态方法。您可以在任何地方使用“get”方法,只要require变量是用“set”方法设置的,根据本文,“get”应该是。我在构造函数中没有看到任何“get”。get和“set”方法是uvm_config_db类的静态方法。您可以在任何地方使用“get”方法,只要require变量是用“set”方法设置的