【白皮书】UVM中transaction在组件中的通信

UVM中transaction的通信。

要实现通信,就需要考虑,事务是如何发送、接收? 以及如何传输的?

以monitor 和 model 之间的通信为例,进行阐明。

1.几个概念:

  • 参数化类: uvm_blocking_get_port 、uvm_analysis_port 其中的参数就是要传送的事务(transaction)
  • fifo的本质: fifo的类型是uvm_tlm_analysis_fifo,它本身也是一个参数化的类
  • 内建函数: get 、write

2.常规做法:

首先建立发送和接收的端口:

  • monitor :build_phase中new 一个ap(uvm_tlm_analysis_fifo)对象,并在main_phase中,收集完一个transaction 调用write方法将transaction发送出去。

  • model :build_phase中new 一个port(uvm_blocking_get_port)对象,并在main_phase中调用get方法 得到transaction,用于处理。

其次建立连接

  • env: build_phase中new 一个agt_mdl_fifo,并在connect_phase中,将agt_mdl_fifo与agent和model中的端口进行连接,(agent中的ap定义与monitor完全相同,但是不需要对其进行实例化,只需在agent的connect_phase中将monitor的值赋给它,这相当于是一个指向monitor的ap指针)

3.疑问

为什么需要fifo?

  • analysis_port是非阻塞性质的,ap.write函数调用完成后马上返回,不会等待数据被接收。假如当write函数调用时, blocking_get_port正在忙于其他事情,而没有准备好接收新的数据时,此时被write函数写入的my_transaction就需要一个暂存的位 置,这就是fifo。

analysis_port和analysis_export与put和get系列端口的区别是什么?

  • 第一,默认情况下,一个analysis_port(analysis_export)可以连接多个IMP,也就是说,analysis_port(analysis_export)与IMP 之间的通信是一对多的通信,而put和get系列端口与相应IMP的通信是一对一的通信(除非在实例化时指定可以连接的数量,
  • analysis_port(analysis_export)更像是一个广播。 第二,put与get系列端口都有阻塞和非阻塞的区分。但是对于analysis_port和analysis_export来说,没有阻塞和非阻塞的概念。 因为它本身就是广播,不必等待与其相连的其他端口的响应,所以不存在阻塞和非阻塞。

sequencer 和 driver直接的通信?

  • ?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UVM ,可以使用 `uvm_config_db` 类来给组件传递参数。具体步骤如下: 1. 在组件的类定义需要接收的参数变量,例如: ```verilog class my_component extends uvm_component; // 定义需要接收的参数变量 int my_param; // ... endclass ``` 2. 在 testbench 的 `build_phase` ,使用 `uvm_config_db` 类的 `set()` 方法来设置参数值,例如: ```verilog class my_testbench extends uvm_test; // ... function void build_phase(uvm_phase phase); super.build_phase(phase); // 设置 my_component 的 my_param 参数为 42 uvm_config_db#(int)::set(this, "*", "my_component", "my_param", 42); endfunction // ... endclass ``` 在上述代码,`uvm_config_db#(int)::set()` 方法的参数解释如下: - 第一个参数为当前对象(即 testbench); - 第二个参数为要配置的组件的实例名称,使用通配符 `*` 表示所有实例都匹配; - 第三个参数为要设置的参数所在的组件的类型名称; - 第四个参数为需要设置的参数名称; - 最后一个参数为参数值。 3. 在组件的 `build_phase` 调用 `uvm_config_db` 类的 `get()` 方法来获取参数值,例如: ```verilog class my_component extends uvm_component; // ... function void build_phase(uvm_phase phase); super.build_phase(phase); // 获取 my_param 参数的值 if(!uvm_config_db#(int)::get(this, "", "my_param", my_param)) `uvm_fatal("MY_COMPONENT", "Failed to get my_param from config DB") endfunction // ... endclass ``` 在上述代码,`uvm_config_db#(int)::get()` 方法的参数解释如下: - 第一个参数为当前对象(即组件); - 第二个参数为实例名称,使用空字符串表示当前实例; - 第三个参数为要获取参数的名称; - 最后一个参数为参数变量的引用。 注意:在使用 `uvm_config_db` 类传递参数时,需要保证参数名称和类型名称的一致性,否则可能导致参数无法正确传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值