目录
Q76.package如何使用
Q77.如何在子类中调用父类中的方法
Q78.bit[7:0]和byte有什么区别
Q79.类中的方法和类外的方法有什么区别
Q80.如何将类中的方法定义在类外
Q81.modport的用途是什么
Q82.struct和union的异同
Q83.$rose和posedge区别
Q84.如何在fork...join结构中kill进程
Q85.什么是覆盖率驱动的验证
Q86.如何检查句柄是否指向有效对象
Q87.semaphore用处是什么
Q88.为什么要使用断言
Q89.如何在clocking block中声明异步信号
Q90.代码覆盖率和功能覆盖率的关系
Q91.什么是验证计划,应该包含哪些部分
Q92.类中的静态方法使用注意事项有哪些
Q93.initial和final的区别
Q94.建模存储器,使用什么类型的数组
Q95.如何避免测试平台和dut之间的竞争冒险
Q96.logic、bit、wire区别
Q97.什么是抽象类
Q98.always@*与always_comb区别
Q99.简述验证结构
Q100.parameter、define和typedef之间区别
Q76.package如何使用
package用于将软件进行包装,以此来与全局的命名空间进行隔离。可以通过import对package进行引用,使package在该空间中可见,切记只是引用,而非定义,如果该空间也被定义为package,在下一个空间中引用,则第一次的package将不在可见,但是可以通过export进行重新引用,可见。
Q77.如何在子类中调用父类中的方法
子类可以通过使用super来调用父类的方法。
Q78.bit[7:0]和byte有什么区别
bit[7:0]表示8位二进制数;
byte表示一个字节,1byte=8bit;
Q79.类中的方法和类外的方法有什么区别
为了保证类的良好可读性,经常搭配extern使用,将类中的一些方法定在在类的外部;从功能实现的角度来看,类内和类外的方法没有明显区别。
Q80.如何将类中的方法定义在类外
例如:
class Test; int a,b; extern display(); endclass function Test::display(); $display("the value is %d",a+b); endfunction
Q81.modport的用途是什么
modport应用于interface中,用于将接口信号分类,其相当于一个小型的接口模块,以方便相同类型的信号接口在进行连接时使用,可指定信号的输入输出类型。
Q82.struct和union的异同
union ( 共用体):构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)struct ( 结构体 ):是一种构造类型
用途: 把不同的数据组合成一个整体——自定义数据类型
主要区别:
1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员; 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的,一个struct变量的总长度等于所有成员长度之和,遵从字节对其原则; 在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在 , Union变量的长度等于最长的成员的长度。2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了,所以,共同体变量中起作用的成员是最后一次存放的成员; 而对于struct的不同成员赋值是互不影响的。
Q83.$rose和posedge区别
$rose和posedge都是用来捕捉边沿,但定义有所不同:
Define : 数值由0->1的时刻
Define :在仿真中$rose并不是单纯的判断信号的跳边沿,而是判断时钟采样信号前后是否存 在0->1/x->1/z->1的变化。
Q84.如何在fork...join结构中kill进程
disable fork会kill disable fork 所在的当前线程以及所有子线程;
更多细节参考:[SystemVerilog] fork join_none_lbt_dvshare的博客-CSDN博客SV中用的比较多的是fork…join_none,以及disable fork,wait fork; 其中,wait_fork会阻止当前线程,直到所有子线程完成; disable fork会kill disable fork 所在的当前线程以及所有子线程; The parent process continues to execute concurrently with all the...https://blog.csdn.net/lbt_dvshare/article/details/81236313?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167013489416782395375327%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167013489416782395375327&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-10-81236313-null-null.142%5Ev67%5Econtrol,201%5Ev3%5Eadd_ask,213%5Ev2%5Et3_control1&utm_term=%E5%A6%82%E4%BD%95%E5%9C%A8fork...join%E7%BB%93%E6%9E%84%E4%B8%ADkill%E8%BF%9B%E7%A8%8B&spm=1018.2226.3001.4187
Q85.什么是覆盖率驱动的验证
覆盖率驱动(CDV)验证是指通过覆盖率的收集去衡量验证进度,换句话说,就是我们验证了半天,究竟验证到什么地步,通过验证率来衡量。首先要保证验证的完备性,要求我们能识别的点都要验证到,需要说明,并不是验证率达到要求,就可以说验证ok了,只能说我们的风险变小了,不能说一点风险没有。
Q86.如何检查句柄是否指向有效对象
句柄相当于时指针,也就是地址指向,判断其是否指向有效对象可以理解为判断该地址索引下的空间是否有值,有值即认为是有效的。
Q87.semaphore用处是什么
当多个线程访问同一资源的时候,而这个资源只允许一个线程访问的时候,就可以用旗语来进行控制;如果把资源比作为一个仓库的话,旗语就相当于一把钥匙,每个线程需要拿到钥匙后才能对资源进行访问。当然也可以有多把钥匙,对应同一资源可以同时被访问的最大数量。
旗语有如下几个操作函数:
new(); //对“钥匙”进行实例化
get(); //线程获取钥匙,阻塞
put(); //线程将钥匙放回,阻塞
try_get(); //非阻塞
参考文章:SV学习笔记—线程之间的通信(事件event、信箱mailbox、旗语semaphore)_Verification_White的博客-CSDN博客_sv event0.前言若多个线程之间想要进行数据交换或者知道彼此的状态以决定执行什么线程,SV中通过event、mailbox、semaphore来进行线程通信。其中event是2个线程之间的通信,semaphore是≥2个线程之间的通信。1.事件event当我们需要一个进程在另一个进程触发事件的时候运行该怎么办?SV中引入了event来解决这个问题。其语法如下:触发:-> (非阻塞)(类比于接电话)等待:@ or wait(阻塞)(类比于打电话)注意:若用->和@搭配,一定要先@再-https://blog.csdn.net/qq_41337361/article/details/122723681?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167013695416782395369816%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167013695416782395369816&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-122723681-null-null.142%5Ev67%5Econtrol,201%5Ev3%5Eadd_ask,213%5Ev2%5Et3_control1&utm_term=SV%20semaphore&spm=1018.2226.3001.4187
Q88.为什么要使用断言
- 使用断言可以缩短研制周期;
- 使用断言可以使设计中存在的各种问题更容易被动态监测观察;
- 使用断言内嵌的覆盖率统计功能(cover)可以更加容易的获得对于功能的覆盖性;
- 断言的可读性较一般描述语言更容易理解;
- 通过全局控制实现设计中断言的开关;
- 断言可以加速形式验证,提高形式验证的效率;
Q89.如何在clocking block中声明异步信号
Q90.代码覆盖率和功能覆盖率的关系
代码覆盖率和功能覆盖率,二者无必然的联系。而为了保证验证的完备性,在收集覆盖率时,要求代码覆盖率和功能覆盖率同时达到要求。
如果你收集的代码覆盖率很高但是功能覆盖率却很低,这个可能是:
- design没有完全按照功能spec文档规格实现所有功能,设计不完善;
- 验证平台monitor监视器存在漏洞,设计代码实现了功能但没有覆盖到他们;
- 功能正确,但是发送的激励不对,对应功能的覆盖率无法收集。
如果你收集的功能覆盖率很高但是代码覆盖率却很低,这可能是:
- 设计代码没有按照spec实现功能,在design中是无效代码,
- 用户定义的功能覆盖率收集存在错误,没有完全定比覆盖率收集的边界,测试计划未捕获所有设计功能/场景/边界,或者缺少功能覆盖率监视器。
- 代码覆盖率中未覆盖的设计代码可能会映射到这些功能上。
- 在实现功能覆盖率监视器时可能存在潜在的错误,导致它们收集了错误的覆盖率。因此,在验证项目中,对用户定义的功能覆盖率指标及其实现进行适当的检查很重要。
Q91.什么是验证计划,应该包含哪些部分
一般的验证计划会从技术和项目角度去制定:
- 从技术角度而言,我们需要考虑的有验证的功能点,验证的层次,测试用例,验证方法和覆盖率要求;
- 从项目部分来看,我们也需要考虑使用的工具,人力安排,进度安排和风险评估。
Q92.类中的静态方法使用注意事项有哪些
- 静态方法只能访问类的静态属性,而访问非静态属性是非法的,会导致编译错误。
- 静态方法不能是虚拟的(virtual)
Q93.initial和final的区别
initial过程语句在仿真开始的时候启用,一个initial过程语句只执行一次,当语句执行完后,它的活动就停止了。
final过程在仿真结束时启用,并且只执行一次,final过程类似于initial过程,它定义了一个语句过程块,不同的是它发生在仿真时间的末尾,并且执行时没有延迟。finial通常用于显示有关仿真的统计信息。
Q94.建模存储器,使用什么类型的数组
存储器属于寄存器数组类型,一般利用二位数组进行建模。
Q95.如何避免测试平台和dut之间的竞争冒险
- Module中的initial语句块调度在active region, Program中的initial语句块调度在reactive region。
- 在program中使用非阻塞赋值来驱动设计信号,在re-NBA区域对其进行更新。
- 通过带有 #0 input skews的clocking blocks。
Q96.logic、bit、wire区别
Wire:用于连接不同的元件,不存储值,被连续赋值(assign)或端口(port)驱动。
Reg:并不意味实际的存储器,代表verilog/sv 中的数据存储元素,保存值,直到被下一次赋值(阻塞或非阻塞),可被综合为触发器,锁存器或组合电路。过程赋值
Logic:不能被多驱动,改进reg数据类型,可以被连续赋值, 过程赋值
Q97.什么是抽象类
抽象类又称为虚类,如virtual class bus;
抽象类可以被继承,拥有类的封装功能但是不可以被直接例化使用。
Q98.always@*与always_comb区别
always是循环执行语句,与原始的always块不一样的是,三个新的always块是专门针对可综合性RTL逻辑建模而定义的,而原始always块则是万金油。事实上,always_ff, always_comb, always_latch能实现的,always都能够实现。
[always_comb]
always_comb用于可综合组合逻辑的建模,不需要明确地定义敏感列表。缺省地,所有出现在always_comb中所有input信号(从always_comb的外部获得赋值,出现在块内赋值语句的右边,或者条件判断语句中出现的信号,等等)都被推断属于它的敏感列表。但是内部定义的用阻塞方式进行赋值的临时变量不属于敏感列表。
always_comb与always @(*)在表达组合逻辑时几乎是等价的,但是仍然存在细微的区别。
[always_ff]
always_ff用于可综合时序逻辑的建模。
必须带由posedge或者negedge所定义的敏感列表。通常就是”@(posedge clock, negedge resetN”.
在always_ff块中只能使用非阻塞赋值。
[always_latch]
由于在一般的同步设计中是不允许(或至少不推荐)使用latch式设计,所以这里不作说明。在一般的设计中不用它就是了。
Q99.简述验证结构
- 测试平台(testbench)是整个验证系统的总称,它包括验证结构中的各个组件、组件之间的连接关系、测试平台的配置和控制。从更系统的意义来讲,它还包括编译仿真的流程、结果分析报告和覆盖率检查等。
- 从狭义上讲,我们主要关注验证平台的结构和组件部分,他们可以产生设计所需要的各种输入,也会在此基础上进行设计功能的检查。
Q100.parameter、define和typedef之间区别
define:作用 -> 常用于定义常量可以跨模块、跨文件;
范围 -> 整个工程;
parameter: 作用 -> 常用于模块间参数传递;
范围 -> 本module内有效的定义;typedef:作用-> 用来创建新的数据类型;
范围 -> 本module内有效的定义;
参考文献:Systemverilog 语法相关_Holden_Liu的博客-CSDN博客简化数据define RTL 层级路径`define TB_TOP top`define RTL_WRAPPER `TB_TOP.ip_core`define IP_ENGINE_TOP `RTL_WRAPPER.u_ips_engine_top// Register// generate// for(i=0;i<4;i...https://blog.csdn.net/Holden_Liu/article/details/104961039?ops_request_misc=&request_id=&biz_id=102&utm_term=SV%20parameter%E3%80%81define%E5%92%8Ctypedef%E4%B9%8B%E9%97%B4%E5%8C%BA&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-104961039.142^v67^control,201^v3^add_ask,213^v2^t3_control1&spm=1018.2226.3001.4187