【发布时间】:2014-09-25 09:29:34
【问题描述】:
在 DUT 上,我有两个通道,每个通道由一个数据接口和一个边带接口组成。沿着这些通道发送的事务必须按顺序发送,但一个通道可能会在另一个通道赶上时停止。 IE: 我在通道 0 下发送交易 A,在通道 1 下发送交易 C,但在通道 0 收到交易 B 之前,通道 1 不会接受交易 C。
此外,每个通道上的数据接口可能比边带接口慢,并且某些边带事务不需要与它们一起发送数据。
目前设置测试以创建单独的数据和边带序列,将它们放入队列中,然后将队列拆分为多个通道并发送它们。然而,随着通道上的接口变化和每个配置的通道数量不同,这变得难以维护。所以理想情况下,我想编写测试序列,使其不知道有多少通道或抽象事务需要哪些接口的数据。
顶部序列应该只生成这样的序列:
'uvm_do(open_data_stream_sequence);
'uvm_do_with(send_data_sequence, {send_data_sequence.packet_number == 0;});
'uvm_do_with(send_data_sequence, {send_data_sequence.packet_number == 1;});
'uvm_do_with(send_data_sequence, {send_data_sequence.packet_number == 2;});
'uvm_do_with(send_data_sequence, {send_data_sequence.packet_number == 3;});
'uvm_do(close_data_stream_sequence);
这种方法的问题是我不希望一个通道阻塞另一个通道或一个接口阻塞另一个,除非两者都被阻止。如果我使用像上面这样的虚拟序列,当我想将send_data_sequence 流水线化到另一个通道时,open_data_stream_sequence 可能会停止该单独的通道,或者它可能会在边带接口上停止,但我想流水线化 send_data_sequence 数据交易到同一个通道的数据接口。
但是,我正在努力弄清楚如何在子序列器之间实施仲裁。我考虑过序列分层和使用fifos,仅当所有接口都在一种中间层饱和时才停止。我是否缺少任何 UVM 技巧?
【问题讨论】:
标签: system-verilog uvm