testbench,TestBench( 二 )


有一种情况就是前一级时钟太快, 造成第二级来不及,则需要加入FIFO作为隔离, 就是让那些数据先放好, 我在慢慢来取. 这个FIFO的设计涉及到读写地址的判断,写满或读空都需要做相应处理, 读写地址之间的判断只能在其中一个时钟域中进行, 这本身又涉及异步信号的处理问题,这一般用格雷玛解决, 或者有些地方直接可以判断地址高位, 这些方法的目的就是不能让地址在比较的时候不稳定 。
RTL设计中时钟本身的设计问题也要注意, 我们在一个芯片中, 尽量把时钟产生电路放在一块,主要是从综合, DFT的角度去考虑的, 让这些时钟统一管理和约束 。时钟的分频,切换也要专门处理,否则容易产生毛刺等事情 。RTL设计中还有很多需要注意的问题,比如可综合性, 还有要考虑到电路的面积, 以及响应速度等等, 这些问题是RTL coding的基础问题 。
代码写完后,需要进行的是验证工作,下面谈谈这方面的事情:上次写完后,有人支持,也有个朋友说写这些东西意义不大吧,如果就某些细节方面感兴趣的朋友可以探讨和切磋,互相学习,也可以私下交流 。这只是我的角度去写这些东西,希望大家指正和补充 。下面接前天的,继续验证部分 。芯片验证一般有这几个层面, 一个是RTL级或者Netlist( pre or post PR with SDF ), 这个也是一般意义上的芯片验证工作, 一个是FPGA级的,也是RTL, 只不过download到FPGA中, 借助硬件环境,也可以直接做应用实验 。
芯片验证的工作量在芯片设计中占据了大部分的时间和精力,无论是那种验证,都需要搭建测试平台(testbench),验证平台从软件结构上模拟芯片的工作 环境 。即有清晰的连线结构,也有完成这些测试所需要的非结构性的函数或任务包 。测试平台中的被测试芯片是RTL级的,测试向量或者说施加的激励可以是 verilog/VHDL,HDL语言本身就具有比较完善的行为级描述功能,也可以满足绝大部分测试平台的搭建和测试激励的产生,当然我们面对更复杂设 计,或追求更高效率 也可以使用其它被编译器兼容的语言,如C/C, SC, SV,E等等 。
很显然,测试激励是有时间概念的,是按顺序进入和流出芯片的,使用的这些非电路描述语言和功能和软件几乎是没有区别的,所以验证中也越来越多地使用软件的一 些技术,如面向对象的编程技术,SystemVerilog, Specman E等,SV也支持断言语句(assertion),不同厂家提供的OVM, VMM,UVM等也包括了很多类库可供使用 。
关于这些技术其实可以有更深入的探讨,也期待感兴趣的能深入展开 。无论传统的验证还是最新的验证方法学,都需要追求验证的收敛性,即验证完全是自动化的检测,除非debug,我们无需通过波形判断测试通过与否 。对于很多验证,我们几乎不需要上到FPGA上验证,比如数据通信类,完全可以软件实现数据的产生和比对 。而有些应用,如影视频,图形抓取等等,如果进入 FPGA就可以实现效果功能的检验,FPGA的流程这里不做表述,不过要注意的是,我们用作流片的RTL代码可能和待烧入FPGA的代码有不同之处,比如 有些使用的IP在FPGA中可能和流片厂家提供的不一样,还有些端口等等需要特别注意 。
还有post layout的后仿,这个后仿是指DFT和APR之后的网表,加入带有时序信息的SDF文件进行仿真 。有些人说,我做过验证,代码和网表之间,PR前后网 表之间的一致性验证也做了,还需要后仿吗? 答案当然还是需要的,因为一致性也无法检测到很多时序的问题,比如毛刺,甚至DFT的错误,功能性的问题等等 。
现在比较常见数模混合芯片的验证,模拟的部分主要是采用了 verilogams建模,当然也有VHDLRN建模等等,这些东西就是引入了可控制和可检测的模拟量,进入数字仿真系统,也是数字验证流程的一环 。更专业的数模混合验证系统ADMS, 里面引入了数字和模拟多个引擎,如数字的nvverilog 模拟的Eldo等等,数字部分导入RTL代码,模拟部分直接导入GDS电路,当然为了加快速度,模拟部分在使用中一般仍然导入数字模型 。

推荐阅读