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

时间:2016-09-18 16:15:47

标签: 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] 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):

 ax_trx =  axi_transaction::type_id::create(); 

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

2 个答案:

答案 0 :(得分:2)

使用UVM工厂时,无法向类构造函数添加参数。一般来说,这不是重复使用的OOP编程实践,因为如果你向基类或扩展类添加参数,你必须修改构造类的每个地方。

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

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

答案 1 :(得分:1)

您可以使用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”的详细信息,请参阅以下文章。 https://www.synopsys.com/Services/Documents/hierarchical-testbench-configuration-using-uvm.pdf