IC验证面试八股文必背

1.多线程 fork join/fork join_any/fork join_none的用法差异

  • Fork join:内部 begin end 块并行运行,直到所有线程运行完毕才会 进入下一个阶段。
  • Fork join_any:内部 begin end 块并行运行,任意一个 begin end 块 运行结束就可以进入下一个阶段。
  • Fork join_none:内部 begin end 块并行运行,无需等待可以直接进入 下一个阶段。
  • wait fork:会引起调用进程阻塞,直到它的所有子进程结束,一般 用来确保所有子进程(调用进程产生的进程,也即一级子进程)执行都已 经结束。
  • disable fork:用来终止调用进程 的所有活跃进程, 以及进程的所 有子进程。

 2.多线程的同步调度方法

多线程之间同步主要由 mailbox、event、semaphore 三种进行一个通信交互。

  • mailbox 邮箱:主要用于两个线程之间的数据通信,通过 put 函数和 get 函数还有 peek 函数进行数据的发送和获取。
  • Event:事件主要用于两个线程之间的一个同步运行,通过事件触发和 事件等待进行两个线程间的运行同步。使用@(event)或者 wait(event.trigger)进行等待,->进行触发。
  • Semaphore:旗语主要是用于对资源访问的一个交互,通过 key 的获取 和返回实现一个线程对资源的一个访问。使用 put 和 get 函数获取返回 key。 一次可以多个。

3.Task 和 function 的区别

  • 函数能调用另一个函数,但不能调用任务,任务能调用另一个任务, 也能调用另一个函数
  • 函数总是在仿真时刻 0 就开始执行,任务可以在非零时刻执行
  • 函数一定不能包含任何延迟、事件或者时序控制声明语句,任务可以 包含延迟、事件或者时序控制声明语句
  • 函数至少有一个输入变量,可以有多个输入变量,任务可以没有或者 多个输入(input)、输出(output)和双向(inout)变量
  • 函数只能返回一个值,函数不能有输出(output)或者双向(inout)变量, 任务不返回任何值,任务可以通过输出(output)或者双向(inout)变量传递多个值

4.在 TB 中使用 interface 和 clocking blocking 的好处

  • Interface 是一组接口,用于对信号进行一个封装,捆扎起来。如果 像 verilog 中对各个信号进行连接,每一层我们都需要对接口信号进行定义, 若信号过多,很容易出现人为错误,而且后期的可重用性不高。因此使用 interface 接口进行连接,不仅可以简化代码,而且提高可重用性,除此之 外,interface 内部提供了其他一些功能,用于测试平台与 DUT 之间的同步 和避免竞争。
  • Clocking block:在 interface 内部我们可以定义 clocking 块,可以 使得信号保持同步,对于接口的采样 vrbg 和驱动有详细的设置操作,从而避 免 TB 与 DUT 的接口竞争,减少我们由于信号竞争导致的错误。采样提前, 驱动落后,保证信号不会出现竞争

5.OPP(面向对象)的特性?

封装、继承、多态

6.UVM 从哪里启动,接口怎么传递到环境中

  • 在导入 uvm_pkg 文件时,会自动创建 uvm_root 所例化的对象 uvm_top, UVM 顶层的类会提供 run_test()方法充当 UVM 世界的核心角色,通过 uvm_top 调用 run_test()方法.
  • 在环境中输入 run_test 来启动 UVM 验证平台,run_test 语句会创建 一个 my_case0 的实例,得到正确的 test_name
  • 依次执行 uvm_test 容器中的各个 component 组件中的 phase 机制, 按照顺序:
  • 1. build-phase(自顶向下构建 UVM 树)
  • 2. connet_phase(自底向上连接各个组件)
  • 3. end_of_elaboration_phase
  • 4. start_of_simulation_phase
  • 5. run_phase() objection 机制仿真挂起,通过 start 启动 sequence(每 个 sequence 都有一个 body 任务。当一个 sequence 启动后,会自动执行 sequence 的 body 任务),等到 sequence 发送完毕则关闭 objection,结束 run_phase()(UVM_objection 提供 component 和 sequence 共享的计数器, 当所有参与到 objection 机制中的组件都 drop objection 时,计数器 counter 才会清零,才满足 run_phase()退出的条件)
  • 6. 执行后面的 phas

7.接口怎么传递到验证环境中

  • 传递 virtual interface 到环境中;
  • 配置单一变量值,例如 int、string、enum 等;
  • 传递配置对象(config_object)到环境;
  • 1. 传递 virtual interface 到环境中;
  • a) 虽然 SV 可以通过层次化的 interface 的索引完成传递,但是这种传递方 式不利于软件环境的封装和复用。通过使用 uvm_config_db 配置机制来传递 接口,可以将接口的传递与获取彻底分离开。
  • b) 接口传递从硬件世界到 UVM 环境可以通过 uvm_config_db 来实现,在实现过程中应当注意: c) 接口传递应发生在 run_test()之前。这保证了在进入 build_phase 之前, virtual interface 已经被传递到 uvm_config_db 中。
  • d) 用户应当把 interface 与 virtual interface 区分开来,在传递过程中的类型应当为 virtual interface,即实际接口的句柄。
  • 1. 配置单一变量值,例如 int、string、enum 等;在各个 test 中,可以 在 build_phase 阶段对底层组件的各个变量加以配置,进而在环境例化之前完成配置,使得环境可以按照预期运行。
  • 2. 传递配置对象(config_object)到环境;
  • 在 test 配置中,需要配置的参数不只是数量多,可能还分属于不同的 组件。对这么多层次的变量做出类似上边的单一变量传递,需要更多的代码,容易出错且不易复用。
  • 如果整合各个组件中的变量,将其放置在一个 uvm_object 中,再对 中心化的配置对象进行传递,将有利于整体环境的修改维护,提升代码的复用性。

8.Virtual sequencer 和 sequencer 的区别

  • Virtual sequencer 主要用于对不同的 agent 进行协调时,需要有一 定顶层的 sequencer 对内部各个 agent 中的 sequencer 进行协调
  • virtual sequencer 是面向多个 sequencer 的多个 sequence 群,而 sequencer 是面向一个 sequencer 的 sequence 群。
  • Virtual sequencer 桥接着所有底层的 sequencer 的句柄,其本身也 不需要传递 item,不需要和 driver 连接。只需要将其内部的底层 sequencer 句柄和 sequencer 实体对象连接

9.平台往里边输入数据的话怎么输入 sequence, sequence, sequencer,driver 之间的通信

  • 无论是sequence还是driver,它们通话的对象都是sequencer。当多个sequence试图要挂载到同一个sequencer上时,涉及sequencer的仲裁功能。
  • 重点分析sequencer作为sequence与driver之间握手的桥梁,是如何扮演好这一角色的。
  • 我们将抽取去这三个类的主要方法,利用时间箭头演示出完整的TLM通信过程。
  • 对于sequence而言,无论是flat sequence还是hierarchical sequence,进一步切分的话,流向sequencer的 都是sequence item,所以就每个item的"成长周期”来看,它起始于reate_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一侧获取返回的数据对象。
  • 在多个sequence同时向sequencer发送item时,需要有ID信息表明该item从哪个sequence来,ID信息在sequence创建item时就赋值了

10.如何保证验证的完备性?

一般有这 些验证流程:IP 级验证、子系统级验证、SoC 级验证,除这些以外,还有 Low power 的 upf 验证(IEEE 低功耗设计验证标准)、FPGA 原型验证等多 种手段。

11.约束的几种形式

  • 1.权重约束 dist:有两种操作符::=n :/n 第一种表示每一个取值权重 都是 n,第二种表示每一个取值权重为 n/num。
  • 2. 条件约束 if else 和->(case):if else 就是和正常使用一样;->通 过前面条件满足后可以触发后面事件的发生。
  • 3. 范围约束 inside:inside{[min:max]};范围操作符,也可以直接使用 大于小于符号进行,但是不可以连续使用,如 min<wxm<max 这是错误的

12.UVM继承

13.get_next_item()和 try_next_item()有什么区别

  • 1.get_next_item()是一个阻塞调用,直到存在可供驱动的 sequence item 为止,并返回指向 sequence item 的指针。
  • 2. try_next_item()是非阻塞调用,如果没有可供驱动的 sequence item, 则返回空指针

14.断言 and 和 和 intersect 区别

  • and 指的是两个序列具有相同的起始点,终点可以不同。
  •  Intersect 指的是两个序列具有相同的起始点和终点。
  • Or 指的是两个序列只要满足一个就可以。
  • Throughout 指的是满足前面要求才能执行后面的序列。

15.Break;continue;return 的含义,return 之后,function 里剩下的语句会执行吗

  • break 语句结束整个循环。
  • continue 立即结束本次循环,继续执行下一次循环。
  • return 语句会终止函数的执行并返回函数的值(如果有返回值的话)。
  • return 之后,function 里剩下的语句不能执行,其是终止函数的执 行,并返回函数的值。

16.触发器和锁存器的区别

  • 触发器:时钟触发,受时钟控制,只有在时钟触发时才采样当前的输 入,产生输出。
  • 锁存器由电平触发,非同步控制。在使能信号有效时锁存器相当于通 路,在使能信号无效时锁存器保持输出状态。触发器由时钟沿触发,同步 控制。
  • 锁存器对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛 刺产生;触发器则不易产生毛刺

17.组件之间的通信机制,analysis port 和其它的区别

  • 通信分为:单向通信,双向通信和多向通信。
  • 单向通信:指的是从 initiator 到 target 之间的数据流向是单一方 向的。
  • 双向通信:双向通信的两端也分为 initiator 和 target,但是数据流 向在端对端之间是双向的。
  • 多向通信:仍然是两个组件之间的通信,是指 initiator 与 target 之间的相同 TLM 端口数目超过一个时的处理解决办法。

1. blocking 阻塞传输的方法包含:

  • put():initiator 先生成数据 Tt,同时将该数据传送至 target。
  • get():initiator 从 target 获取数据 Tt,而 target 中的该数据 Tt 则应消耗。
  • peek(): initiator 从 target 获取数据 Tt,而 target 中的该数据 Tt 还应保留。

1. 通信管道:

  •         TLM FIFO:可以进行数据缓存,功能类似于 mailbox,不同的地方在 于 uvm_tlm_fifo 提供了各种端口(put、get、peek)供用户使用
  •         analysis port:一端对多端,用于多个组件同时对一个数据进行处理,如果这个数据是从同一个源的 TLM 端口发出到达不同组件,则要求该端 口能够满足一端到多端,如果数据源端发生变化需要通知跟它关联的多个组件时,我们可以利用软件的设计模式之一观察者模式实现,即广播模式

        analysis TLM FIFO :

  • a. 由于 analysis 端口提出实现了一端到多端的 TLM 数据传输,而一个新 的数据缓存组件类 uvm_tlm_analysis_fifo 为用户们提供了可以搭配 uvm_analysis_port 端口 uvm_analysis_imp 端口和 write()函数。
  • b. uvm_tlm_analysis_fifo 类继承于 uvm_tlm_fifo,这表明它本身具有面 向单一 TLM 端口的数据缓存特性,而同时该类又有一个 uvm_analysis_imp 端口 analysis_export 并且实现了 write()函数:request & response 通信管道 双向通信端口 transport,即通过在 target 端实现 transport()方法可以在一次传输中既发送 request 又可以接 收 response.

18.对 UVM 验证方法学的理解

把 sequence 比作蓄水池,sequence_item 就是水,sequencer 就是一个调度站, driver 就是总工厂,通过这种方式进行处理,我们的总工厂不需要管其他, 只需处理运送过来的水资源就可以,而 sequencer 只需要调度水资源, sequence 只需要产生不同的水资源。

19.UVM的phase机制作用

UVM 中有很多非常有趣的机制,例如 factory 机制,field_automation 机制,phase 机制,打印机制,sequence 机制,config_db 机制等,这些机制使得我们搭建的 UVM 能够有很好的可重用性和使得我们平台运行有秩序稳定。

例如 phase 机制,phase 机制主要是使得 UVM 的运行仿真层次化,使得 各种例化先后次序正确。UVM 的 phase 机制主要有 9 个,外加 12 个小 phase。 主要的 phase 有 build_phase、connect_phase、run_phase、report_phase、 final_phase 等,其中除了 run_phase 是 task(会消耗仿真时间),其余都是 function,然后 build_phase 和 final_phase 都是自顶向下运行,其余都是自 底向上运行。run_phase 和 12 个小 phase( reset_phase、configure_phase、 main_phase、shutdown_phase)是并行运行的,有这 12 个小 phase 主要是进 一步将 run phase 中的事务划分到不同的 phase 进行,简化代码。注意,run phase 和 12 个小 phase 最好不要同时使用。从运行上来看,9 个 phase 顺 序执行,不同组件中的同一个 phase 执行有顺序,build phase 为自顶向下, 只有同一个 phase 全部执行完毕才会执行下一个 phase。

20.AMBA 总线中 AHB/APB/AXI 协议的区别

AHB(Advanced High-performance Bus)高级高性能总线。APB(Advanced Peripheral Bus)高级外围总线 AXI (Advanced eXtensible Interface)高级可拓展接口。

  • AHB 主要是针对高效率、高频宽及快速系统模块所设计的总线,它可 以连接如微处理器、芯片上或芯片外的内存模块和 DMA 等高效率模块。
  • APB 主要用在低速且低功率的外围,可针对外围设备作功率消耗及复 杂接口的最佳化。APB 在 AHB 和低带宽的外围设备之间提供了通信的桥梁, 所以 APB 是 AHB 的二级拓展总线。
  • AXI 高速度、高带宽,管道化互联,单向通道,只需要首地址,读写 并行,支持乱序,支持非对齐操作,有效支持初始延迟较高的外设,连线非常多。

AHB 协议

1. AHB 的组成

  • Master:能够发起读写操作,提供地址和控制信号,同一时间只有 1 个 Master 会被激活。 
  • Slave:在给定的地址范围内对读写操作作响应,并对 Master 返回成 功、失败或者等待状态。
  • Arbiter:负责保证总线上一次只有 1 个 Master 在工作。仲裁协议是规定的,但是仲裁算法可以根据应用决定。
  • Decoder:负责对地址进行解码,并提供片选信号到各 Slave。每个 AHB 都需要 1 个仲裁器和 1 个中央解码器。

2. AHB 基本信号(经常会问 Htrans 和 Hburst,以及 AHB 的边界地址怎么确 定)

  • HADDR:32 位系统地址总线。
  • HTRANS:M 指示传输状态,NONSEQ、SEQ、IDLE、BUSY。
  • HWRITE:传输方向 1-写,0-读。
  • HSIZE:传输单位。
  • HBURST:传输的 burst 类型,SINGLE、INCR、WRAP4、INCR4 等。
  • HWDATA:写数据总线,从 M 写到 S。
  • HREADY:S 应答 M 是否读写操作传输完成,1-传输完成,0-需延长传 输周期。
  • HRESP:S 应答当前传输状态,OKAY、ERROR、RETRY、SPLIT。
  • HRDATA:读数据总线,从 S 读到 M。

21. a[*3]、a[->3]和 a[=3]区别

  • a[*3]指的是:重复3次 a,且其与前后其他序列不能有间隔,a 中间也不可有间隔。
  • a[->3]指的是:重复3次,其 a 中间可以有间隔,但是其后面的序列与 a 之间不可以有间隔。
  • a[=3]指的是:只要重复3次,中间可随意间隔。

22.你在做验证时的流程是怎么样的,你是怎么做的

  • 1.首先第一步我会先去查看 spec 文档,将模块的功能和接口总线时序 搞明白,尤其是工作的时序,这对于后续写 TB 非常重要;
  • 2. 第二步我会根据功能点去划分我的 TB 应该怎么搭建,我的 case 大致 会有哪些,这些功能点我应该如何去覆盖,时序应该如何去检查,总结列 出这样的一个清单;
  • 3. 第三步开始去搭建我们的 TB,包括各种组件,和一些基础的 sequence 还有 test,暂时先就写一两个基础的 sequence,然后还有一些环境配置参数 的确定等,最后能够将 TB 正常运行,保证无误;
  • 4. 第四步就是根据清单去编写 sequence 和 case,然后去仿真,保证仿 真正确性,收集覆盖率;
  • 5. 第五步就是分析收集的覆盖率,然后查看覆盖率报告去分析还有哪些 没有被覆盖,去写一些定向 case,和更换不同的 seed 去仿真;
  • 6. 第六步就是回归测试 regression,通过不同的 seed 去跑,收集覆盖 率和检测是否有其它 bug;
  • 7. 第七步就是总结

  • 17
    点赞
  • 273
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值