UVM component,object 之间传递接口,transaction通信方式总结

说明:下列代码参考《UVM实战》

1、interface 和一些configuration等uvm_object 传递

从testbench传递至UVM各个模块中,这种传递方式不需要连接,只需要发送和接收就行

  1. testbench中  声明并传入必要参数
    my_if input_if(clk, rst_n);
  2. testbench中, 进行dut连接
    dut my_dut(.clk(clk),.rst_n(rst_n), .rxd(input_if.data),
     .rx_dv(input_if.valid), .txd(output_if.data),.tx_en(output_if.valid));
  3. testbench中,使用uvm_config_db#进行传递,可以一传一,绝对路径,使用通配符可以一传多
    uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif", input_if);    
    uvm_config_db#(virtual my_if)::set(uvm_root::get,"*","vif",input_if);
  4. 在conponent中进行接收
     if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))
       `uvm_fatal("my_driver", "virtual interface must be set for vif!!!")

2、transaction从uvm_test 至sequencer至driver的传递

首先讲一下transaction产生过程(不采用defa

UVM(Universal Verification Methodology)中,`object`和`component`是两个核心概念,它们在验证平台的构建中扮演不同的角色,具有显著的功能和用途差异。 ### `object` 的特点 `object`是UVM中最基础的类之一,派生自`uvm_object`类。它主要用于数据的封装和传递,通常用于事务级建模(transaction-level modeling)。常见的`object`包括事务(transaction)、序列项(sequence item)等。这些对象通常不具有持续的行为,而是作为数据容器在验证平台中传输。 - **生命周期管理**:`object`的生命周期通常较短,可能在一次事务或一次序列操作中被创建和销毁。 - **动态创建**:可以通过`create()`方法动态创建`object`实例。 - **数据封装**:用于封装数据,支持随机测试生成和数据传递。 - **无端口连接**:`object`没有端口(port)或接口(interface)的连接[^1]。 ### `component` 的特点 `component`派生自`uvm_component`类,是UVM中更为重量级的类。它用于构建验证平台的静态结构,如`driver`、`monitor`、`sequencer`、`agent`、`environment`等。`component`具有层次结构,并且在整个仿真过程中持续存在。 - **静态结构**:`component`在验证平台中作为静态组成部分,通常在整个仿真过程中存在。 - **层次结构**:`component`支持层次化设计,可以通过`uvm_component_utils`宏注册,并在`build_phase()`中创建子组件。 - **端口和接口**:`component`可以拥有端口(port)和接口(interface),用于与其他组件通信。 - **相位管理**:`component`参与UVM的相位(phase)管理,可以在不同的相位中执行特定的操作,如`build_phase()`、`connect_phase()`、`run_phase()`等[^1]。 ### 示例代码 以下是一个简单的示例,展示了如何定义一个`object`和一个`component`: #### `object` 示例 ```systemverilog class my_transaction extends uvm_object; `uvm_object_utils(my_transaction) rand bit [31:0] data; function new(string name = "my_transaction"); super.new(name); endfunction endclass ``` #### `component` 示例 ```systemverilog class my_driver extends uvm_driver; `uvm_component_utils(my_driver) function new(string name, uvm_component parent); super.new(name, parent); endfunction virtual function void build_phase(uvm_phase phase); // 构建阶段的操作 endfunction virtual task run_phase(uvm_phase phase); // 运行阶段的操作 endtask endclass ``` ### 总结 - `object`主要用于数据的封装和传递,生命周期较短,适用于事务级建模。 - `component`用于构建验证平台的静态结构,具有层次化设计和相位管理能力,适用于长期存在的组件[^1]。 理解`object`和`component`的区别对于构建高效、可维护的验证平台至关重要。在实际应用中,`object`和`component`通常协同工作,`object`用于传递数据,而`component`用于管理和协调这些数据的处理过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值