UVM::uvm_do function about sub-sequence

博客探讨了在UVM sequence中使用uvm_do(sub_sequence)时,sub_sequence的pre_body()和post_body()为何不被执行。原因在于uvm_do的实现中call_pre_post参数默认为0,导致这些函数被忽略。这可能导致在sub_sequence中无法执行objection相关操作,因为objection通常在pre/post_body中处理。

关注点1:在sequence中执行uvm_do(sub_sequence,...) 时,sub sequence的pre_body(), post_body() 不会执行, 原因:如果user把objection 的raise/drop放在pre_body/post_body中,而在一个环境中objection不希望出现在很多地方,所以在parent sequence中加入objection机制,sub sequence中pre/post body函数不执行,sub sequence中也不会有objection相关的操作

原因:

下面是sequence的执行function,但是pre_body, post_body是受start() 函数的参数控制的

而uvm_do的实现如下, 对应的call_pre_post参数为0

 

<think>我们面对的是一个SystemVerilog UVM环境中的类型兼容错误。错误信息指出:在实际调用中传递的类型(etimer_env_pkg::uvm_analysis_imp_rxport)与形式参数期望的类型(uvm_pkg::uvm_port_base)匹配。这两个类型都是参数化的类(模板类),但它们的模板参数同。 分析错误信息: 实际类型:etimer_env_pkg::uvm_analysis_imp_rxport#(etimer_env_pkg::etimer_transaction.class etimer_env_pkg::etimer_env_refm) 形式类型:uvm_pkg::uvm_port_base#(uvm_pkg::uvm_tlm_if_base#(svt_ahb_uvm_pkg::svt_ahb_transaction, svt_ahb_uvm_pkg::svt_ahb_transaction)) 这里,我们注意到: 1. 实际类型是一个uvm_analysis_imp_rxport,它通常在UVM中用于实现analysis port的imp端,其模板参数是etimer_transaction(传输类型)和etimer_env_refm(实现该imp的组件类型)。 2. 形式类型是一个uvm_port_base,其模板参数是一个uvm_tlm_if_base,而uvm_tlm_if_base本身又用两个svt_ahb_transaction类型参数化。 显然,这两个类型并相同,而且它们的参数化结构也一样。因此,直接传递会产生类型匹配。 解决思路: 1. 检查代码中调用的上下文,确认我们试图将什么传递给什么。根据错误信息,很可能是将etimer_env_pkg中的某个analysis imp端口连接到了期望svt_ahb_transaction类型的TLM端口上。 2. 确保连接的两端具有兼容的类型。在UVM中,端口连接要求两边的端口类型必须是兼容的,即: - 如果一端是`uvm_analysis_port`,那么另一端应该是`uvm_analysis_imp`或者另一个`uvm_analysis_port`(通过端口到端口的连接)。 - 此外,它们所传递的事务类型必须相同。 在这个错误中,实际端口的事务类型是`etimer_transaction`,而形式端口期望的事务类型是`svt_ahb_transaction`(通过`uvm_tlm_if_base`的两个模板参数可以看出,这两个参数分别代表请求和响应类型,但在这里请求和响应都是`svt_ahb_transaction`)。因此,事务类型匹配。 解决方案: 1. 重新考虑设计:是否应该将etimer_env_pkg中的端口连接到这个期望svt_ahb_transaction的端口?可能设计意图有误。 2. 如果设计正确,那么可能需要一个适配器(adapter)来转换事务类型。即,我们可以在中间加入一个组件,该组件接收`etimer_transaction`,然后将其转换为`svt_ahb_transaction`,再发送到目标端口。 3. 检查两端端口的声明和使用是否正确。特别是,形式参数期望的端口类型是`uvm_port_base`(这是一个基类),但实际上我们可能应该使用更具体的端口类型(如`uvm_analysis_port`)?但是错误信息中给出的形式参数类型是一个参数化的`uvm_port_base`,其参数是特定的TLM接口,这看起来像是某个TLM端口(如`uvm_blocking_put_port`等)的基类。 具体步骤建议: - 首先,定位代码中报错的位置(根据错误信息给出的文件和行号)。 - 检查该行代码中,调用函数或任务时传递的参数(即`this.req`)的类型是否与函数或任务定义的形式参数类型一致。 - 如果确实需要连接两个同类型的事务,则考虑使用适配器组件: 1. 创建一个新的组件,继承自`uvm_component`,并在其中声明以下端口: - 一个类型为`uvm_analysis_imp_rxport#(etimer_transaction, adapter_component)`的imp端口(用于接收etimer_transaction)。 - 一个类型为`uvm_port_base`所期望类型的端口(例如`uvm_blocking_put_port#(svt_ahb_transaction)`或其他)。 2. 在该组件中实现`write`方法(因为analysis imp需要)或者相应的任务(如果是阻塞操作),在接收到`etimer_transaction`时,将其转换为`svt_ahb_transaction`,然后通过后者的端口发送出去。 3. 在环境中实例化这个适配器,并将原始的连接改为: - etimer_env_pkg的端口连接到适配器的analysis imp端口。 - 适配器的输出端口连接到原来期望`svt_ahb_transaction`的端口。 注意:转换时需要确保事务内容的正确映射。 另外,还需要注意端口的方向和类型是否匹配(例如,analysis端口是广播,而put端口是点对点)。 如果没有设计错误,而是端口声明错误,则需要修改端口声明,使两端的事务类型一致。 由于错误信息中提到了类名包含很长的模板参数,这可能是由于实例化时的参数一致导致的。因此,请仔细检查相关端口的声明。 总结:这个错误的核心是类型匹配,解决方法是确保两端端口的事务类型一致,或者通过适配器转换事务类型。 </think>根据您提供的错误信息,实际类型(`etimer_env_pkg::uvm_analysis_imp_rxport`)与形式类型(`uvm_pkg::uvm_port_base`)兼容的问题源于 SystemVerilog UVM 环境中的类型匹配。以下是解决方法和步骤: --- ### **错误原因分析** 1. **类型层次匹配** - 实际类型:`uvm_analysis_imp_rxport`(专用于 `etimer_transaction` 的分析端口实现) - 形式类型:`uvm_port_base`(期望基于 `svt_ahb_transaction` 的 TLM 接口) - 本质是两种兼容的 UVM 端口类型,且事务对象类型同(`etimer_transaction` vs `svt_ahb_transaction`)。 2. **模板参数冲突** - `uvm_analysis_imp_rxport` 的模板参数为 `etimer_transaction`,而 `uvm_port_base` 的模板参数为 `uvm_tlm_if_base<svt_ahb_transaction>`,两者无法直接转换[^1][^2]。 --- ### **解决方案** #### 方法 1:统一事务类型(推荐) 在顶层环境(如 `etimer_env`)中显式声明端口类型: ```systemverilog // 修改前:使用 uvm_port_base 声明 uvm_port_base #(uvm_tlm_if_base #(svt_ahb_transaction)) ahb_port; // 修改后:统一为 uvm_analysis_imp uvm_analysis_imp_rxport #(etimer_transaction, etimer_env_refm) rx_port; ``` 确保所有连接(`connect_phase`)使用相同事务类型: ```systemverilog agent.analysis_port.connect(refm.rx_port); // 端口类型均为 etimer_transaction ``` #### 方法 2:使用适配器(Adapter)转换事务类型 若必须连接同事务对象: 1. 创建事务转换器: ```systemverilog class trans_adapter extends uvm_component; uvm_analysis_imp #(etimer_transaction, trans_adapter) in_port; uvm_analysis_port #(svt_ahb_transaction) out_port; virtual function void write(etimer_transaction t); svt_ahb_transaction ahb_tx = new(); ahb_tx.copy_from_etimer(t); // 自定义转换逻辑 out_port.write(ahb_tx); endfunction endclass ``` 2. 在环境中连接: ```systemverilog trans_adapter adapter = new("adapter", this); env.refm.rx_port.connect(adapter.in_port); // 接收 etimer_transaction adapter.out_port.connect(ahb_monitor.port); // 输出 svt_ahb_transaction ``` #### 方法 3:检查 UVM 端口继承关系 - 确认 `uvm_analysis_imp_rxport` 是否继承自 `uvm_port_base`(通常直接继承)。 - 若需通用端口接口,改用 `uvm_analysis_port` 或 `uvm_tlm_analysis_fifo` 作为中间层。 --- ### **关键注意事项** 1. **类型一致性** UVM 严格要求端口连接双方: - 相同的端口类型(e.g., `uvm_analysis_port` 只能连 `uvm_analysis_imp`) - 相同的事务类型参数[^1][^2]。 2. **作用域限定** 使用 `etimer_env_pkg::` 和 `svt_ahb_uvm_pkg::` 显式声明类型,避免命名空间冲突。 3. **调试建议** ```systemverilog $display("Actual Type: %s", this.req.get_type_name()); $display("Formal Type: %s", formal_port.get_type_name()); ``` 输出实际与形式类型名,验证类型匹配性。 --- ### **预防措施** - **编码规范**:在 UVM 环境中统一事务对象和端口类型。 - **编译选项**:启用额外类型检查(如 `-sv` 和 `-uvm` 严格模式)。 - **版本兼容**:确保 `svt_ahb_uvm_pkg` 与 UVM 库版本兼容。 通过统一事务类型或添加适配层,可解决此类复杂类型匹配问题[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值