我对UVM中的虚拟音序器有疑问。让我们认为我有N个相等的接口由N个相等的驱动器驱动,每个驱动器连接到它自己的定序器。我想做的是进行如下交易:
class my_transaction extends uvm_sequence_item;
logic data;
int num_if;
endclass
用`uvm_do()执行时发送到驱动程序号num_if。我的想法是,对于这种工作,我需要一个虚拟音序器,以及#34;前进"到正确的音序器的事务(号码num_if)。 这是正确的吗?如果是的话,怎么做? 感谢。
答案 0 :(得分:4)
虽然Tudor的答案在技术上起作用,但概念上决定运行哪个接口(num_if)是一个不属于事务的值,而是属于调用它的序列(当然也应该随机化) )。事务应该只包含从A到B传播的值的表示以及它为该协议传播的方式。 的规范,其中A和B 通常不在交易的责任范围内。
在这种情况下,您的交易和Tudor序列的变体将如下所示:
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
..正如Tudor所说,在虚拟音序器上运行:
class virtual_seqr extends uvm_sequencer;
my_sequencer seqrs[10];
endclass
上述方法还允许随机化发生在正确的位置:start_item()返回后,紧接在调用finish_item()之前完成序列项。
答案 1 :(得分:2)
您对虚拟音序器的看法正确。我将向您展示如何做到这一点(所有伪代码,您必须自己处理细节)。
我们假设我们有一个虚拟音序器,其中包含所有总线音序器的数组:
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_do
,因为它不知道在哪里发送。我们也无法使用uvm_do_on
,因为num_if
字段必须先进行随机化才能知道将项目发送到何处。