在这里,引入特性(feature)验证的概念,即根据被测芯片的特性分配验证资源和人力。这样做虽然简化了验证资源分配和验证经理跟踪验证进度的难度,但也带来很大的完备性风险。
在理想的世界里,我们希望验证芯片的每一种可能的排列组合。 但在大多数情况下,这根本不可能。即使是一个看似简单的模块,也可能有成百上千种可能的输入和输出组合,为所有这些可能性创建验证用例是不切实际的。
多态(Polymorphism),从字面意思上看指的是多种形式,在OOP(面向对象编程)中指的是同一个父类的函数可以体现为不同的行为。
shallow copy只能复制类中的对象句柄,如果我们还想为这个对象句柄实例化,并复制其中的内容呢?
本节介绍一个包含存储器,仲裁器,控制器,系统总线和CPU的设计,所有这些设计文件都在工具安装目录底下:
正如我们所知,“bit”是无符号的,而“byte”是有符号的。那么,你认为下面两个声明是等价的吗? {代码...} 答案是不等价,因为: {代码...} 所以,你需要小心混合bit和字byte数据类型的计算。同样,你认为以下两种说法等价吗? {代码...} 答案是等价。我们可以简单理解为bit signed [7:0] 等价为 byte。作者:验证哥布林来源...
Verilog提供了reg和wire数据类型,但是对于功能验证来说远远不够,所以SystemVerilog提供了很多更加丰富的数据类型,下面将一一介绍。
covergroup’可以在“package’”、“module’”、“program’”、“interface’ ”和“class’”中定义。
举个例子,对于具有10个寄存器、10个输入的设计而言,那么状态空间就是2^20。一般实际的设计中的状态空间要比这个多得多。
现代芯片研发流程是一个非常复杂的过程,所以不可避免会分成市场调研->方案架构制定->RTL开发验证->后端物理实现等等。分解其中验证又分为设计冒烟验证->模块验证->集成验证->FPGA测试等。稍微复杂点的IP也没办法由一个人完成验证,一些特性验证或者模块的验证必须要被分解成子特性/子模块。分解之后...
1、Structural hazards,当不同的stage竞争共享资源时,这也是我们为什么需要区分I-cache和D-cache的原因。
虚拟地址的出现可以追朔到上世纪六十年代的Atlas计算系统。在当时Atlas计算系统是一个庞然大物,但也只有96K字节的内部存储器和576K字节的磁鼓作为外部存储器。我们很难深刻体会在计算机发展的初级阶段,计算机使用者的无奈。
在一个CPU中,读写指令在进入Pipeline之前,首先被分解为两个微步骤或者是两个微指令,这并不是x86处理器所特有的,许多为了提高存储指令执行效率的微架构都使用了这种方式。
Superscalar与OOO(Out-of-order)的引入极大促进了现代处理器微架构的发展。已知的高性能处理器,如Nehalem,Sandy Bridge,Opteron,Power甚至是ARM Cortex系列处理器都使用了这种架构。这类方法在有效提高了ILP(instruction level parallelism)的同时,加大了整个Cache Memory层次结构的实现难度。
在formal验证过程中,很多时候我们针对所负责模块做了非常完备的覆盖率和断言检查,但是涉及到接口的约束往往会引入过约,即
在N-Ways Set-Associative方式的Cache中,CPU如何选用函数f映射Cache中的Set是一个值得讨论的话题。其中最常用的算法是Bit Selection。这是一种最快,最简洁的实现方式,使用这种方法带来的最大质疑莫过于Set的选择不够随机。历史上曾经有人试图使用某些pseudo-random算法作为函数f,但是需要明确的是在Set Selection中...
根据定义,always_comb 中if括号里面的逻辑表达式在每次变量发生变化时都会进行判断。代码的开发者可能觉得逻辑表达式中的断言bit_ok每次都能够得到执行。
SVA断言是一个强时序的技术,很多时候SVA的实际时序和验证工程师的期望可能不同,这种不同很难调试定位。
根据状态机输出产生的类型,可以将状态机分成两类。第一个是Moore状态机,输出只是当前状态的函数,第二个是Mealy状态机,其中一个或多个输出是当前状态和一个或多个输入的函数。
通常,高扇出网络将被缓冲以减少驱动门上的总负载,和网络的过渡时间。 对于具有相同时序要求的信号,例如时钟网络和复位线,可以使用平衡缓冲树,以减少信号边沿的skew。