验证知识点记录随笔
- 怎么验支持不同的波特率
配置典型的波特率,通过scoreboard的数据发送接收是否正确验证支持不同波特率
- task和function区别
a. 函数能调⽤另⼀个函数,但不能调⽤任务,任务能调⽤另⼀个任务,也能调⽤另一个函数;
b. 函数总是在仿真时刻0就开始执⾏,任务可以在⾮零时刻执⾏
c. 函数⼀定不能包含任何延迟、事件或者时序控制声明语句,任务可以包含延迟、事件或者时序控制声明语句
d. 函数⾄少有⼀个输⼊变量,可以有多个输⼊变量,任务可以没有或者多个输⼊(input)、输出(output)和双向(inout)变量
e. 函数只能返回⼀个值,函数不能有输出(output)或者双向(inout)变量,任务不返回任何值,任务可以通过输出(output)或者双向(inout)变量传递多个值
- 基本验证平台
- driver sequence sequencer通信机制
在sequence中,通过uvm_do宏产生transaction交给sequencer,而driver通过get_next_item/try_next_item不断向sequencer申请transaction,当driver取走一个transaction后,uvm_do宏不会立即返回执行下一次的uvm_do宏,而是等待driver返回item_done信号,此时uvm_do宏执行一次完毕,返回后开始执行下一次uvm_do,产生新的transaction
- 继承的关键词
extends
- 子类调用父类的方法关键词
super
- active agent 和 passive agent的区别
用is_active区别;内部component不同,active agent 有driver、sequencer和monitor,passive agent只有monitor
- master agent和slave agent
控制流方向不同,master是tb向dut发起控制;slave是dut向tb发起控制
根据is_active的值可以将agent分为passive模式和active模式。当处于active模式时,需要例化driver monitor sequence,既有激励功能也有监测功能;当处于passive模式时,只可以例化monitor,就只有监测功能,更利于环境复用。
根据总线的传输方向划分,agent又可以分为master和slave. Master agent 是用来向DUT发起transaction,Slave是用来响应DUT的event。
- sequence的核心task
body
- setup time、hold time
setup time: 输入数据在时钟上升沿到来之前必须保持稳定不变的时间
hold time: 在时钟上升沿到来之后输入数据
建立时间:Tdata_path + Tsetup <= Tclk_path + Tperiod
Tclk_delay_FF1+Tclk->q_FF1+Tcomb_logic+Tsetup <= Tclk_delay_FF2 + Tperiod
Max_data_path +Tsetup <= Tclk_path_min+Tperiod
保持时间:Tdata_path – Thold >= Tclk_path
Tclk_delay_FF1+Tclk->q_FF1+Tcomb_logic>=Tclk_dalay_FF2
Min_data_path_delay – Thold >= Max_clk_path_delay
数据跑的越快(Tdelay越小),时钟延迟越大,对Tsetup越有利
Tsetup与时钟周期有关,时钟周期越小,越容易出现违例,而Thold与时钟周期无关,在设计中,常常关注的是Tsetup是否满足要求,其关系到所能使用的最小时钟周期有多小,能否跑到预定的工作频率。
时钟通常走的是专门的快速通道,很难出现时钟传输延迟过大的问题,通常不会出现hold违例
- get next item 和try next item 的区别
阻塞和非阻塞
get_next_item() 是⼀个阻塞调⽤,直到存在可供驱动的 sequence item 为⽌,并返回指向 sequence item 的指针。try_next_item() 是⾮阻塞调⽤,如果没有可供驱动的 sequence item ,则返回空指针。
- layer sequence
layer sequence的方式:在多个sequence中产生多种transaction,然后利用sequencer之间TLM通信,将ip包给tr包。
- uart的数据位传输顺序
低位到高位
- logic类型和bit类型的区别
logic四值逻辑0、1、x、z;多驱动时为x态;适用于设计
bit二值逻辑0、1;初值为0;
- SV中的变量有哪些(四值、二值、数组、队列、结构体,尤其是压缩和非压缩,对于枚举类型和字符串问的少),超级多人问,好好看看
四值逻辑:reg,integer,logic,net-type
二值逻辑:byte(8bit),shortint(16bit),int(32bit),longint(64bit),bit
有符号类型:byte,shortint int,longint,interger
无符号类型:bit,reg,logic,net-type
- 为什么在SV中要引入Verilog中没有的二值逻辑?
为了使验证激励只为0 or 1,二值逻辑可以节省内存空间,并且可以加快仿真速度。
- 结构体和联合体:
(1) 结构体struct:各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
(2) 联合体union:各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名U2直接赋值或其他操作。
(3) 结构体和联合体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),联合体占用的内存等于最长的成员占用的内存。联合体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
- 三个等号和两个等号的区别(“=”与“”的区别)
1、===:称为等同符,当两边值的类型相同时,直接比较值,若·类型不相同,直接返回false;
2、==:称为等值符,当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较;
如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较,如果是对象则先.toString()之后再进行比较
如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等
null 和 Undefined 与其他值进行比较就不相等
null == 1 //false
null == 0 //false
undefined == 0 //false
undefined == 1 //false
null == undefined // true
null === undefined // false 类型不一样
NaN==NaN //返回false,NaN和所有值包括自己都不相等。
-
队列的基本操作有哪些?
-
动态数组怎么使用?我在new[5]之后还可以删两个元素吗?
-
fork join_any块中有个从0到9的打印,打印结果?
-
config db
Config_db 机制主要作⽤就是传递参数使得 TB 的可配置性⾼,更加灵活。
(1)set:自顶层向下set,如从top_tb向driver设置参数,即在top_tb中set。
uvm_config_db#(int)::set(this, “env.agt.drv”, “num”, 100);
第一个参数this与第二个参数“env.agt.drv”——构成目标路径
第三个参数是传给该路径的哪个成员;
第四个参数是要设置的值。
(2)get:从底层向顶层get,如从driver中的build_phase使用get。
uvm_config_db#(int)::get(this, “”,“num”, pre_num);
第一个参数必须是uvm_component实例的指针,第二个参数是相对此实例的路径。一般的,如果第一个参数被设置成this,第二个参数可以是一个空的字符串。
(sequence中config_db的set第一个参数:uvm_root:get();get的第一个参数:null)
第三个参数要与set中的第三个参数严格一致。
第四个参数是要设置的值。
(3)config_db使用场景
1)传递virtual interface到环境中。一般driver、moniter与DUT连接时使用config_db传递virtual interface。SV中层次化的interface的索引传递,不利于软件环境的封装和复用。
2)设置单一变量值,例如int、string、enum。
3)传递配置对象(config object)到环境。
Config_db 的参数主要由四个参数组成,如下所示,第⼀个参数为⽗的根 parent ,第⼆个参数为接下来的路径,对应的组件,第三个是传递时的名字(必须保持⼀致),第四个是变量名。
uvm_config_db #(virtual interface) ::set(uvm_root:.get(),“uvm_test_top.c1”,'vif",vif);
uvm_config_db #(virtual interface) :: get(this,"”,“vif”,vif);
- 为什么需要phase机制
phase 机制主要是使得 UVM 的运⾏仿真层次化,使得各种例化先后次序正确。核心是使得component同步
不同componment的同个phase之间是同步的,就是他们的main phase/build phase是同时完成的,比如drive的main phase100us就可以完成,但monitor的main phase 需要200us,但driver需要等待monitor100us才能一起进入下一个phase阶段。但这种同步不仅适用于不同componment的动态运行phase之间,还适用于run_phase和run_phase之间。
- run phase和main phase的关系
并行执行、互不干扰的关系
- 一个apb的传输需要几个时钟周期
2个时钟周期 setup和enable
- 时序逻辑电路和组合逻辑电路区别
组合逻辑的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原本的状态无关
时序逻辑是Verilog HDL 设计中另一类重要应用,其特点为任意时刻的输出不仅取决于该时刻的输入,而且还和电路原来的状态有关。电路里面有存储元件(各类触发器,在FPGA 芯片结构中只有D 触发器)用于记忆信息,从电路行为上讲,不管输入如何变化,仅当时钟的沿(上升沿或下降沿)到达时,才有可能使输出发生变化。
与组合逻辑不同的是:
(1)在描述时序电路的always块中的reg型信号都会被综合成寄存器,这是和组合逻辑电路所不同的。在组合逻辑电路描述中,将信号定义为reg型,只是为了满足语法要求。
(2)时序逻辑中推荐使用非阻塞赋值“<=”。
(3)时序逻辑的敏感信号列表只需要加入所用的时钟触发沿即可,其余所有的输入和条件判断信号都不用加入,这是因为时序逻辑是通过时钟信号的跳变沿来控制的。
组合逻辑与时序逻辑的对比
1、组合逻辑的输出状态与输入直接相关,时序逻辑还必须在时钟上升沿触发后输出新值。
2、组合逻辑容易出现竞争、冒险现象,时序逻辑一般不会。
3、组合逻辑的时序较难保证,时序逻辑更容易达到时序收敛,时序逻辑可控。
4、组合逻辑只适合简单的电路,时序的逻辑能够胜任大规模的逻辑电路。
-
fork join、fork join_any、fork join_none的区别
-
bulid_phase的顺序、为什么
自上而下、从树根出发,形成uvm树状结构
- connect_phase的顺序、为什么
自下而上、方便找父亲
- apb2.0和apb3.0的区别
多了Pready和pslaver
APB2.0和APB3.0的差别:APB3.0提供了一个低功耗的接口,并降低了接口的复杂性。且APB3比APB2增加了两个信号:
PREADY:来扩展APB传输,主要是增加延时;
错误信号PSLVERR: 来指示传输失败
APB3和APB4的差别:
增加了PROT和PRSTB两个信号。
PPROT一种保护信号,用于支持APB上的非安全交易和安全交易。
PSTRB一个写选通信号,用于在写数据总线上进行sparse data transfer(稀疏数据传输)。APB4用的比较少。
- APB时序(含PREADY的时序图):
1、IDLE:系统初始化状态,此时没有传输操作,也没有选中任何从模块。
2、SETUP:启动状态,当有传输要进行时,PSELx=1,,PENABLE=0,系统进入SETUP状态,并只会在SETUP状态停留一个周期。当PCLK的下一个上升沿到来时,系统进入ENABLE状态。
3、ENABLE:在总线进入SETUP状态的下一个时钟上升沿处,需将PENABLE信号拉高进入ENABLE状态。在这个上升处,master必须保持PADDR、PSEL、PWRITE不变。传输也只会在ENABLE状态维持一个周期,在经过SETUP与ENABLE状态之后就已完成。之后如果没有传输要进行,就进入IDLE状态等待;如果有连续的传输,则进入SETUP状态。
32. APB协议中PREADY*是什么?(握手信号)
- TLM FIFO的优点、port与export的区别
主动与被动、TLM FIFO使得双方
- lock与grap的区别
当需要独占sequence时、可以使用lock
- soft constraint
优先级较低,不会影响导致报错
- mater agent 和slave agent
控制流:tb发向dut;dut发向tb
- Virtual sequence和virtual sequencer中virtual含义
Virtual含义就是其sequencer 并不需要传递item,也不会与driver连接,其只是一个去协调各个sequencer的中央路由器。通过virtual sequencer我们可以实现多个agent的多个sequencer他们的 sequence的调度和可重用。Virtual sequence可以组织不同sequencer 的sequence群落。
一个virtual sequencer可以通过它的subsequencer产生许多种不同类型的tranction。而virtual sequencer的作用就是在协调不同的subsequencer中sequence的执行秩序了。
- sequence item和sequence的区别
一个sequence可以包含一些有序组织起来的item实例,考虑到item在创建后需要被随机化,sequence在声明时也需要预留一些可供外部随机化的变量,这些随机变量一部分是用来通过层次传递约束来最终控制item对象的随机变量,一部分是用来对item对象之间加以组织和时序控制的。(sequence在加载item时,同样可以配置一些变量,这些变量可以传递给到item,也可以对item之间进行时序控制,非常灵活)
-
uvm low和uvm high区别
-
code coverage包括
line、toggle、condition、branch、FSM
- lock和grab
uvm_sequencer提供了两种锁定机制,分别通过lock()和grab()方法实现,其区别在于:
lock请求时被插入sequencer仲裁队列的最后面,申请lock操作的sequence回按照sequencer的仲裁机制获得授权,一旦获得,便会独占sequencer的所有权,直到unlock操作被调用。lock()是一种阻塞任务,只有获得了权限,它才可以返回。
grab请求真被放到sequencer仲裁队列的最前面,它只需要在sequencer下一次授权周期时就可以无条件地获得授权。若一个sequence在使用grab任务获取sequencer的所有权前,另一个sequence已经lock任务获取所有权,则grab任务会一直等待lock的释放。
需要注意的是,如果sequence使用了lock()或grab()方法,必须在sequence结束前调用unlock()或ungrab()释放权限,否则sequencer会进入死锁状态而无法继续为其它sequence授权。
- 能说说UVM吗?(根据你说的内容再去进行提问)uvm的层次
答:uvm是一个库,我们根据库来进行验证环境的搭建,具备高复用性和兼容性,做新的项目时可以快速搭建验证环境,提高验证效率,所有的自建类都继承与封装好的原始库中的父类。
按照component来划分,然后说了各个组件实现了什么功能,数据流是如何传递的。
按照object也说了一部分,描述了工厂机制和phase机制。
- 你了解UVM的callback机制吗?
callback机制最大的用处就是提高验证平台的可重用性。它通过将两个项目不同的地方使用callback函数来做,而把相同的部分写成一个完整的env,这样重用时,只要改变相关的callback函数,env可以实现完全的重用。
此外,callback还用于构建异常的测试用例,通过factory机制的重载也可以实现这一点。
- 说一下深复制和浅复制
浅复制仅复制对象的所有属性,但不包括属性成员中句柄指向的对象
深复制创建一个新的和原始句柄指向的内容相同的字段,但两者的句柄指向的可见是不同的,内容变动互不影响。
- 14位的异步fifo如何验?
先简单验证一个复位功能是否正常,读写指针是否在复位后回0了;
然后验证数据是否能正常写入,正常读出;在异常状态,写满和读空时相应信号是否拉起;
然后验证不同时钟下同步读写是否正常,先是写数据快,读数据慢,同时为了避免上述rempty延迟的问题,采取了先写延迟读的方式;
读快写慢
- 为什么要用格雷码,好处是什么?自然二进制码转格雷码后为什么要还要打两拍?
异步FIFO使用格雷码的唯一目的就是:即使在亚稳态进行读写指针抽样也能进行正确的空满状态判断(假读空,假写满,不会导致功能错误,只会造成性能损失)
读慢写快,判断写满,慢踩快,不会漏采,不影响假写满
读快写慢,判断读空。慢踩快,不会漏采,不影响假读空
格雷码有两个作用,一是消除多个比特同时变化带来的潜在竞争与冒险,二是降低功耗(翻转次数减少)。
多比特信号的跨时钟域处理,由于格雷码相邻数据只有一个bit不同,因此,在进行跨时钟域传输时,只有发生变化的那个bit有可能处于亚稳态,而其余bit由于保持不变,因此是稳定的,故多比特格雷码的跨时钟域传输相当于单比特信号的跨时钟域传输,我们采用****打两拍****的方法即可处理。
- 亚稳态相关问题:什么是CDC(跨时钟与传输问题)?CDC为什么会产生亚稳态?建立时间和保持时间的概念?如何尽可能降低亚稳态的发生概率?单bit数据怎么进行跨时钟域的传输以及多bit如何进行跨时钟域的传输?
亚稳态:数据的转变没有符合时钟采样所需要的setup/holdtime时间,在时钟的上升沿或下降沿到来时正好采到数据的变化状态,此时,由于数据并没有稳定,所以会导致采到的数据不停变化,而不是逻辑0或者逻辑1,此时采到的数据会一致抖动,直到隔一段时间稳定。
处理亚稳态的方法:
(1)相位控制;
(2)多级寄存器;
(3)异步FIFO缓存;
单bit跨时钟域传输:
1.慢到快:打两拍
2.快到慢:先将脉冲信号展宽为电平信号;再打两拍;再进行边沿同步输出脉冲信号
- 如何跑仿真、查看覆盖率?
编写Make file,导入pkg文件、make all
dve -full64 -covdir simv.vdb &
urg -full64 -dir simv.vdb -report urgreport &
- 异步fifo的作用、机制、如何比较空满(设计上)
作用:用于解决跨时钟域数据传输问题
写满的判断:将读指针同步到写时钟域,若写指针超过同步后的读指针一周,则判断写满。由于原来的读指针大于或等于同步后的读指针,所以实际上写指针未必超过读指针一周,即“假写满”;
读空的判断:将写指针同步到读时钟域,若读指针追上了同步后的写指针,则判断读空.但由于原来的写指针大于或等于同步后的写指针,所以其实并没有追上,即“假读空”;
代码上设计:
读空:全部位相等
写满:最高位和次高位不同,其余位相同
- regmodel放在哪个层次
base_test
- uvm的case如何运行起来的(sequence、virtual sequence、case)
首先在导入uvm_pkg文件,会⾃动创建UVM_root所例化的对象UVM_top,通过uvm_top调用run_test()方法,查找Makefile中uvm_test_name后的case名,执行相应case,在case通过default_sequence隐式启动virtual_sequence。virtual_sequence派生自base_vseq,在base_vseq中declare p_sequencer,以及分别在pre_body和post_body中raise、drop objection。在virtual_sequence中调用virtual_sequencer中声明的sequencer指针执行相应的sequence。sequence中通过uvm_do宏产生transaction交给sequencer,而driver通过get_next_item/try_next_item不断向sequencer申请transaction,发送给dut,monitor检测dut输入与输出。
- uvm_agent和uvm_env
1 uvm_agent作为一个标准单元,可以例化在uvm_env中。
2 uvm_env也可以在更高层复用,被其他uvm_env嵌套,但agent不能嵌套agent
- 门控时钟
使用门控时钟的原因:减少时钟网络的功耗消耗,最直接的办法就是如果不需要时钟的时候,就把时钟关掉
结构:1.与门门控;很容易产生毛刺
2.使能信号用以clk为基准的锁存器锁存一下
摘自csdn博客@薄荷茶哈哈哈
- EN 信号再与上 CLK 得到
摘自csdn博客@薄荷茶哈哈哈
SOC 芯片设计中使用最多的是锁存结构的门控时钟:
原因:在实际的SOC 芯片中,要使用大量的门控时钟单元。所以通常会把门控时钟做出一个标准单元,有工艺厂商提供。那么锁存器结构中线延时带来的问题就不存在了,因为是做成一个单元,线延时是可控和不变的。而且也可以通过挑选锁存器和增加延时,总是能满足锁存器的建立时间,这样通过工艺厂预先把门控时钟做出标准单元,这些问题都解决了。
不用寄存门控时钟的原因:一个DFF 是由两个 D 锁存器组成的,采样 D 锁存器组成门控时钟单元,可以节省一个锁存器的面积。
54. 功耗
分类:静态功耗:泄露功耗,指电路处于等待或不激活状态时-泄露电流产生的功耗
动态功耗:电容充放电功耗和短路功耗,是由电路的翻转造成的,主要体现在元件的电平翻转时对负载电容的充放电及时钟的翻转
55. 低功耗设计
对设计中给定的驱动器,动态功耗由下式计算:
p=CL×VDD2×f
CL是电容负载,VDD是电源电压,f是开关频率。总功耗是每个驱动器功耗之总和。
在VDD固定的情况下,降低内部功耗就要降低平均逻辑开关频率,减少每个时钟沿处的逻辑开关总数、减少连线网络,特别是高频信号连线网络中的电容值。对低功率设计,需要从系统至工艺的每个设计级别中采取相应预防措施,级别越高,效果越好。
A.减少开关活动量的设计方法
B.时钟门控。门控信号与门控逻辑应正确地设计,以消除时钟线上的任何毛刺。
C.防护技巧。这是一种在块输出不用时防止输入信号使块开关工作的技巧。例如考虑一个乘法器,它的输出仅在某些特定条件下才使用。在此场合可增添一个锁存器,这样每当输出不用时,乘法器的输入将阻止不必要的开关动作带入乘法器。一个锁存器只需一个组合单元,并不占用过多芯片面积。
D.总线复用。在一个设计中采用时分复用宽总线技术,可减少总线的数量,有利于时序和功耗。再者,在DSP设计中,数据是相关的,这表明大多数数据位并未改变状态。携带相关数据的总线应尽量复用在一起,进一步减少MUX、DEMUX逻辑中的开关活动
E.减少毛刺与流水作业。毛刺是信号趋于稳定前不必要的开关动作。每个时钟沿改变了寄存器间组合逻辑的输入。对每个节点而言,不同的输入路径有不同的延时,它将多次改变状态。节点上的毛刺与该节点的逻辑深度,也就是节点至最初输入的逻辑门个数有关。**到达节点的逻辑锥体越深、越宽,毛刺也越多。降低逻辑深度,减少逻辑锥体的开关输入可减少这类毛剌。流水线、时序驱动合成以及逻辑单元的合理映射能减少逻辑级的数量。
流水线是又一种技巧,它在很长组合路径的中点引入寄存器。寄存器会增加等待时间,却能增加速度,减少逻辑级。引入附加寄存器增加了一定的功耗,然而能极大地减少毛剌。例如,一个用ACTGEN生成的流水线16×16位不带符号乘法器所消耗的功率比未使用流水线的同样器件少。
F.降低频繁开关转换信号的逻辑深度。重新安排“if-else”表达式,用户可将毛刺或快变化信号移至逻辑锥体的后部。这样既减少开关动作的传播,又降低了功耗。
G.选择功率低的数据通路元件。对计数器,Gray计数器具有最低开关率,应经常使用。对内部存储器寻址,也应使用Gray寻址。
H.状态机编码。状态机在传统上是按二进制编码的。然而采用Gray编码,相邻状态可减少瞬变的次数。有时不可能在所有状态中使用Gray编码,则应在状态矢量中增加触发器的数量以减少开关的次数。另一种方法是使用one-hot编码,虽然该编码使用的触发器较多,即可减少组合逻辑的使用,在带多个输出且每个输出是几个状态的函数的状态机中更是如此。
I.使用异步逻辑。异步复位:无论时钟沿是否·到来,只要复位信号到来,就对系统进行复位
同步复位:复位信号只有在时钟上升沿到来时才能有效
J.降低时钟速率
- 锁存器、触发器、寄存器
触发器(Flip-Flop):时钟触发,受时钟控制,只有在时钟触发时才采样当前的输⼊,产⽣输出。
锁存器: 由电平触发,⾮同步控制。在使能信号有效时锁存器相当于通路,在使能信号⽆效时锁存器保持输出状态。
(锁存器对输⼊电平敏感,受布线延迟影响较⼤,很难保证输出没有⽑刺产⽣;触发器则不易产⽣⽑刺。)
寄存器(register):用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。
-
Setup time 和 hold time
-
Setup Time Violation的解决方案
Setup时间公式:Tclka + Tco + Tcomb + Tslack = Tcycle + Tclkb + Tsetup,即Tslack = Tcycle + Tclkb + Tsetup -Tclka - Tco - Tcomb
其中Tclka和Tclkb是两个时钟偏斜,Tco是D->Q的传输延迟,Tcomb是组合逻辑延迟,Tcycle是时钟周期,Tsetup是建立时间,Tslack是建立时间裕量。如果出现了Setup Time Violation,也就是说Tsetupslack为负数了,那么可以考虑:
A. 增大时钟周期Tcycle,即降低时钟频率
B. 减小 D->Q的传输延迟Tco,即更换更快的器件,使用更先进的器件库
C. 减小 Tcomb,即减小组合逻辑延时,主要是关键路径的处理。包括插入寄存器使其流水、重定时等。
D. 增大时钟歪斜Tskew=Tclkb-Tclka。如果时钟歪斜 Tskew 为正,对setup是有利的,对hold是有害。
- Hold Time Violation的解决方案
Hold Time公式:Tclka + Tco + Tcomb = Tclkb +Thold + Tholdslack,即Tholdslack = Tco + Tcomb - (Tclkb - Tclka) - Thold.
其中Tclka和Tclkb是两个时钟偏斜,Tco是D->Q的传输延迟,Tcomb是组合逻辑延迟,Thold是建立时间,Tholdslack是保持时间裕量。如果出现了Hold Time Violation,也就是说Tholdslack为负数了,那么可以考虑:
A. 增大Tcmb:增加组合路径延时,通过插buffer、插delay cell、更换驱动、更换阈值的方法(组合逻辑深度的增加会增加芯片的面积、布线资源、功耗,可能产生在慢速工艺库条件下建立时间违例);
B. 插入低电平有效的锁存器(Lock-up Latch):高电平期间,锁存器输出保持不变,相当于人为将数据推迟了半个时钟周期,以保证满足hold时间要求。
C. 减小Tskew,甚至采用negative skew,但需做好时钟树的balance
- 律
- 时序知识
(1) 偏移skew:因时钟线长度或负载不同,导致时钟相邻单元的时间不同,时间上的偏差叫时钟偏移skew
偏移会一直存在,因此FPGA在设计时,会进行优化,采用全铜工艺和树状结构,设计专门的始终缓冲和驱动网络,使得时钟到达不同单元时的路径一样长,尽量减小偏移。所以,Skew 问题的解决方法就是:设计中的主要信号应该走全局时钟网络。
(2) 抖动Jitter
在理想情况下,一个频率固定的完美的脉冲信号(以1MHz为例)的持续时间应该恰好是1us,每500ns有一个跳变沿。但这种信号并不存在。如图所示,信号周期的长度总会有一定变化,从而导致下一个沿的到来时间不确定。这种不确定就是抖动(jitter)。时钟抖动也永远存在。
(3) 占空比失真Duty Cycle Distortion
占空比失真即时钟不对称,高电平和低电平时间发生变化。DCD会占用时间裕量(Slack)造成数字信号的失真,使过零区间偏离理想的位置。DCD通常是由信号的上升沿和下降沿之间时序不同而造成的。
(4) 扇入扇出Fan-in/Fan-out
数字电路中,逻辑门相互连接,每个逻辑门输出端与输入端都连着大量别的单元,因此由扇入扇出表示处理外部输入以及驱动外部其他单元的能力。
- 阻塞赋值与非阻塞赋值的区别
阻塞赋值(=):假如有两条赋值语句,阻塞赋值是两条语句顺序执行,先完成前一条语句的赋值,再完成下一条赋值语句的赋值。
非阻塞赋值(<=):假如有两条赋值语句,非阻塞赋值相当于两条语句并行执行,前面语句的执行不会阻塞后面语句的执行
- 竞争-冒险现象及其消除方法
(1) 竞争:将门电路两个输入信号同时向相反的逻辑电平跳变(一个从1变为0,一个从0变为1)的现象称为竞争。
只要存在竞争现象,输出就有可能出现违背稳态下逻辑关系的尖峰脉冲。
(2) 冒险: 由于竞争而在电路输出端可能产生尖峰脉冲的现象,称为竞争-冒险。
(3) 检测竞争-冒险现象的方法
a. 通过逻辑函数式判断组合逻辑电路中是否存在竞争-冒险现象存在:只要输出端的逻辑函数可以化简为Y=A+A’或Y=AA’则可以判定存在竞争-冒险现象。
b. 将计算机辅助分析的手段用于分析数字电路,从原理上检查复杂数字电路的竞争冒险现象提供了有效的手段,目前已有成熟的程序可供选用。
c. 通过实验来检查电路的输出端是否有竞争-冒险现象而产生的尖峰脉冲。
注意:只有实验检查的结果才是最终的结论。
(4) 消除竞争-冒险现象的方法
a. 接入滤波电容
原理:由竞争-冒险而产生的尖峰脉冲一般都很窄,所以只要在在输出端并接一个很小的滤波电容即可把尖峰脉冲的幅度削弱至门电路的阈值电压以下。
优缺点:优点是简单易行,缺点是增加了输出电压波形的上升时间和下降时间,使波形变坏。
b. 引入选通脉冲
原理:在电路中引入选通脉冲p,因为P的高/低电平出现在电路达到稳定状态以后,所以输出端不会出现尖峰脉冲。
优缺点:优点是比较简单且不需要增加电路元件,缺点是必须设法得到一个与输入信号同步的选通脉冲,且对选通脉冲的宽度和作用的时间均有严格的要求。
c. 修改逻辑/增加冗余项
原理:通过增加冗余项,使得在某些输入不变的情况下,其中一个变量无论怎么变,输出都是1,进而不会产生竞争-冒险现象。
优缺点:缺点是适用范围有限,优点是如果能使用该方法效果会比较好。
l硬件的解决方法:
1)增加滤波电容;
2)使用格雷码,一次只有一位改变;
3)利用冗余项法:代数法和卡诺图法。
l验证的解决方法:
1)延迟采样:在驱动时,添加相应的人为延迟,模拟真实的延迟行为,同时加大clk与变量之间的延迟,以此提高DUT使用信号时的准确度和TB采样信号时的可靠性;
2)提前采样:对于一些采样时依然存在delta-cycle延迟信号,我们还可以依靠在采样事件前的某一段时刻中进行采样,来模拟建立时间的采样要求,确保采样的可靠性
- 运算符
A. 逻辑与(&&)运算符两边的表达式的值都为true运算结果为true, 其余情况为false。
B. 逻辑或(||)运算符两边的表达式的值都为false运算结果为false, 其余情况为true
C. 按位与(&)参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当 相应位上全部为1时取1, 存在0时为0。
D. 按位或(|)参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要当 相应位上存在1时取1, 全部为0时为0。
E. 按位同或(⊙)参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当 相应位上的数字相同时取1, 不相同为0。
F. 按位异或(^)参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当 相应位上的数字不相同时取1, 相同为0。
G. 按位取反(~)参加运算的两个数,换算为二进制(0、1)后, 0变1, 1变0。
优先级: not>and>xor>or
- wait fork和disable fork的作用范围
A. wait fork:
会引起调用进程阻塞直到它的所有子进程结束,
一般用来确保所有子进程(调用进程产生的进程)执行都已经结束
B. disable fork:
用来终止调用进程的所有活跃进程, 以及子进程的所有子进程
注意:wait fork作用的父进程下的子进程,而不包括子进程下的子进程,而disable fork则是作用于父进程下的所有进程,包括子进程的子进程;
- Memory
(1) RAM:随机访问存储器(Random Access Memory),易失性。是与CPU直接交换数据的内部存储器,它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。当电源关闭时RAM不能保留数据。如果需要保存数据,就必须把它们写入一个长期的存储设备中(例如硬盘)。
(2) ROM:只读存储器(Read Only Memory),非易失性。一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。ROM所存数据稳定,断电后所存数据也不会改变。计算机中的ROM主要是用来存储一些系统信息,或者启动程序BIOS程序,这些都是非常重要的,只可以读一般不能修改,断电也不会消失。
- RTL设计指导原则之面积和速度互换
一个设计的时序要求很高,普通方法达不到设计频率,可以通过将数据流串并转换,并行复制多个操作模块,对整个设计采取“乒乓操作”和“串并转换”的思想进行处理,在芯片输出模块处再对数据进行“并串转换”。
(1) 串并转换 并串转换
例如输入数据流的速率是450Mbit/s,而在FPGA上设计的数据处理模块的处理速度最大为150Mbit/s,在这种情况就应该利用“面积换速度”的思想,至少复制3个处理模块。首先将输入数据进行串并转换,然后利用这3个模块并行处理分配的数据,最后将处理结果并串转换以满足数据速度的要求。
如何实现串并转换:
并串转换:移位寄存器
串并转换:位拼接操作
(2) 乒乓操作
“乒乓操作”是一个常常应用于数据流控制的处理技巧,乒乓操作的结构如下图所示:
数据缓冲模块一般是常用的存储单元,例如双口RAM(DPRAM)、单口RAM(SPRAM)、FIFO等。
第一个缓冲周期:将输入的数据流缓存到数据缓冲模块1;
第二个缓冲周期:通过输入数据选择单元的切换,将输入数据缓存到数据缓冲模块2,同时数据缓冲模块1通过输出数据选择单元输出数据;
第三个缓冲周期:通过输入数据选择单元的切换,将输入数据缓存到数据缓冲模块1,同时数据缓冲模块2通过输出数据选择单元的切换输出数据;
如此循环,直到输入结束。
乒乓操作有两个优点:1、完成数据的无缝缓冲与处理;2、节约缓冲区空间。
(3) 流水线设计
流水线特点:通过插入寄存器,将长的串行逻辑链分成较小的部分;当系统运算是串行的时候,利用时钟控制,使运算依照顺序接续进行;在任何给定时刻,大部分电路都在工作。
流水线好处:每一部分延时较小,可以使用更快的时钟;大部分电路同时进行运算,可以提高数据通过量。
电路的最高频率取决于最长组合逻辑链路(Tpipe)的延迟值,所以减少最长组合逻辑链的延迟值,有利于提高电路速度。
- 压缩数组和非压缩数组
压缩数组是连续存储的位的集合,通常称为向量。非压缩数组是网络或变量的集合。
- C++四种类型转换总结
(1) const_cast:去掉类型的const或volatiles属性
(2) static_cast:无条件转换、静态类型转换:基类和子类之间的转换、基本数据类型转换、把任何类型的表达式转换成void类型 ----基本类型的转换
不能去掉类型的const或volatiles属性
不能进行无关类型的(非基类和子类)指针之间的转换(reinterpert_cast)
(3)dynamic_cast;有条件转换、动态类型转换、运行时检查类型安全(必须有虚函数) ------多态类之间的转换
(4) 仅重新解释类型,但没有进行二进制的转换 ----不同类型的指针类型转换
- TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。
TCP
TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、 流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。
-
流操作符?
-
SV中的past函数是什么意思?
-
sequence的三种启动方式?
-
谈谈你对factory机制的理解
-
例化时,creat和new有什么区别?
-
uvm_component和uvm_object的区别?
-
约束的函数有啥?有个正态约束函数?这个我也不知道
-
权重约束的关键字(dist)
-
sequence中未定义,但在monitor中有定义的变量,如何使sequence也能得到?
78.定义一个全局变量
-
断言中的蕴含操作符
-
UVM中有哪些通信机制?
-
变量默认是动态的?所以想让他是静态的需要加关键字(static)?强制转换函数?转换对象类型必须是类吗?可以是数值吗?比如$cast(2,3)
-
UVM的寄存器模型有哪几个值?(期望值、镜像值、实际值)