路科验证MCDF_uvmlab2

一、验证组件和层次构建

首先将各个package中的SV组件替换为UVM组件,替换过程中需要遵循以下规则:
1、实现组件对应原则

SVUVM
transactionuvm_sequence_item
driveruvm_driver
generatoruvm_sequence + uvm_sequencer
monitoruvm_monitor
agentuvm_agent
envuvm_env
checkeruvm_scoreboard
reference modeluvm_component
coverage modeluvm_component
testuvm_test

2、在进行类的转换时需要注意:

  • SV的上述类均需继承于其对应的UVM类
  • 类定义过程中一定要'uvm_component_utils()'uvm_object_utils()进行注册

3、使用上述工厂注册宏的时候会伴随着域的自动化。一般建议在定义sequence item时,也要进行域的自动化声明,方便后续对sequence item对象进行拷贝、打印等操作。

4、一定要注意构建函数new()的声明方式,uvm_component的构建函数有两个参数new(string name, uvm_component parent),而uvm_object的构建函数只有一个参数new(string name)。

5、在组件之间的层次关系构建中,依然按照之前SV组件的层次关系,只需要在不同的phase阶段完成组件的例化和连接。

注意

改写时容易出现的错误

  • 漏了注册、或者parent参数
  • build_phase里需要用type_id::create来创建组件,不采用new

哪些phase应该加上super.xxxx_phase, 哪些又可以不加呢?

  • 对于build_phase来说, uvm_component对其做的最重要的事情就是自动获取通过config_db::set设置的参数。 如果要关掉这个功能, 可以在自己的build_phase中不调用super.build_phase
  • 除了build_phase外, UVM在其他phase中几乎没有做任何相关的事情,完全可以不必加上super.xxxx_phase语句
  • 上述说法只适用于直接扩展自uvm_component的类。 如果是扩展自用户自定义的类, 如base_test类, 且在其某个phase, 如connect_phase中定义了一些重要内容, 那么在具体测试用例的connect_phase中就不应该省略super.connect_phase。

代码改写Q&A

chnl_pkg

1、do_drive()中为什么修改后需要加上动态转换?

在这里插入图片描述
因为SVlab里我们自己定义的clone函数返回的是子类chnl_trans句柄,可以直接传递句柄;而uvm调用的clone函数返回的永远是uvm_object父类句柄。而我们需要访问子类对象,所以需要将父类的句柄转化为子类句柄。转化可以成功,因为该父类句柄指向的是子类对象。
在这里插入图片描述

2、chnl_generator不是要改成sequence和sequencer吗?

在uvmlab2里暂时不改造,等我们学到相应的部分再进行修改。(uvmlab4再改)这里先暂时继承于uvm_component。

3、create和new分别在什么时候用?

①如果是object类,在不需要被覆盖或者配置的前提下,那么用new或者type_id::create来创建都可以;如果有可能被覆盖,那就用type_id::create来创建。
对小白来说,可以统一在build_phase里用type_id::create来创建;
②如果是组件,那就一定要采用create创建组件。这不仅可以在工厂里注册,方便做覆盖,而且帮助实现了层次化结构,为之后的配置提供方便。
③既不是object也不是component类的,用new来创建。比如端口类port是继承于uvm_void,就只能用new来创建。

4、改造后的chnl_generator里的sprint不加super会如何?

在这里插入图片描述
如果省略super,那么会存在一个同名的问题。因为uvm这个函数也叫sprint,所以编译器会认为你要调用的是当前的函数。
在这里插入图片描述
如果把当前的sprint函数改下名字,那么问题就可以解决。因为当前类不存在sprint函数,所以会自动去父类里搜索sprint函数。首先去uvm_component搜,搜不到就继续往上,直到uvm_object里。借助域的自动化,找到sprint。所以此时不加super也没问题。

5、driver、monitor、agent声明中的local string name为什么不需要了?

在这里插入图片描述
在组件中,name是已经预先定义的变量名,不需要再定义了。new函数中的name指的就是预先定义好的变量。

6、chnl_agent里例化组件部分放置的位置区别

在这里插入图片描述
在sv中,创建组件就是在new函数中进行;而在uvm中,创建组件一般在build_phase中进行。更详细的说明见reg_pkg部分的第一点说明:mailbox实例的创建是放在new还是build_phase里

7、uvm中不需要分别调用子组件的run,那谁在控制运行?

在这里插入图片描述
层次的执行以及phase之间的顺序都由uvm_root自动安排,不需要手动执行子组件的run函数了。
对于run_phase这个空的方法,其实可以直接整个删掉也无所谓。此处保留只是为了对比而已。

reg_pkg

1、实例的创建是放在new还是build_phase里?

在这里插入图片描述
我们前面提到,在sv中,创建组件就是在new函数中进行;而在uvm中,创建组件需要在build_phase中进行。那么实例的创建要放在哪里咧?
分两种情况。
①如果组件是用new例化的,那么就放new函数里或者是build_phase都可以的。
②如果是使用create例化的,那就一定要放在build_phase中,才能保证覆盖、配置正常进行。

或者最简单的,可以把所有实例的创建都放在build_phase里,这样一定不会有问题。

mcdf_pkg

1、为什么要把do_compare改名为do_data_compare?

在这里插入图片描述
do_compare是compare预定义好的回调函数,改名可以防止和预定义的函数起冲突。

2、为什么都用uvm_config_db传递接口了,还保留着set_interface函数?

在mcdf_env中,路桑暂时保留了mcdf_env以及各个子组件的set_ingerface函数,只是改造了TB和mcdf_env的接口传递而已。具体就是:通过uvm_config_db完成了各接口从TB(硬件一侧)到验证环境mcdf_env(软件一侧)的传递,之后再通过mcdf_env与其各个子组件的set_interface进行接口的传递;

当然,我们也可以移除所有的set_interface函数,完全采用uvm_config_db set和get方法,从而使mcdf_env与其各个子组件也实现层次剥离,进一步促进组件之间的独立性。

3、改写成uvm后,$finish()去掉了,仿真如何结束?
phase.raise_objection(this);
......
phase.drop_objection(this);

uvm中是通过在某个uvm_test里的run_phase里raise_objection,防止仿真退出,并在执行结束后drop_objection;不需要单独调用finish来结束仿真。因为所有phase执行结束后会自动退出仿真。

4、如果改写完后的某个phase是空的,可以删除吗?
virtual function void report_phase(uvm_phase phase);
   super.report_phase(phase);
   // this.env.do_report();
   // rpt_pkg::do_report();
endfunction

对于上面这个report_phase,其内容是空的,可以直接删掉。run_phase如果是空的也可以直接删去。

二、测试的开始和结束

代码改写

tb

1、uvm_base_test还能通过set_interface来传递接口吗?

以前是通过在仿真的时候传递一个TESTNAME,在运行的时候就可以直接把TESTNAME对应的set_interface和run函数调用起来(前提是已经提前把每个test都例化了),实现接口的层层传递,最终到达底层的组件。
而在uvm中是通过uvm_config_db来传递接口的,在组件还没有创建之前就先把接口放在中转库。运行则是通过run_test。

可能有人问,可否和之前一样还是通过set_interface来传递接口?
在这里插入图片描述

不行,调用组件方法set_interface的前提是组件已经例化了。而实际上,uvm中组件的例化是在run_test()中(因为run_test会执行所有的phase,包括build_phase),所以不行。

那如果把run_test放在set_interface之前呢?
也不行。因为run_test开始之后会进入build_phase。此时会发现没有interface的指针,所以也会有问题。

总结:
1、SV中接口传递的问题:

  • 环境准备好了,组件例化了后才能传递;
  • 每一层都要有set_interface,然后层层传递进去(好几个类中都要声明set_interface)这不利于软件环境的封装和复用。

2、而通过uvm_config_db可以将接口先放在一个中转库,可以使得接口的传递和获取彻底分开,直接将接口传递一步到位,而不是层层传递;无需担心测试台层次结构中任何组件的深度。

2、run_test()中有无参数的区别何在?

如果有参数,意味着mcdf_data_consistence_basic_test是默认的test,如果仿真选项中没有指定UVM_TESTNAME,那么就默认执行它;

run_test("mcdf_data_consistence_basic_test");

如果没有参数,也就意味着没有默认test。那么仿真选项就必须要指定test,否则会报错;
如果通过UVM_TESTNAME指定了某个test,那么UVM会从命令行中寻找测试用例的名字,创建它的实例并运行。

run_test();
  • 选择正确的test
  • 通过test构建层次
  • 让每个phase按顺序执行
  • 通过objection机制控制仿真的结束
  • 26
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举类型 23 字符串 25 1.2 过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态 静态变量 39 1.3 设计例化和连接 45 第二章 验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 性能验证 410 第三章 SV组件实现 99 3.1 接口 100 什么是interface 101 接口的优势 108 3.2 采样和数据驱动 112 竞争问题 113 接口中的时序块clocking 123 利于clocking的驱动 133 3.3 测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4 调试方法 150 第四章 验证的计划 166 4.1 计划概述 166 4.2 计划的内容 173 4.3 计划的实现 185 4.4 计划的进程评估 194 第五章 验证的管理 277 6.1 验证的周期检查 277 6.2 管理三要素 291 6.3 验证的收敛 303 6.4 问题追踪 314 6.5 团队建设 321 6.6 验证的专业化 330 第六章 验证平台的结构 48 2.1 测试平台 49 2.2 硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3 激励发生器 67 channel initiator 72 register initiator 73 2.4 监测器 74 2.5 比较器 81 2.6 验证结构 95 第七章 激励发生封装:类 209 5.1 概述 209 5.2 类的成员 233 5.3 类的继承 245 三种类型权限 protected/local/public 247 this super 253 成员覆盖 257 5.4 句柄的使用 263 5.5 包的使用 269 第八章 激励发生的随机化 340 7.1 随机约束和分布 340 权重分布 353 条件约束 355 7.2 约束块控制 358 7.3 随机函数 366 7.4 数组约束 373 7.5 随机控制 388 第九章 线程与通信 432 9.1 线程的使用 432 9.2 线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3 线程的通信 458 第十章 进程评估:覆盖率 495 10.1 覆盖率类型 495 10.2 功能覆盖策略 510 10.3 覆盖组 516 10.4 数据采样 524 10.5 覆盖选项 544 10.6 数据分析 550 第十一章 SV语言核心进阶 552 11.1 类型转换 552 11.2 虚方法 564 11.3 对象拷贝 575 11.4 回调函数 584 11.5 参数化的类 590 第十二章 UVM简介 392 8.2 UVM简介 414 8.3 UVM组件 420 8.4 UVM环境 425
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hardworking_IC_boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值