验证环境需要对数据进行分层。例如,将32比特的寄存器读写封装成数据读写和状态读写等实际业务操作等或者对底层sequence进行一些随机控制等。实现这种分层可以有两种方式:
1、Sequence layer,在sequencer内部(sequence)中进行分层,无需分别创建 high-layer sequencer和 low-layer sequencer。
2、Virtual sequence,在sequencer外部进行分层,例如使用virtual sequencer。
实际项目中,一般两种分层的手段都会采用。对于一个底层的数据项
lower_env_items定义如下:
底层的seuquence能够将 lower_env_item数据项驱动给DUT
这时候如果我们有了更high level的数据项upper_env_item驱动需求,该数据项是包含多个lower_env_item的数组:
在这种请求下可以使用第一种分层方式,在high-layer sequence中依然使用low-layer sequencer进行驱动,同时对low-layer sequence进行更加精细化的控制。
![](https://aijishu.com/img/bV5NP)
class upper_env_item_seq extends uvm_sequence #(lower_env_item);
... // Constructor and UVM automa
tion macros
upper_env_item u_item; // Contains an array of lower_env_items
task body();
// Create a upper-level item.
`uvm_create(u_item)
...// Randomize it here with appropriate constraints.
for(int i = 0 ; i< u_item.num_items; i++)
`uvm_send(u_item.item
)
endtask : body
endclass: upper_env_item_seq
在上面的例子中,我们随机生成了包含多个lower_env_item的数组
upper_env_item_seq,然后分别进行发送。
同样一个例子,我们也可以使用多个sequencer(high-layer sequencer和low-layer sequencer),如下图所示。
![](https://aijishu.com/img/bV5NQ)
每一个sequence都有一个对应的sequencer。在实际中使用一个sequencer可以完成的事情肯定不会再创建另外一个sequencer,因为sequencer属于静态的UVM组件,属于平台型的内容,不可能每一个用例都需要创建一个sequencer。
这里的例外就是virtual sequencer,因为某些high-layer sequence需要协调多个low-layer sequencer进行工作,无法仅使用一个单一的sequencer进行驱动。