UVM高级应用

说明:这部分内容比较零散,且很多不好理解,所以这里只能选择性介绍一些内容。

使用interface代替driver部分功能

方法:

  • 在interface中可以定义任务与函数,也可以使用always语句和initial语句,也可以实例化其他interface。可用其做一些低层次的转换, 如8b10b转换、 曼彻斯特编码等。 这些转换动作是与transaction完全无关的。

好处:

  • 让driver从底层繁杂的数据处理中解脱出来, 更加专注于处理高层数据
  • 有更多的数据出现在interface中, 这会对调试起到很大的帮助(因为interface中的信号在波形文件中有记录的)

可变时钟的三种需求及对应实现方法

  • 在不同测试用例之间时钟频率不同, 但是在同一测试用例中保持不变
    • 例如:HDMI协议中会依据图像分辨率采用不同的时钟
    • 方法一:将时钟独立成一个文件,通过include不同的时钟实现
    • 方法二:在测试用例中使用config_db的set方法设置一个变量,然后在时钟实现的地方使用get方法获取该变量,将其作为时钟周期。
  • 在同一个测试用例中存在时钟频率变换的情况
    • 例如:PLL过渡期前和过渡期后的时钟是不一样的
    • 方法一:在测试用例中使用config_db的set方法随着时间不同为时钟周期变量设置不同值。
  • 既关心过渡期前后的时钟, 也关心PLL在过渡期的行为,即要求时钟变量不止是简单的可变,而且是正弦变化的。
    • 例如:关心PLL过渡期内时钟行为,实际工作中时钟频率也是存在一定抖动的
    • 方法一:建立一个clk的interface,然后通过config_db将对clk的驱动放在一个时钟component中,这样的话,要实现任意对clk的驱动只需要重载这个时钟component即可。

layer sequence的引入

以太网包、IP包、 UDP包、 TCP包,数据是层层封装的,为了提高测试用例的可重用性,方法有:

  • 方法一:sequence中调用子sequence——将与ip相关的代码写成一个函数, 而与mac相关的代码写成另外一个函数, 将这些基本的函数放在base_sequence中。 在新建测试用例时, 从base_sequence派生新的sequence, 并调用之前写好的函数。---- 感觉更适合并列关系的测试用例
  • 方法二:使用layer sequence——一个sequence负责产生ip_transaction, 另外sequence负责产生my_transaction, 前者将产生的ip_transaction交给后者。— 感觉更适合包含关系的测试用例

layer sequence的示例

UVM高级应用_第1张图片

聚合参数的优势与问题

优势:

  • 可以将interface也放入此聚合参数类中
  • 使用聚合类减少了config_db::set的使用, 也会大大降低出错的概率

问题:

  • 本质上是将一些属于某个uvm_component的变量变成对所有的uvm_component可见
  • 在一定程度上降低了验证平台的可重用性

总结:

  • 在参数聚合程度/粒度上需要权衡:更好方便的使用vs代码可重用性

参考资料

UVM实战(卷一) 张强 编著 机械工业出版社


如需了解更多相关内容,欢迎关注“多读点书”,让我们一起阅读,一起成长。

你可能感兴趣的:(硬件开发,verilog,芯片,fpga开发,硬件工程,学习)