当前位置:   article > 正文

常见面试问题之Verilog、SV(一)_verilog面试

verilog面试

文章目录

1.常见的EDA仿真工具有哪些?Debug工具有哪些?

常见的仿真工具如下:

  •   Mentor(明导)—>Questasim、Modelsim
  •   Synopsys(新思科技)—>VCS
  •   Cadence(铿腾电子科技)—>Incisive,NC-sim
    此外仿真还会用到脚本如Makefile

补充:综合工具:
  逻辑综合就是把设计实现的RTL代码映射到特定的工艺库(不同的库中门电路的基本标准单元standard cell的面积、时序参数不一样)上,输出成门级网表Netlist

  •   Synopsys(新思科技)—>Design Compiler(DC)
  •   Cadence(铿腾电子科技)—>Genus

代码检查工具:nlint, spyglass,Verdi等

2.绘制常见SOC芯片架构图(MCU),并描述芯片的应用场景和数据流。

在这里插入图片描述
知道SOC系统中各个IP的基本功能;

  该芯片是一个SOC芯片,主要功能是实现无线通信数据存储的功能,主要运用场景在数据相机的存储卡。

无线通信功能通过APB总线上的SPI接口外挂一个WiFi芯片与手机相连,实现无线通信和数据传输功能。

数据存储功能主要通过NandFlash控制器,实现存储功能。但是该芯片采用了替换方案,使用了SD_Host接口,外接SD卡的方式进行数据存储。

典型的应用场景:数码相机拍照时,将照片通过SDC(SD memory Controller)控制器接口,放入SRAM暂存,最后通过SD Host接口,将照片存储到外接的SD卡中。然后,手机或PC端用户可以连接到WiFi上,通过手机下载SD memory存储卡中存放的视屏或照片到手机或者电脑上。

名词解释:MCU、IRQ、USB、BIOS等

  • MCU:MicroController Unit,微控制单元,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、PC外围、遥控器,汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影。
  • IRQ:全称为Interrupt Request,即是"中断请求"的意思,IRQ的作用就是在我们所用的电脑中,执行硬件中断请求的动作,比如我们需要读取硬盘中的一段数据时,当数据读取完毕,硬盘就通过IRQ来通知系统,相应的数据已经写到指定的内存中了
  • USB:是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的。
  • ​BIOS:Basic Input Output System,“基本输入输出系统”。它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

3.SRAM、FLASH、DRAM、ROM的区别?

  • SRAM:(Static Random-Access Memory,SRAM)静态随机存储器,容量小、存取速度快、掉电后数据会丢失,制造成本高,通常用作快取(cache)记忆体使用。
  • DRAM:(Dynamic Random Access Memory)动态随机存储器,价格较SRAM便宜,但访问速度较慢,耗电量较大,常做计算机内存使用(密度分布较高,存储数据较多时,所占面积小)。
  • FLASH:闪存,容量大、存取速度慢、掉电后数据不会丢失。是一种非易失性( Non-Volatile )内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,,
  • ROM:只读存储器(Read-Only Memory,ROM),只能读出无法写入信息,如计算机启动用的BIOS芯片。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。ROM所存数据通常是装入整机前写入的,整机工作过程中只能读出,所存数据稳定 ,断电后所存数据也不会改变,并且结构较简单,使用方便,因而常用于存储各种固定程序和数据。

4.WDT、Timer、DMA工作流程?

  • WDT:Watchingdog Timer,中文名看门狗,是一个定时器电路,一般有一个输入,俗称喂狗,一个输出到MCU的RST(复位)端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给WDT清零,如果超过规定的时间不喂狗(一般在程序跑飞时),WDT定时超出,就会给出一个RST信号到MCU,使MCU复位,防止MCU死机,看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
      工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。

  • DMA:DMA(Direct Memory Access,直接内存存取),一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
       1)请求:CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求
       2) 响应:DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。总线裁决逻辑输出总线应答,表示DMA已经响应
       3)传输:DMA控制器获得总线控制权后,CPU即刻挂起,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
       3)结束:当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停 止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并检查本次DMA传输操作正确性。

DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。

Timer:SOC内部的时钟由于温度、电磁以及各种自身因素使得其精度很低,所以不适合做计数使用,使用硬件计数电路Timer计数时间精度更高,一般可达到ns级。

4.数字集成电路的设计流程。

  整个IC设计流程宏观上主要包括四个阶段:

  1. 确定项目需求(市场需求)——制定芯片的具体指标;
      ( 物理指标:制作工艺、裸片面积、封装等;性能指标:功耗、速度等; 功能指标:功能描述、接口定义等
  2. 系统级设计——使用系统建模语言(C/C++/Matlab)对各个模块进行描述,并给出具体实现架构;
  3. 前端设计——RTL设计—>RTL仿真(EDA验证)—>硬件原型验证(FPGA验证)—>电路综合(Netlist门级网表)
  4. 后端设计——版图设计—>物理验证—>后仿真等
      ( 前端设计会对各个模块进行RTL设计验证(逻辑特性),最后在集成成一个整体,后端设计会将前端设计形成的门级网表Netlist进行物理实现(物理性能)。

5.数字设计流程中每个阶段主要做哪些工作?最主要的EDA工具有哪些?

前端设计:RTL——>Netlist过程大致如下所示:
在这里插入图片描述

后端设计:Netlist——>GDSII过程如下:
在这里插入图片描述
参考:https://blog.csdn.net/lovenankai/article/details/5894616

6.什么是竞争与冒险现象?如何判断?怎样消除?

   在组合电路中,某一输入信号经过不同的途径传播后,由于路径延迟不同,使得到达电路中某一个逻辑门会合点的时间有先有后,这种现象叫做竞争;由于由竞争而产生的尖脉冲或者说毛刺就叫做冒险。
   判断方法:1)、代数法:如果布尔表达式中有相反的信号则可能产生竞争和冒险的现象。如果表达式为:F=A+A’,就会产生"1"冒险;F=A*A’,就会产生"0"冒险。
         2)、卡诺图:有两个相切的卡诺圈并且相切处没有被其他卡诺圈包围,就有可能出现竞争冒险;
         3)、 实验法:示波器观察。
   消除方法:1)、接入滤波电容;、消除毛刺影响;
         2)、利用可靠性编码;
         3)、可以在表达式中添加增加冗余项消除逻辑冒险。

7.什么是“线与”?

  • 线与逻辑指两个或多个输出信号直接相并连从而实现逻辑与的功能。在硬件上,需要用到OD门(Open Drain漏极开路门)来实现,为了防止因为电流过大而烧坏OD门,应在OD门输出端接一个上拉电阻。典型漏极开路(OD)与非门的线与如图所示:
    在这里插入图片描述

8.阻塞性赋值与非阻塞性赋值的区别。

阻塞赋值非阻塞赋值
符号=<=
执行顺序顺序执行并发执行
应用组合逻辑块时序逻辑块
//(1)、0延时非阻塞赋值 -> 并发
initial begin
	forever begin #10ns clk_3 = ~clk_3; end       //等价begin #10ns clk_3 <= ~clk_3 end
end

integer data,data_1;
integer data_2,data_3;
always@(posedge clk_3) begin
	data <= 1'b1;           //非阻塞赋值->并发
	data_1 <= data;
end
always@(posedge clk_3) begin
	data_2 = 1'b1;           //阻塞赋值->顺序
	data_3 = data_2;
end

//(2)、带延时非阻塞赋值 -> 顺序
initial begin
	#20ns data <= 1'b1;     //非阻塞赋值-> 顺序
	#30ns data_1 <= data;
end
initial begin
	#20ns data_2 = 1'b1;     //非阻塞赋值-> 顺序
	#30ns data_3 = data_2;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

      在这里插入图片描述

9.锁存器(latch)与触发器(DFF)的区别?

  • latch由电平触发,非同步控制(没有时钟端,不受系统同步时钟的控制,无法实现同步操作)。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触发,同步控制。
  • latch容易产生毛刺(glitch),DFF则不易产生毛刺
  • 如果使用门电路来搭建latch和DFF,则latch消耗的门资源比DFF要少,这是latch比DFF优越的地方。所以,在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。
  • latch将静态时序分析变得极为复杂,DFF则会是时序分析变得容易。
       latch功能表如下
    在这里插入图片描述
       触发器flip-flop功能表如下

在这里插入图片描述

latch的产生代码方式:
方法1
module top_module (
    input d, 
    input ena,
    output q);
    assign q=(ena)?d:q;
endmodule

方法2
module top_module (
    input d, 
    input ena,
    output reg q);
    
    always @(*)begin
        q <= (ena) ? d : q;
    end  
endmodule

方法3
module top_module (
    input d, 
    input ena,
    output reg q);
    
    always @(*)begin
        q = (ena) ? d : q;
    end  
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

10. 用D触发器实现2倍分频的逻辑电路。

在这里插入图片描述

11.什么是建立时间和保持时间?如果setup time和hold time violation(违例)了怎么办?如何进行时序分析?最大的工作频率?

   建立时间:触发器(DFF)时钟上升沿到来之前,数据需要保持稳定的最小时间间隙就是建立时间。
  保持时间:触发器(DFF)时钟上升沿到来之后,数据需要保持稳定的最小时间间隙就是保持时间。

12.为什么触发器会存在setup和hold time要求?

  考虑触发器的结构(会画);
在这里插入图片描述
在这里插入图片描述
当时钟Cp由0跳变到1,C=1,C`=0,使TG1断开,从而切断了D端与主锁存器的联系,同时TG2导通,将反相器G1的输入端与G2的输出端连通,主锁存器会锁存Cp跳变前D端的数据(如果此时D没有保持稳定,则会造成亚稳态)。这是TG3导通,TG4断开,~Q信号进过反相器G3传送到Q端。

13.什么是亚稳态?如何在异步电路设计中解决亚稳态的问题?

提示:异步时钟域信号的跨时钟域同步。包括单比特和多比特,对于单比特自然用两级寄存器同步最为方便。对于多比特,常考察异步FIFO以及握手方法。要理解亚稳态的概念以及避免亚稳态的方法。
参考CDC章节。

  • 单比特信号——两级触发器(DFF)同步;
  • 多比特信号——连续信号——可以采用格雷码
           非连续信号——FIFO,握手方法;

14. 同步复位与异步复位的优缺点,异步复位设计在使用时应当注意什么?即异步复位同步释放设计,并要画出异步复位同步释放的电路结构。

  • 同步复位:当时钟上升沿检测到复位信号,执行复位操作(有效的时钟沿是前提)。always @ ( posedge clk );
      a、有利于仿真器的仿真
      b、可以使所设计的系统成为 100% 的同步时序电路,有利于时序分析
      c,复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑诸如 clk skew 、组合逻辑路径延时 、复位延时等因素
  • 异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。always @ ( posedge clk or negedge rst_n );
      a、设计相对简单;
      b、异步复位信号识别方便(电路在任何情况下都能复位而不管是否有时钟出现;
      c,最大的问题在于它属于异步逻辑,问题出现在复位释放时,而不是有效时,如果复位释放接近时钟有效沿,则触发器的输出可能进入亚稳态

15.常用的低功耗方法有哪些?

  时钟门控clock gating(画出电路结构图),了解DVFS,多阈值电压技术,多电压技术等。
参考低功耗章节:

  • 时钟门控(clock gating):在数据无效时,将寄存器时钟关闭的技术,能够有效降低功耗, 是低功耗设计的重要方法之一。在寄存器的输入数据无效时,将寄存器的输入时钟置为0,而此时寄存器值保持不变,此时没有时钟翻转,避免了动态功耗
    在这里插入图片描述

  • DVFS(Dynamic Voltage and Frequency Scaling)动态电压频率调节本质上是一种自适应的电压频率调节技术,目的是根据的芯片当时的实际功耗需要设定工作电压和时钟频率,这样可以保证提供的功率既满足要求又不会性能过剩,从而可以降低功耗。

  • 多阈值电压技术:不同器件阈(yu)值电压Vth对应的器件其漏电流Leakage负相关。低阈值电压标准单元:速度快、泄漏功耗高;高阈值电压标准单元:速度慢、泄漏功耗低。在不同的时序路径上使用不同阈值电压的标准单元来降低漏电流,可以达到降低漏电功耗的目的。

  • 多电压技术:是指将不同逻辑模块处于不同的电源域中,由不同供电电源供电。工作频率要求高的系统或者模块使用高电压,对于工作频率要求不高的相应的低电压也称Normal电压,从而实现低功耗的目的。

16.Moore状态机与Mealy状态机的特征区别?

   Moore状态机的输出只与当前状态有关。
   Mealy状态机的输出不仅与当前状态有关,还与当前输入有关。

17. 对FIFO的理解,同步FIFO 与异步FIFO异同。

  • 同步fifo读写时钟相同,异步fifo读写采用不同的时钟

18. 同步FIFO设计的如何判断fifo的空满状态?

   FIFO 是一种先进先出的数据交互方式,相当于一个RAM存储模块。同步FIFO的写时钟和读时钟为同一个时钟(同一个时钟域),由三大部分组成:FIFO写逻辑控制、 FIFO读逻辑控制、FIFO存储体(如Memory,reg等)。
   FIFO的空满可以通过计数器Counter判断,遵循空不能读、满不能写的原则。

      assign full = (counter == F_DEPTH)?1:0;
      assign empty = (counter == 'h0)?1:0;
  • 1
  • 2

   也可以通过扩展地址最高位判断空满
空:扩展位相同,有效地址位也相同; 满:扩展位不同,有效地址位相同

assign  empty = (w_addr_1==rd_addr_1)?1:0;   //地址判断
assign  full = ((w_addr_1[ADDR]!=rd_addr_1[ADDR]) && (w_addr_1[ADDR-1:0]==rd_addr_1[ADDR-1:0]))?1:0;
  • 1
  • 2

19. 对于异步fifo,如何处理判断空满,如何如理空满时的同步问题?计算异步FIFO最小深度。

   异步FIFO读写时钟不相同,异步FIFO除了存储体、读写逻辑控制,还包括了格雷码转换时钟同步部分。
  异步FIFO采用扩展地址位的方式对FIFO进行读写计数,判断空满。因为格雷码是镜像对称的,若只根据最高位是否相同来区分是读空还是写满是有问题的。实际判断空满:

  • 当最高位和次高位相同,其余位相同认为是读空
  • 当最高位和次高位不同,其余位相同认为是写满
    	/*二进制转化为格雷码计数器*/
		assign gray_rdaddress = (rdaddress >>1) ^ rdaddress;//(({1'b0,rdaddress[9:1]}) ^ rdaddress);		
		/*二进制转化为格雷码计数器*/
		assign gray_wraddress = (({1'b0,wraddress[9:1]}) ^ wraddress);
		
		assign fifo_empty = (gray_rdaddress == sync_w2r_r2);  //1. 格雷码所有bit位均相同		
		assign fifo_full = (gray_wraddress == {~sync_r2w_r2[9:8],sync_r2w_r2[7:0]});  //高两位不同,其余位相同
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  空满时的同步问题:

解决方法:两级寄存器同步 + 格雷码转换
   (1)将写时钟域的写指针同步到读时钟域,将同步后的写指针与读时钟域的读指针进行比较产生读空信号
  (2)将读时钟域的读指针同步到写时钟域,将同步后的读指针与写时钟域的写指针进行比较产生写满信号

  • 严格的空满判断(同步FIFO): w_ptr==r_ptr且读写回环标志位相同时为空,w_ptr == r_ptr且读写回环标志位不同时为满。这在同步fifo中一般没什么问题,但是在异步fifo中一般要做悲观的空满判断,以免在fifo空时读获fifo满时写。
  • 保守的空满判断(异步FIFO):方向标志与门限。设定了FIFO容量的75%作为上限,设定FIFO容量的25%为下限。当方向标志超过门限便输出满/空标志,其实这时输出空满标志FIFO并不一定真的空/满。

  异步FIFO最小深度计算:(考虑背靠背读写情况进行计算。)
在这里插入图片描述

20. 数组类型、填充数组与非填充数组的区别。队列和数组的区别与用法。

在这里插入图片描述
  队列的声明采用==[$]符号==,并且队列在声明之后不需要使用new[]函数来进行分配内存空间;队列中可以采用push和pop的方法在队列的头尾添加和删除元素,也可以采用insert()方法在中间插入元素

21. task与function有什么区别?

函数function任务task
执行与消耗不消耗仿真时间消耗仿真时间
仿真控制语句函数中不能含有控制仿真时间的语句
如时间延迟#100,阻塞语句@(posedge clk)等
任务中可以包含仿真时间控制语句
如延迟#100,时钟周期@(),wait()以及事件event等语句
形参变量函数中至少包含一个输入变量进行传参任务中可以没有输入、输出变量
调用方式函数的调用只能以语句的一部分出现任务的调用通过一条单独的语句实现

22 .区别值传递(input/output)与引用传递(ref)。

  • 值传递:常见的向任务与函数传递值的方法是复制;需要关键字input、output,这种传递方式实际上是将实参内容复制到形参中,原来的实参与形参存放在不同的内存空间中
  • 引用传递(相当于指针):用到关键字ref(取代了原来的input/output),同时需要将任务和函数声明为automatic型。在通过引用传递的方式将实参传递给形参引用时,引用型的形参变量实际上相当于实参变量的别名,两者具有相同的内存空间。

在仿真过程中,ref型的任务与函数消耗内存资源更少,仿真速度也更快一些。

23. OOP的基本思想

封装、继承、多态

24. 并发线程fork…join/join_any/join_none的区别。

在这里插入图片描述

25.SV的线程间通信方式,UVM的线程间通信方式。

  • 事件event——用于线程之间的同步,控制线程序列。
        触发事件操作符:“->”,不会阻塞线程的执行 ;通常触发操作在等待事件操作之后(先等待、后触发
        等待事件操作符:”@“或”wait()",等待操作总是阻塞线程的执行,只有当事件发生变化(被触发)时,线程才会继续执行.
        triggered函数用于检查一个事件是否被触发过,而不要求事件等待与触发的先后顺序,用法如下:@(event_name.triggered);
  • 旗语semaphore——用于对共享资源进行管理
        semaphore是SV内建的类,在内存中创建semaphore时,类似于创建了一个篮子(bucket),篮中包含一定数量的钥匙(keys),要获取共享的资源,必须从篮子中获取一把或多把钥匙,在获取完资源后必须将钥匙放回到篮子中;
        使用旗语semaphore时,需要先声明句柄(创建旗语),然后通过new( ) - 创建一个包含特定钥匙数的旗语对象;除了new(),函数外semaphore还提供了:get( ) - 从桶中获取一把或多把钥匙;put( ) - 归还一把或多把钥匙到桶中;try_get( ) - 试图获得一把或多把钥匙而不带阻塞;等方法。
  • 邮箱mailbox——数据传输的媒介,mailbox可以实现不同进程之间传递信息。
        Mailbox也是SV内建的类,类似FIFO,可以设置一定的深度,当邮箱中的信息数量达到邮箱的深度时,邮箱为满,此时不能在往邮箱中存放信息。
        使用旗语mailbox时,需要先声明句柄(创建邮箱),然后通过new( ) - 创建一个邮箱对象对象(默认无限深),mailbox也提供了一些内置方法如:put() - 将数据信息存入邮箱;get() - 将数据移出邮箱;num() - 返回邮箱中的数据条目;等方法。此外还有try_get(),try_put()等非阻塞方法。

26.对比UVM的线程通信方式(uvm_event与event比较)。

  SV中用来做线程间同步的几种方法,它们分别是semaphore、event和mailbox。
  UVM中,同步不再只局限于同一个组件中的各个线程,而是还有各个组件之间的同步问题。UVM提供了的类:uvm_event,uvm_event_pool;uvm_barrier, uvm_barrier_pool;
在这里插入图片描述

  • 与SV的event事件不同,UVM中的不同的组件可以共享同一个uvm_event,这种共享是通过uvm_event_pool这一全局资源池来实现的。通过唯一的全局资源池对象,在环境中任何一个地方的组件都可以从资源池中获取共同的对象,避免组件之间的互相依赖。
  • 无论有多少个组件,只要它们共同寻求同一个名称的uvm_event,将会共享该uvm_event对象的句柄。各个组件通过uvm_event_name = uvm_event_pool::get_global("e1")来获取同一个名称的uvm_event对象。即便该对象不存在,也会在第一次调用get_global()函数时创建这样一个对象。
  • 相比于传统的event,uvm_event还可以在触发等待事件时,并且通过uvm_event::trigger(uvm_object data = null)来传递给数据对象。而在等待uvm_event一侧的组件,则需要通过uvm_event::wait_trigger_data(output uvm_object data)来获取该对象。
    详细引用参考实例。

27.关于uvm_barrier的认识。

  • UVM还提供了一个新的类uvm_barrier用来对多个组件进行同步协调,同时为了解决组件独立运作的封闭性需要,也定义了新的类uvm_barrier_pool来全局管理这些uvm_barrier对象。
  • uvm_barrier可以通过set_threshold()函数设置一定的等待阈值(threshold),待有不少于该阈值的进程在等待该对象时,才触发该事件同时激活所有正在等待的进程,使得可以继续进行。通过调用wait_for( )函数阻塞线程,直到到达阈值`,释放线程。

28.为什么要使用随机化验证策略?带约束的随机类的语法和使用(权重约束和条件约束等都会考察)

  1)、使用随机化产生激励,可以很容易的在短时间内产生大量的随机激励,对于较大的验证空间,这些随机激励可以达到我们工程师可能会忽略的地方。相对于固定的激励(难以覆盖较大的可激励空间),随机化的激励可以简化代码编写,更能验证出DUT可能隐藏的错误,提高验证的完备性
  2)、对于较大的验证空间,随机化策略可以使验证有条件趋于量化流程,达到以时间换空间的效果

29.采用什么样的策略,使覆盖率达到100%?

  • 新增约束(new constraints);
  • 添加测试用例;
  • 使用不同的种子(seed)运行现有的测试用例(定向用例+随机化用例);
    覆盖率的收集是一个迭代过程,需要不断反复的运行测试用例。

30.从流程上,如何保证芯片验证的质量. 验证代码覆盖率与功能覆盖率如何相互保证验证质量?

  • 从流程上看,要保证验证的独立性、完备性和正确性。还需要采用各类先进的验证方法和策略,比如覆盖率驱动的验证策略、随机化验证策略、基于断言的验证策略。除此之外,为了提高质量和效率,还需要维护regression的流程。
    独立性指的是啥呢?老师。独立性是指验证要和设计独立做,不同的人,不同的方法,不同的策略。
  • 覆盖率包含了功能覆盖率和代码覆盖率,当两者都达到100%时,就可以去流片。其中功能覆盖率为主,需要工程师根据需求和经验,设计功能覆盖率模型,代码覆盖率为辅,可以通过EDA工具获取客观数据。当有一个覆盖率低时,就需要进行分析,比如当功能覆盖率比较高时,但代码覆盖率比较低,原因可能是功能覆盖率不完整

31.功能覆盖率与代码覆盖率之间的关系?

  • 代码覆盖率: 指的是验证过程中,哪些设计代码被执行,从而被覆盖到。它与设计的功能没有关系,它会通过仿真工具自动搜集
  • 功能覆盖率: 主要是衡量设计所实现的各项功能,是否按预想的行为执行,当设计的某些功能被验证到了,我们就说这些功能点被覆盖到。功能覆盖率需要通过人为定义覆盖点,与待测功能点进行映射。
  • 二者无必然的联系,代码覆盖率达到要求并不意味着功能覆盖率也达到要求。为了保证验证的完备性,验证时需要使代码覆盖率和功能覆盖率同时达到要求

32. 功能覆盖率与代码覆盖率有哪些?

  • 行覆盖率(line coverage):指程序的每一行代码是否被执行过。

  • 条件覆盖率(condition coverage):指每个条件中的逻辑操作数被覆盖的情况。

  • 跳转覆盖率(toggle coverage):用来记录某个设计边界信号数据位的0/1跳转情况,如从0到1,或者从1到0的跳转。

  • 决策覆盖率(branch coverage):指在if,case,for,forever,while等语句中各个分支的执行情况。

  • 状态机覆盖率(FSM coverage):用来记录状态机的各种状态被进入的次数以及状态之间的跳转情况。

  • 面向数据的覆盖率(Data-oriented Coverage)-对已进行的数据组合检查.我们可以通过编写覆盖组(coverage groups)、覆盖点(coverage points)和交叉覆盖(cross coverage)获得面向数据的覆盖率.

  • 面向控制的覆盖率(Control-oriented Coverage)-检查行为序列(sequences of
    behaviors)是否已经发生.通过编写SVA来获得断言覆盖率(assertion coverage).

33. 如何收集RTL代码覆盖率的数据?比如逻辑仿真工具收集覆盖率的编译和仿真的选项是什么?

  • 分别在编译comp和仿真run(simulate)阶段添加命令:-cm line+cond+fsm+tgl,即可实现代码覆盖率的收集,此外还可以添加命令:-cm_dir,针对不同的测试用例生成不同的覆盖率.Vdb文件。
  • 如下示例:-cm_dir CovData/vcs/{TC_name}:表示将生成的覆盖率数据文件放到CovData/vcs目录中,若果目录不存在,则自动创建。生成的覆盖率文件以.vdb为后缀,名称要求与用例名相关,如:test_1.vdb

34. 如何排除不需要统计在内的RTL代码,也就是通过代码覆盖率的分析,很多代码是不需要做覆盖率的统计,比如else分支的缺失,default的full case语句等?

  • 在使用DVE软件做覆盖率收集的过程中,对于那些不需要做覆盖率收集的代码,可以通过右键,使用exclude选项,将这些代码排除在覆盖率收集之外。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/938581
推荐阅读
  

闽ICP备14008679号