SV与UVM的问题记录

本文

主要对工作中遇到关于sv和uvm的问题,在此记录。

版本 说明
0.1 初版发布

记录

pkg不能添加interface

pkg是软件域,只能添加class,而interface属于硬件域与软件域的衔接,不属于软件域。有些工程师习惯将自己的验证环境打包成pkg来管理,所以才引入了这个问题。我习惯使用单独的一个文件来汇总验证环境的所有文件,方式是include,最后在tb中include这个汇总文件。这样做的原因如下:

  • 不用区分class、if还是module,都可以include。
  • 将验证环境文件添加到filelist也可以实现,之所以不这样做,是因为我需要使用`ifedf语句来进行可配置编译,比如是否编译function covergroup文件,filelist中是无法使用`ifdef的。
  • 如果使用了package,pkg内的class必须全部使用软件行为,而像“tb.clk”这种层级索引信号的方式是不可以使用的。

force硬件信号

有时候需要对DUT的信号进行force,force时信号值的源可以是数字,也可以是变量,但是此时对变量是有要求的,不能是任务的传入参数,最好使用静态变量,原因是设计中的变量都是静态变量。

trans的约束和driver的修改

trans中对随机变量添加了约束,此时如果driver中处于某种原因需要对其进行修改,如果修改的值与约束发生冲突,会报出警告,或者无法修改,这里需要格外注意。

变量定义编译失败

一般来说,变量定义,要放在程序的最开头,这样,编译才能成功。而变量定义没有放在最前面,而是放到了赋值语句之后,就会编译报错。所谓变量的声明必须在赋值之前,这是基本的原则,但是即便遵循这个原则,如果变量的声明穿插在代码中间,还是会编译报错。根据多次尝试发现,根据在编译时,其实是按代码块来判断的,也就是变量的声明必须在代码块的开头,所谓代码块可以是:

  • initial begin … end
  • if begin … and
  • always begin … end

有时候为了增强代码可读性,习惯将局部变量声明和代码逻辑放在一起,为了使其能编译成功,可以人为添加额外的begin…end。


文章原创,可能存在部分错误,欢迎指正,联系邮箱 cao_arvin@163.com。