在 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);
这种方法的问题是我不希望一个通道阻塞另一个或一个接口阻塞另一个,除非两者都被阻止。如果我使用像上面这样的虚拟序列,open_data_stream_sequence
当我想将数据传输到另一个通道时,该单个通道可能会停止,send_data_sequence
或者它可能会在边带接口上停止,但我想将send_data_sequence
数据事务传输到同一通道的数据接口。
但是,我正在努力弄清楚如何在子序列器之间实施仲裁。我考虑过序列分层和使用fifos,仅当所有接口都在一种中间层饱和时才停止。我缺少什么 UVM 技巧吗?