System verilog UVM虚拟音序器:选择正确的子音序器
我有一个关于UVM中虚拟音序器的问题。假设我有N个相等的接口,由N个相等的驱动程序驱动,每个驱动程序连接到自己的sequencer。我想做的是进行如下交易:System verilog UVM虚拟音序器:选择正确的子音序器,system-verilog,uvm,System Verilog,Uvm,我有一个关于UVM中虚拟音序器的问题。假设我有N个相等的接口,由N个相等的驱动程序驱动,每个驱动程序连接到自己的sequencer。我想做的是进行如下交易: class my_transaction extends uvm_sequence_item; logic data; int num_if; endclass 当使用'uvm_do()执行时,将发送到驱动程序编号num_if。我的想法是,对于这种工作,我需要一个虚拟的序列器,它可以将事
class my_transaction extends uvm_sequence_item;
logic data;
int num_if;
endclass
当使用'uvm_do()执行时,将发送到驱动程序编号num_if。我的想法是,对于这种工作,我需要一个虚拟的序列器,它可以将事务“转发”到正确的序列器(num_if)。
是这样吗?如果是,如何做?
谢谢。关于虚拟音序器,你说得对。我将向您展示一个如何做的想法(所有的伪代码,您必须自己处理细节) 假设我们有一个虚拟定序器,其中包含所有总线定序器的阵列:
class virtual_seqr extends uvm_sequencer;
my_sequencer seqrs[10];
endclass
我们假设这些句柄被正确地传递。在我们的虚拟序列中,我们可以创建一个事务,将其随机化,然后将其发送到适当的序列器
class some_virtual_sequence extends uvm_sequence;
`uvm_declare_p_sequencer(virtual_seqr)
task body();
my_transaction trans = my_transaction::type_id::create("my_transaction");
my_transaction.randomize();
start_item (my_transaction, , p_sequencer.seqrs[my_transaction.num_if]);
finish_item(my_transaction);
endtask
endclass
我们不能使用
uvm\u do
,因为它不知道在哪里调度。我们也不能使用uvm_do_on
,因为num_if
字段必须在知道将项目发送到何处之前进行随机分配。虽然Tudor的答案在技术上可行,但从概念上讲,决定在哪个接口上运行(num_if)的值不应该属于事务,而是属于调用它的序列(这当然也应该是随机的)。交易应该只包含从a到B的值的表示以及该协议的传输方式。a和B的规范通常不属于交易的责任范围
在这种情况下,您的事务和都铎序列的变化如下所示:
class my_transaction extends uvm_sequence_item;
rand logic data;
endclass
…和
class some_virtual_sequence extends uvm_sequence;
`uvm_declare_p_sequencer(virtual_seqr)
rand int num_if; constraint.....
task body();
my_transaction trans = my_transaction::type_id::create("my_transaction");
start_item(trans, , p_sequencer.seqrs[num_if]);
trans.randomize(); // randomization should be done after start_item()
finish_item(trans);
endtask
endclass
…在虚拟音序器上运行,正如都铎所说:
class virtual_seqr extends uvm_sequencer;
my_sequencer seqrs[10];
endclass
上述方法还允许在正确的位置进行随机化:在start\u item()返回之后,在调用完成序列项的finish\u item()之前。我也同意
num\u if
参数不属于“总线”事务项。