1. 函数与任务概述

在芯片验证中,我们经常需要编写函数与任务。函数是不消耗时间的,而任务是可以消耗时间的。这句话的本意是这样的,函数中不能添加,如#延时与@时钟语句,所以函数的执行是不耗费时间的。而任务中可以加#ns,@时钟语句,当任务中有此类语句,任务执行就会消耗仿真时间,反之,当任务中无#ns与@时钟语句,任务的执行也是不消耗仿真时间的。

2. UVM中的phase机制

基于UVM方法学,搭建验证平台,phase机制是必不可少的。在平台中,每个组件都会有一个组件类与组件cfg类,在组件类中,我们需要规划phase机制,比如,在build_phase中new组件的tlm端口,在main_phase或者run_phase中进行组件发包执行等。uvm中的phase非常多,一般常用的phase包括,build_phase,connect_phase(在env中),reset_phase,configure_phase,main_phase,shutdown_phase,run_phase。在env中,我们在build_phase中对平台的组件与TLM端口进行例化(思考:build_phase执行顺序为什么是自顶向下的?),并且在connect_phase中对组件进行连接。在连接后,我们就可以进行reset_phase,主要对dut复位,解复位操作。在reset_phase后,我们进入到configure_phase,configure_phase对dut时钟进行初始化,寄存器进行配置等。在configure_phase后,我们可以在用例中编写post_configure_phase对平台组件的cfg控制变量进行控制,以便控制平台的行为,之后,可以执行main_phase。需要记住的是,平台中各个组件的main_phase是并行执行的。

3. cast类型转换

cast类型转换,将基类类型转换为派生类类型,转换成功,返回值为1。常见写法为

if(!$cast(b,a))

        `uvm_error(get_type_name,"cast failed!" ,UVM_NONE)

这里需要注意的是,当cast成功后需要入队时,最好重新new一个b类型的类变量,把b的变量依次赋值给该变量后,将该变量入队,而不要将b入队。因为b是一个指针,后一个值会覆盖前一个值。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐