《UVM实战》第六章 v内容
时间: 2025-07-21 15:00:06 浏览: 1
<think>我们正在讨论《UVM实战》第六章关于virtual sequence的内容。根据之前的讨论,virtual sequence是作为协调多个真实sequence的调度器,而virtual sequencer则是一个包含指向真实sequencer指针的路由中心。以下将详细解释这一机制。
### 1. Virtual Sequence的作用
Virtual sequence本身不产生transaction,而是控制多个真实sequence的执行顺序和同步。它通过`uvm_do_on`宏将事务定向到特定的sequencer上。例如:
```systemverilog
class mcdf_virtual_sequence extends uvm_sequence;
`uvm_object_utils(mcdf_virtual_sequence)
`uvm_declare_p_sequencer(mcdf_virtual_sequencer) // 声明p_sequencer类型
task body();
axi_sequence axi_seq;
apb_sequence apb_seq;
// 在AXI sequencer上启动AXI sequence
`uvm_do_on(axi_seq, p_sequencer.axi_seqr)
// 在APB sequencer上启动APB sequence
`uvm_do_on(apb_seq, p_sequencer.apb_seqr)
endtask
endclass
```
这里,`p_sequencer`是virtual sequencer的句柄,通过`uvm_declare_p_sequencer`宏声明后,就可以访问virtual sequencer中的各个真实sequencer指针(如`axi_seqr`, `apb_seqr`)[^1]。
### 2. Virtual Sequencer的结构
Virtual sequencer是一个组件(派生自`uvm_sequencer`),但它不连接任何driver,仅包含指向真实sequencer的指针。例如:
```systemverilog
class mcdf_virtual_sequencer extends uvm_sequencer;
// 声明指向真实sequencer的指针
axi_sequencer axi_seqr;
apb_sequencer apb_seqr;
`uvm_component_utils(mcdf_virtual_sequencer)
...
endclass
```
### 3. 连接机制
在测试平台中,virtual sequencer的指针需要在`connect_phase`中与真实sequencer连接。例如,在test类中:
```systemverilog
class mcdf_test extends uvm_test;
mcdf_virtual_sequencer virt_seqr;
axi_sequencer axi_seqr;
apb_sequencer apb_seqr;
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
// 将virtual sequencer的指针指向真实的sequencer
virt_seqr.axi_seqr = axi_seqr;
virt_seqr.apb_seqr = apb_seqr;
endfunction
endclass
```
这样,virtual sequence中通过`p_sequencer.axi_seqr`就能访问到真实的AXI sequencer[^1][^3]。
### 4. 启动Virtual Sequence
在test的`run_phase`中,启动virtual sequence:
```systemverilog
task mcdf_test::run_phase(uvm_phase phase);
mcdf_virtual_sequence vseq = new("vseq");
phase.raise_objection(this);
vseq.start(virt_seqr); // 将virtual sequence挂载到virtual sequencer上
phase.drop_objection(this);
endtask
```
这里,`start()`方法的第一个参数指定了virtual sequence运行的sequencer(即virtual sequencer)[^2]。
### 5. 同步机制
如果需要在多个sequence间同步(例如等待AXI sequence完成后再启动APB sequence),可以使用事件(event)或旗语(semaphore)。例如:
```systemverilog
class mcdf_virtual_sequence;
event axi_done; // 同步事件
task body();
axi_sequence axi_seq;
apb_sequence apb_seq;
fork
begin
`uvm_do_on(axi_seq, p_sequencer.axi_seqr)
-> axi_done; // AXI sequence完成时触发事件
end
begin
@(axi_done); // 等待事件
`uvm_do_on(apb_seq, p_sequencer.apb_seqr)
end
join
endtask
endclass
```
### 总结
- **Virtual Sequence**:协调中心,通过`uvm_do_on`控制事务流向[^1]。
- **Virtual Sequencer**:路由中心,包含真实sequencer的指针[^3]。
- **连接**:在test的`connect_phase`中完成指针赋值[^1]。
- **启动**:在test的`run_phase`中用`start()`启动virtual sequence[^2]。
- **同步**:使用事件或旗语实现sequence间同步[^3]。
此架构实现了测试场景与物理sequencer的解耦,提高了测试平台的复用性和可维护性。
§§相关问题§§
1. 如何在virtual sequence中实现AXI和APB sequence的精确时序同步?
2. virtual sequencer的指针连接在UVM测试平台中如何实现?
3. `uvm_do_on`宏和普通`uvm_do`宏有何本质区别?
4. 在virtual sequence中如何处理不同sequence之间的资源冲突?</think>### 《UVM实战》第六章 Virtual Sequence 内容详解
Virtual Sequence 是 UVM 中协调多接口验证场景的核心机制,其核心思想是通过**虚拟调度器**控制多个物理 sequence 的执行。以下是关键要点:
#### 1. **核心架构**
```mermaid
graph TD
Test[Test Case] --> VirtualSeq[Virtual Sequence]
VirtualSeq --> VirtualSqr[Virtual Sequencer]
VirtualSqr --> RealSqrA[真实 Sequencer A]
VirtualSqr --> RealSqrB[真实 Sequencer B]
RealSqrA --> RealSeqA[真实 Sequence A]
RealSqrB --> RealSeqB[真实 Sequence B]
RealSeqA --> DriverA[Driver A]
RealSeqB --> DriverB[Driver B]
```
#### 2. **核心组件功能**
| 组件 | 特性 | 代码关键点 |
|------|------|------------|
| **Virtual Sequence**<br>(调度中心) | • 不产生事务<br>• 控制执行流程<br>• 实现多sequence同步 | `uvm_declare_p_sequencer()` 声明类型[^1]<br>`uvm_do_on(seq, p_sequencer.target_sqr)` 定向启动[^3] |
| **Virtual Sequencer**<br>(路由中心) | • 纯容器组件<br>• 仅含指针<br>• 无TLM接口 | 声明指针:<br>`axi_sequencer axi_sqr;`<br>`apb_sequencer apb_sqr;`[^4] |
| **真实 Sequencer** | • 参数化类<br>• 连接对应driver | 定义:<br>`class axi_sequencer extends uvm_sequencer #(axi_tx);`[^4] |
#### 3. **连接机制实现**
在 `test` 层完成指针绑定(`connect_phase`):
```systemverilog
class mcdf_test extends uvm_test;
virtual_sequencer v_sqr;
axi_sequencer axi_sqr;
apb_sequencer apb_sqr;
function void connect_phase(uvm_phase phase);
v_sqr.axi_sqr = axi_sqr; // 绑定AXI指针
v_sqr.apb_sqr = apb_sqr; // 绑定APB指针
endfunction
endclass
```
> 通过 `p_sequencer` 回溯访问:
> ```systemverilog
> // 在virtual sequence中
> `uvm_do_on(axi_seq, p_sequencer.axi_sqr) // 访问真实sequencer[^1][^3]
> ```
#### 4. **启动流程**
```systemverilog
task test::run_phase(uvm_phase phase);
mcdf_virtual_seq vseq = new("vseq");
phase.raise_objection(this);
vseq.start(v_sqr); // 挂载到virtual sequencer[^2]
phase.drop_objection(this);
endtask
```
> `start()` 参数解析:
> ```systemverilog
> virtual task start(
> uvm_sequencer_base sequencer, // 目标sequencer
> uvm_sequence_base parent = null, // 父sequence
> int priority = -1, // 优先级
> bit call_pre_post = 1 // 预处理标志
> );[^2]
> ```
#### 5. **同步机制**
避免全局变量,采用事件同步:
```systemverilog
class sync_vseq extends uvm_sequence;
event apb_done;
task body();
fork
`uvm_do_on(axi_seq, p_sequencer.axi_sqr)
begin
`uvm_do_on(apb_seq, p_sequencer.apb_sqr)
-> apb_done; // 触发同步事件
end
join_none
wait(apb_done.triggered); // 等待事件
endtask
endclass
```
#### 6. **关键优势
- **解耦性**:测试场景与物理接口分离
- **复用性**:相同真实sequence可组合不同虚拟场景
- **可控性**:精确协调多接口时序[^3]
- **可维护性**:新增接口只需扩展virtual sequencer指针
> 完整示例参见《UVM实战》6.3节 "Virtual Sequence实现案例"。
阅读全文
相关推荐


















