Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
System verilog UVM:将序列拆分到不同的子序列器上_System Verilog_Uvm - Fatal编程技术网

System verilog UVM:将序列拆分到不同的子序列器上

System verilog UVM:将序列拆分到不同的子序列器上,system-verilog,uvm,System Verilog,Uvm,在DUT上,我有两个通道,每个通道由一个数据接口和一个边带接口组成。沿这些通道发送的事务必须按顺序进行,但一个通道可能会暂停,而另一个通道会赶上。即: 我在通道0下发送事务A,在通道1下发送事务C,但在通道0接收到事务B之前,通道1不会接受事务C 此外,每个通道上的数据接口可能比边带接口慢,并且某些边带事务不需要与它们一起发送数据 目前,设置测试的目的是创建单个数据和边带序列,将它们放入队列中,然后将队列拆分为通道数并发送它们。然而,随着通道接口的变化和每个配置的通道数量的变化,这一点变得难以维

在DUT上,我有两个通道,每个通道由一个数据接口和一个边带接口组成。沿这些通道发送的事务必须按顺序进行,但一个通道可能会暂停,而另一个通道会赶上。即: 我在通道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);
这种方法的问题是,我不希望一个通道阻塞另一个通道,或者一个接口阻塞另一个通道,除非这两个通道都被延迟。如果我使用如上所述的虚拟序列,当我想将
发送数据\u序列
管道传输到另一个通道时,
打开数据\u流\u序列
可能会为该单独通道暂停,或者它可能会在边带接口上暂停,但我想将
发送数据\u序列
数据事务管道传输到同一通道的数据接口上


然而,我正在努力找出如何实现子序列之间的仲裁。我考虑过序列分层和FIFO的使用,只有当所有接口都在中间层饱和时才会暂停。有没有我遗漏的任何UVM技巧?

我不完全理解你的拖延条件是什么,但我可以告诉你的是,无论如何情况都会很复杂

您编写的代码将以线性方式执行,但您描述的是并行行为。您可以并行启动所有序列,并根据事件阻止或释放驱动序列。这些事件将非常特定于您的应用程序:

fork
  'uvm_do(open_data_stream_sequence);

  begin
    @(unblock_channel_0);
    'uvm_do_with(send_data_sequence, {send_data_sequence.packet_number == 0;});
  end

  // ...

  begin
    @(done_e);
    'uvm_do(close_data_stream_sequence);
  end
join

我不认为有一种方法可以绕过编写一些代码来理解当前的通道状态,并以最优的方式安排事情(或者如果测试需要,可以故意不优化)。例如,当数据通道暂停时,为了允许没有数据的边带请求通过数据请求,您必须进行一定量的排队

这仍然可以封装在基类虚拟序列中,让我们称之为“调度器”,以这样一种方式,刺激对其实现是不受影响的。调度程序将具有一个“启动序列”API,该API在通道的序列器上启动给定序列,或将其排队,以便在通道未暂停时立即启动该序列。测试编写者可以为他想要编写的每个顶级序列子类“scheduler”,并将其放入“start_sequence(data0);start_sequence(data1);start_sequence(sideband0);”调用中,其中每个dataN/sidebandM虚拟序列看起来都与您在问题中描述的一样


“启动序列”应立即返回以允许通道完全饱和,或在所有通道饱和时阻塞以减少不必要的排队。

该代码将同时启动打开的数据流并关闭数据流序列,可能在打开之前关闭它——这可能不好。我想他是想并行运行多个开放数据序列,而不是并行运行序列的各个部分。是的,你在这里,我更新了答案。基本上你在你的(队列)中所建议的,我设想的是这样的事件(即队列逻辑触发事件)。