Systemverilog 疑惑解答第二季(持续更新中)

  • Interface有什么作用?

主要作用有两个:一是简化模块之间的连接;二是实现类和模块之间的通信.

interface里面可以带时钟、断言、任务(task)、函数(function)等定义。一个interface 也可以有input,output或是inout端口。

优点:

  1. 接口便于设计重用,当两个块之间有两个以上的信号连接,并且使用特定的协议通信的时候,应该考虑使用接口;
  2. 接口可以用俩替代原来需要在模块中或者程序中反复声明并且位于代码内部的一系列信号,减少了连接错误的可能性;
  3. 要增加一个新的信号时,在接口中只需要声明一次,不需要在更高层的模块层声明,这进一步减少了错误;
  4. modport允许一个模块很方便的将模块中的一系列信号捆绑在一些,也可以为信号指定方向以方便工具自动检查.

缺点:

  1. 对于点对点的连接,使用modport的接口描述跟使用信号列表的端口一样的冗长;
  2. 必须同时使用信号名和接口名,可能会使模块变得更加冗长;
  3. 如果要连接的两个模块使用的是一个不会被重用的协议,使用接口需要做比端口连线更多的工作;
  4. 连接两个不同的接口很困难.

 

  • program的作用

为避免仿真和设计竞争问题(race condition),systemverilog中引入了program的概念。所有与设计相关的线程在module中执行,而与验证有关的线程则在program中运行。在仿真过程中,这两种线程运行在不同的时间步(time step),从而解决了竞争问题。

 

  • inital语句块与final语句块有什么区别?

inital语句块在仿真开始时执行,final语句块在仿真结束时执行;final语句块不能有delay,wait和non_blocking具有时许的语句。

 

  • 如何检查句柄是否存有对象?

检查该对象是否初始化,在SV中,所有未初始化的对象句柄都具有特殊的null值。assert(obj == null)

 

  • 代码覆盖率与功能覆盖率有什么区别?

代码覆盖率描述设计中代码执行的客观信息;功能覆盖率决定了设计已实现了多少功能。

 

  • 系统方法与内建方法有什么区别?

系统方法是SV预定义的方法(function/task),均以$符号开头,例如$display();内建方法是指SV针对某些类型,为其预定义的方法,例如数组的方法size(),delete().

 

  • 条件赋值符?:和条件语句if-else语义和执行结果一致吗?

多数条件下是的.但一定要避免条件判断结果出现X结果,否则条件赋值符的结果会让你惊讶.原因在于如果?:复制中的条件结果为X值,那么变量被赋值很可能出现X值出现.

 

  • fork-join_none开辟的县城在它外部的task退出以后,后台线程也会结束吗?

不会.任何由fork开辟的县城,无论其外部task何时结束,也无论fork何时跳转执行后面的程序,都不会将其开辟的线程自动结束.你需要考虑的是他们是否会在接下来影响你的环境,或者由于反复开辟线程而形成僵尸线程.比较安全的方法是在fork满足需求之后,通过变量,旗语,或者更直接的disable fork,去终止这些线程.

 

  • $test$plusargs(string)

在对verilog代码进行编译时,我们会在代码中引入`ifdef, `elsif, `endif等条件编译指令,然后在编译时指定宏来对编译代码范围进行控制。系统函数$test$plusargs的目的就是用来替换这些条件编译指令的。条件编译会在编译阶段生效,而系统函数$test$plusargs则会在仿真阶段生效。换句话说,当参数发生变化时,你不需要重新编译代码,只需要改变参数重新运行仿真即可。

Q:既然系统函数$test$plusargs这么好,那么是不是条件编译指令就没有用武之地了?

A:好处是有代价的,引入系统函数会让你的编译变得更庞大(预编译只对相应代码编译,其它部分即使语法错误也不管),而且simv的运行效率更低。事实上,synopsys官方都不建议我们直接使用该函数: For this reason, Synopsys recommends that if you use this technique, you should plan to abandon it fairly early in the development cycle and switch to either the conditional compilation technique for writing simulation history files, or a combination of the two techniques.

 

  • $value$plusargs(user_string, variable)

用于在仿真时将一个参数传递至内部信号。user_string格式可以变化

  1. %d decimal conversion
  2. %o octal conversion
  3. %h hexadecimal conversion
  4. %b binary conversion
  5. %e real exponential conversion
  6. %f real decimal conversion
  7. %g real decimal or exponential conversion
  8. %s string (no conversion)
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页