2016-09-18 109 views
0

我有以下交易:SystemVerilog-如何用初始化编写构造函数?

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 

我想扩展新的功能,这样我就可以通过初始化一些交易会员的参数(如地址,转移)初始化序列中的交易:

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

如何编写事务的构造函数,以及如何初始化顺序器中的事务?

回答

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

@ dave_59-你能举个例子吗? – sara8d

+1

我不明白构造函数参数不是很好的OOP编程实践。当然,添加新的参数会破坏用户代码,但通过配置数据库传递内容或直接设置变量也是一样。如果类的依赖性发生变化,那么修改客户端代码没有解决方法。 –

+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

+1

。我在构造函数中没有看到任何“get”。 – sara8d

+1

“get”和“set”方法是uvm_config_db类的静态方法。你可以在任何地方使用“get”方法,只要require变量用“set”方法设置即可 –