1. component和object的区别?item是component还是object?
component也是由object派生出来的,不过相比于object, component有很多其没有的属性,例如phase机制和树形结构等。
在UVM中,不仅仅需要component这种较为复杂的类,进行TB的层次化搭建,也需要object这种基础类进行TB的事务搭建和一些环境配置等。uvm_sequence_item是object;
2.virtual sequencer 和sequencer的区别?
virtual sequencer是面向多个sequencer的多个sequence群,而sequencer是面向一个sequencer 的sequence群。
virtual sequencer桥接着所有底层的sequencer的句柄,其本身不需要传递item,不需要和driver连接。只需要将其内部的底层sequencer句柄和sequencer 实体对象连接。
3. sequence,sequencer,driver之间的通信
无论是sequence还是driver,它们通信的对象都是sequencer。当多个sequence尝试挂载到同一个sequencer上时,会涉及到sequencer的仲裁功能。sequencer作为sequence与driver之间握手的桥梁,扮演着重要的角色。我们将重点分析sequencer是如何通过以下三个类的主要方法,演示出完整的TLM(事务级模型)通信过程:
1. `create_item()` - 序列项的创建。
2. `start_item()` - 序列项的开始,尝试从sequencer获取执行权限。
3. `randomization` - 序列项的随机化。
4. `get_next_item()` - 当driver一侧没有item可以使用时,尝试从sequencer获取item。
5. `finish_item()` - 序列项完成,通知sequencer。
6. `get item` - 确认获取到item。
7. `item_done(RSP)` - 表示driver与sequence完成了一次item的握手传输,RSP可能作为状态返回值。
8. `get item-response(RSP)` - 从driver获取返回的数据对象。
9. `pin level drive` - 驱动到与DUT(Device Under Test)连接的接口。
10. `loop finished` - 循环完成。
对于sequence来说,无论是flat sequence还是hierarchical sequence,流向sequencer的都是sequence item。每个item的"成长周期"起始于`create_item()`,然后通过`start_item()`尝试从sequencer获取执行权限。sequencer的仲裁机制和使用方法在此略过。driver一侧通常处于"吃不饱"的状态,如果没有item可用,将调用`get_next_item()`尝试从sequencer获取item。在sequencer将权限交给底层的sequence前,目标sequence中的item应该完成随机化,然后在获取sequencer的权限后执行`finish_item()`。
接下来,sequence中的item将穿过sequencer到达driver一侧,这标志着sequencer第一次充当通信桥梁的角色完成。driver在得到新的item后,提取有效数据信息并驱动到与DUT连接的接口上。完成驱动后,driver通过`item_done()`告知sequence数据传送完成,sequence在获取该消息后表示driver与sequence双方完成了这次item的握手传输。在此过程中,driver可以选择将RSP作为状态返回值传递给sequence,而sequence也可以选择调用`get_response(RSP)`等待从driver一侧获取返回的数据对象。
4.代码覆盖率、功能覆盖率和断言覆盖率的区别?
a. 代码覆盖率是针对RTL设计代码的运行完备度的体现,包括行覆盖率、条件覆盖率、FSM覆盖率、跳转覆盖率、分支覆盖率;
b. 功能覆盖率用于与spec比较来判断design是否行为正确,需要按verification plan来比较进度。用来衡量哪些设计特征已经被测试程序测试过的一个指标;验证的目的就是确保设计在实际环境中的行为正确。设计规范里详细说明了设备应该如何运行,而验证计划里则列出了相应的功能应该如何激励、验证和测量
c. 断言覆盖率:用于检查几个信号之间的关系,常用在查找错误,主要是检查时序上的错误,测量断言被触发的频繁程度。
5.设计流程和验证流程?
验证流程:
阅读功能描述文档à准备验证计划à提取验证功能点à绘制验证结构à搭建验证环境à编写测试用例à定义功能覆盖率à发现缺陷和验证计划修复à回归测试-收集覆盖率à分析覆盖率、修改或添加测试用例
最终全面通过回归测试和满足覆盖率要求
设计流程:
a.芯片架构: 定义芯片的高层架构,包括不同的功能模块和它们之间的接口。
b.RTL设计: 使用硬件描述语言(如Verilog或VHDL)进行寄存器传输级(RTL)的设计。
c.功能仿真: 对RTL设计进行仿真,以验证其是否满足预期的功能。
d.综合&扫描链的插入(DFT): 将RTL代码转换为门级或更低层次的表示,同时进行可测试性设计(DFT),例如插入扫描链。
e.等价性检查: 确保综合后的网表与原始RTL设计在功能上是等价的。
f.形式验证: 使用形式化方法验证设计满足规范要求,如属性检查。
g.静态时序分析(STA): 检查设计是否满足时序要求,确保信号在规定的时间内稳定。
h.布局规划: 确定芯片上不同模块的物理位置,优化性能、功耗和面积。
i.布局布线: 实际地在硅片上放置电路元件并连接它们。
j.布线图和原理图比较: 将布线后的版图与原理图进行比较,确保它们匹配。
k.设计规则检查(DRC): 检查版图是否符合制造工艺的设计规则。
l.GDII: 应为GDSII,是芯片版图数据的最终输出格式,用于制造。
6. 断言的概念和作用,立即断言和并行断言?
断言是设计的属性描述。如果在一个仿真中被检查的属性不像我们期望的那样表现,那么这个断言将失败;如果一个被禁止在设计中出现的属性在仿真中出现,那么这个断言将失败。
立即断言(immediate assertion) :非时序的,可以在initial/always过程块或者task/function中使用;
并行断言(concurrent assertion ):时序性的。关键词property用来区分立即断言和并行断言。之所以称之为并行,是因为它们与设计模块一同并行执行;
equence 是用来表示在一个或多个时钟内的时序描述。
7.什么是形式验证?
形式验证使用数学方法来证明硬件设计的正确性。它不依赖于仿真的测试向量,而是使用算法来检查设计的所有可能状态。
形式验证方法分为等价性验证、模型检验和定理证明等。
应用:a.RTL代码与规范的一致性;b.综合后网表与RTL的等价性;
c.不同综合优化级别下的网表比较;d.时钟树综合后的网表与原始网表的等价性
8. Break;continue;return的含义,return之后,function里剩下的语句会执行吗?
break 语句结束整个循环;
continue 立即结束本次循环,继续执行下一次循环;
return语句会终止函数的执行并返回函数的值(如果有返回值的话);
return之后,function里剩下的语句不能执行,其是终止函数的执行,并返回函数的值;
9. 断言$past, $stable, $fell, $rose,$isunknow的用法
$rose() 0到1 变化
$fell() 1到0 变化
$stable() 稳定没有变化
$past(a,2)表示a信号前2个周期的信号值;
$isunknow()表示检测信号值是否存在X态或Z态;
10. Rand 和randc的区别?
rand修饰符:rand修饰的变量,每次随机时,都在取值范围内随机取一个值,每个值被随机到的概率是一样的,就想掷骰子一样。
randc修饰符:randc表示周期性随机,即所有可能的值都取到过后,才会重复取值