uvm中uvm_do和uvm_send都做了哪些事,有什么区别,用代码详细解释,要有仿真结果
时间: 2024-05-18 13:18:54 浏览: 345
在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)
阅读全文