uvm中发送sequence的start和uvm_do的区别
时间: 2023-10-04 18:08:05 浏览: 617
在UVM中,当我们想要执行一个sequence时,我们可以使用`start`或`uvm_do`方法。这两种方法的区别如下:
1. `start`方法:这个方法启动了一个新的进程,它是非阻塞的。这意味着`start`方法将立即返回,而不会等待sequence完成。这允许我们同时启动多个sequence,它们可以并发运行。另外,`start`方法还接受一个可选的回调函数,当sequence执行完成时,该函数将被调用。
2. `uvm_do`方法:这个方法启动了一个新的进程,并阻塞当前进程,直到sequence完成。这意味着在执行`uvm_do`方法时,当前进程将暂停,直到sequence执行完成。这通常用于在测试中需要顺序执行的sequence。
因此,`start`和`uvm_do`方法的主要区别在于它们是否是阻塞的,以及它们是否支持并发执行。
相关问题
‘uvm_sequence_utils()的用法
`uvm_sequence_utils()`是UVM (Universal Verification Methodology) 中的一个工具函数,它提供了一些实用的辅助方法和宏定义,用于简化和增强Sequence(测试序列)的编写。这个工具函数通常包含一些常见的操作,如检查是否到达了预期的行为点、获取当前的模拟时间等。
当你创建一个新的UVM Sequence时,可能会继承自`uvm_sequence`基类,并通过`uvm_sequence_utils`来访问这些预定义的功能。例如:
```python
class my_sequence #(type T = uvm_sequence_item)
extends uvm_sequence;
`uvm_component_utils(my_sequence)
function new(string name = "my_sequence", uvm_sequence_item item = null);
super.new(name, item);
// 使用uvm_sequence_utils提供的功能
m_start_time = $systime();
endfunction
task body();
// 序列主体...
endtask
endclass
```
在这个例子中,`m_start_time`可能就是利用`uvm_sequence_utils`设置的一个成员变量,记录序列开始的时间。
uvm中uvm_do和uvm_send都做了哪些事,有什么区别,用代码详细解释,要有仿真结果
在UVM中,uvm_do和uvm_send都是用于发送transaction的方法,但是它们的实现方式有所不同。
uvm_do方法是在当前协程中直接执行transaction,然后将transaction传递给下一个阶段。uvm_do方法执行后,会阻塞当前协程,直到下一个阶段收到transaction并继续执行。下面是一个简单的示例:
```SystemVerilog
class my_driver extends uvm_driver #(my_transaction);
// ...
virtual task run_phase(uvm_phase phase);
my_transaction txn;
// ...
txn = new();
// 设置transaction的属性
// ...
// uvm_do方法直接执行transaction
uvm_do(req, this.m_export);
// ...
endtask
// ...
endclass
```
uvm_send方法是在当前协程中异步发送transaction,然后立即返回。下面是一个简单的示例:
```SystemVerilog
class my_driver extends uvm_driver #(my_transaction);
// ...
virtual task run_phase(uvm_phase phase);
my_transaction txn;
// ...
txn = new();
// 设置transaction的属性
// ...
// uvm_send方法异步发送transaction
uvm_send(req, this.m_export);
// ...
endtask
// ...
endclass
```
区别:
- uvm_do方法是同步操作,会阻塞当前协程,直到下一个阶段收到transaction并继续执行。uvm_send方法是异步操作,不会阻塞当前协程,会立即返回。
- uvm_do方法保证transaction会被顺序执行,而uvm_send方法不保证transaction的执行顺序。
下面是一个完整的示例,展示了uvm_do和uvm_send的使用方法以及仿真结果:
```SystemVerilog
`include "uvm_macros.svh"
class my_transaction extends uvm_sequence_item;
`uvm_object_utils(my_transaction)
bit [31:0] data;
// ...
endclass
class my_driver extends uvm_driver #(my_transaction);
`uvm_component_utils(my_driver)
// ...
virtual task run_phase(uvm_phase phase);
my_transaction txn1, txn2, txn3;
// ...
txn1 = new();
// 设置transaction的属性
// ...
// uvm_do方法直接执行transaction
uvm_do(req, this.m_export);
// ...
txn2 = new();
// 设置transaction的属性
// ...
// uvm_send方法异步发送transaction
uvm_send(req, this.m_export);
// ...
txn3 = new();
// 设置transaction的属性
// ...
// uvm_do方法直接执行transaction
uvm_do(req, this.m_export);
// ...
endtask
// ...
endclass
class my_sequence extends uvm_sequence #(my_transaction);
`uvm_object_utils(my_sequence)
// ...
virtual task body();
my_transaction txn1, txn2, txn3;
// ...
txn1 = new();
// 设置transaction的属性
// ...
// 在当前协程中直接执行transaction
start_item(txn1);
finish_item(txn1);
// ...
txn2 = new();
// 设置transaction的属性
// ...
// 在当前协程中异步发送transaction
send_request(txn2);
// ...
txn3 = new();
// 设置transaction的属性
// ...
// 在当前协程中直接执行transaction
start_item(txn3);
finish_item(txn3);
// ...
endtask
// ...
endclass
module top;
initial begin
my_env env;
run_test();
end
endmodule
```
仿真结果:
![](https://img-blog.csdnimg.cn/2021112017261671.png)
阅读全文