基于systemVerilog的UVM 调试问题及解决办法集锦 您所在的位置:网站首页 tfassign_add 基于systemVerilog的UVM 调试问题及解决办法集锦

基于systemVerilog的UVM 调试问题及解决办法集锦

#基于systemVerilog的UVM 调试问题及解决办法集锦| 来源: 网络整理| 查看: 265

说在前头

目前接触的UVM内容都是基于systemVerilog的。所以,碰到的问题主要基于sv。

一、低级语法错误

此类错误是由于一些低级操作或常识不清导致的,并很容易解决。 多为语法错误。

1、信号赋值

信号主要分为wire型和reg型。 在进行信号赋值时,wire型信号不能出现在等号左边只能在右边,reg型信号可以出现在等号左边和右边。故,当不小心把wire型信号放在等号左边,就会报错。 信号赋值,左右两边的信号必须是相同类型,否则无法赋值。

当然,现在systemVerilog中引入了logic类型的变量,可看作是wire型和reg型的综合。使用logic类型的信号,就能避免上面的问题。

2、拼写错误

因为每天敲很多代码,经常由于错敲、多敲、漏敲字母导致信号名错误,使得编译报错:该信号未定义。 另外,由于屏幕分辨率及字体原因,导致小写的“i”与数字”1”不易区分,数字“0”和字母“O”不易区分,稍不留意就会认错。

3、语法错误

有时编译报错为语法错误,但是仔细反复检查那一行,却找不出问题。这时候,不妨往上一行看看。 原因是,经常由于上一行末尾少敲结尾的分号“;”,导致下一行编译报语法错误。

4、invalid错误

实际工程中,自己动手敲代码,编译发现invalid类型错误。 比如,某个类型的对象,编译提示该类型未定义,invalid。但是,去检查代码,自己明明定义了的。 原因是什么? 哈哈,其实很简单,不是你定义出问题了(若是,那也不会是invalid的了!)。 解决问题分两步:

第一,检查自己的类型名称拼写是否有错误。

对的,很有可能是敲错了! 名称对不上,自然是invalid。

第二,检查代码编译顺序。

已经排除拼写错误,那么自然类型定义是没有问题的。 那是什么原因? 因为编译时会将include的文件按照代码顺序编译,于是,很有可能因为顺序问题,导致应用类型的代码比定义类型的代码先编译,那么,基于先定义再使用的原则,显然该类型在编译到应用该类型时,自然是未定义的,也就是invalid。 解决办法:只需要将定义的代码说在文件的include顺序提前到应用类型的文件前面。 对,就是这么简单! 你以为多深奥? 再说一遍,核心办法是:查看在顶层中一大堆include“xxxx”的顺序,确定类型的先定义再应用的顺序。 经验之谈:一般,将最底层的文件放在开头,也就是自己纯定义类型,不应用别的类型;应用类型的文件,一定放在该类型的定义文件之后。

5、使用UVM机制

UVM中提供了各种功能强大的机制,提高工作效率。比如factory机制。 但是,要使用这些机制,定义的object、component都必须用特定的宏注册。 否则,无法使用对应机制。 并造成对应定义的object或component存在invalid问题。

6、类变量的invalid

UVM使用systemVerilog,与C++、Java等面向对象语言有很多相同点。比如,类的对象,声明后,在使用前,需要实例化。在SystemVerilog中使用new()函数实现. 有时候,代码通过编译,但是在仿真时因出错而停止,会出现“NULL pointer dereference”的错误提示. 这种错误是说:出现空指针的引用。 就说明,当前错误的地方是因为声明的该实例没有实例化。 当正确声明一个变量,使用时,需要先进行new操作,即实例化。实例化,会申请对应空间供变量使用。否则,声明的变量就只是一个单纯的该类型指针,没有实际空间,无法直接使用。 比如: A a;// class A a.copy(); // 报错:NULL pointer dereference

修改为: A a;// class A; a = new(“a”); a.copy() // 正确

7、虚拟接口

UVM中提供了虚拟接口,用于避免使用绝对路径。 每一组虚拟接口,在定义后,都必须完善连接。否则,由于接口没有连接上,使用会报错。

8、函数调用错误

调用函数,不管是系统函数还是自定义函数,函数中的参数个数要匹配,否则,会报错。 错误信息大概如下: The above function/task call is done with more arguments than needed. 这类错误比较容易解决,直接去参看原函数定义,检查参数类型及数量,一一对应修改即可。

9、uvm_info引起的错误

通常,为了方便调试,会添加uvm_info打印信息,功能等同与C语言中的printf函数。 这个当然很好。 但是,一不小心,就会引起错误。还很莫名其妙。 比如,在某个UVM component的某个phase中,需要在执行进入该phase中,就打印相关信息,提醒当前已经执行到这里。 想法很好,uvm_info的语法也简单。 一般不会有错。 但是,假如uvm_info后面有变量声明,那么,不好意思,编译时会报错,提示添加“=”or“



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有