我有以下交易:
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初始化事务?
答案 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