10771|13

108

帖子

0

TA的资源

宇宙尘埃

楼主
 

IC设计之FAQ-ASIC篇(转帖) [复制链接]

IC设计之FAQ(欢迎添加)-ASIC篇

GDSII是一种时序提供格式,用于设计工具、计算机和掩膜制造商之间进行半导体物理制板的数据传输。得以普遍应用,成为半导体工业最常用的文件格式。在成为工业标准之前,GDSII最初始于GE Calma公司。
GDSII格式对分布于每一个制作层的电路单元进行全面描述。这种格式是基于二进制的独立平台。电路单元可包含诸如多晶硅(两维域),连线和其他用于分级设计的单元件。
与普通晶元片的晶体管互联相比,用于晶元片水平或多片封装的数据库受限于其复杂度。然而,两者都采用相同的原理来构建电路单元、多晶硅以及单元件的分级排列。
CIF是一种版图格式,纯文本的中间文件,主要用于版图的导入输出,不作为生产之用,可惜全称我忘了,gdsII也是一种版图格式,不同之处在于它是二进制的,需要相应的工具才能看到,而edif全称是electric design interchange format,是电路的一种二进制描述,带有电路的单元symbol信息,也是纯文本的,主要用于电路数据交换
CIF - Caltech Intermediate Format
GDS II - Graphic Design System II
EDIF - Electronic Design Interchange Format
三者皆為layout格式
COT  customer owned tooling

此帖出自FPGA/CPLD论坛
点赞 关注
 

回复
举报

108

帖子

0

TA的资源

宇宙尘埃

沙发
 

Re: IC设计之FAQ-ASIC篇(转帖)

区分read和A&E 先说read,可以读入包括verilog Vhdl在内的其他文件,如edif,db,pla等,而且这些文件只能用read命令读入。读入的设计被转移成相应的布尔函数表达存放在内存中。 再说Analyzer 和elaborate。这是一对命令,读入设计要一起使用。Analyzer对verilog 和VHDL文件进行编译,对代码进行语法和可综合性检查,而后将编译结果保存在由用户指定的目录下;elaborate在把编译的结果载入DC,并转译成相应的布尔函数的表达。 两者的区别:1.read可以载入synopsys的所有数据格式,而A&E只支持verilog 和VHDL 2.在读入设计时,如果被调用的模块含参数定义,而在被调用的过程中重新赋值,则必须使用A&E载入。
此帖出自FPGA/CPLD论坛
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

板凳
 

Re: IC设计之FAQ-ASIC篇(转帖)

有一种新的格式 OASIS Open Artwork System Interchange Standard (OASIS (TM)) is a specification for hierarchical integrated circuit mask layout data format for interchange between EDA software, IC mask writing tools and mask inspection tools. The name is the trademark of SEMI. It is developed by SEMI for microelectronics/fabrication industry as a replacement for GDSII format, the IC industry de facto standard for IC layout data exchange for more than two decades. Like GDSII, OASIS (TM) is a hardware- and software-independent binary data format. It delivers the following improvements over GDSII: 1. Up to 10 times smaller file sizes 2. Support of 64-bit arithmetics 3. Richer data format for exchange of information between design and manufacturing stages.
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

4
 

Re: IC设计之FAQ-ASIC篇(转帖)

IC前端设计工具 (1)代码输入: 语言输入: Summit VisualHDL Summit Renior Mentor 图形输入: composer Candence Viewlogic Viewdraw (2)电路仿真:数字电路仿真 Verilog: VCS Synopsys Verilog—XL Candence modle-sim Mentor Vhdl: VSS Synopsys NC—vhdl Candence modle-sim Mentor 模拟电路仿真 Hsipce Synopsys Spectre Simulator ,Pspice Cadence SmartSpice Silvaco (3)逻辑综合: DC Expert Synopsys BuilderGates Cadence Blaster RTL Magama Synplify PRO Synplify
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

5
 

Re: IC设计之FAQ-ASIC篇(转帖)

手工画版图的经验(friend's) 做layout很辛苦,动辄一个电路就能让你晕头转向。所以手工布局布线,要的是有层次结构和足够的认真和仔细。 不从民族情结来讲,我们还是应该向小日本学习,就是严谨!!(虽然在我看来 他们是有些近似苛刻,但这一点十分重要!),如果说他们条条框框太多,我们学不来,那就简单一点--条理性!!(讲得太多就是罗嗦了!!这一点也说明,layout让女生做比较合适。) (这里只讲实际操作时的想法,对数据准备略过。) 具体想法如下: (1)熟悉并拆分电路 熟悉你所要layout的电路,把电路进行划分,了解每部分的重要程度和相互依存的关系,就是有些部分可以画到一起,有的要把一些其他部分包含在里面。找出电路的对称性及相似性(版图上可以直接copy过来用的)。知道哪里出线多,哪里出线少。 (2)评估与计划 评估电路,比如用到多少个Macro,占总面积多少?用到多少个Cell,占总面积多少? standard cell 所占面积与其要布线的面积之比,等等。评估要分几部分进行layout,每部分要占多大面积,要花多少时间?整体要花多少时间?什么时候要来layout哪一部分... (3)布局和摆放 根据评估的大小,对各部分进行摆放(如果只是做macro,就是macro中的小部分,如何连接到一起。),以达到最好的效果和连线方式。规化走线空间和走线路径,重要的是power/ground,和较为重要的线的整体走向,以达到简洁和安全。 (4)标记版图 对应电路,在版图上打label(或者加pin,或者加属性),一是知道已经画好是哪一部分电路,二是知道是否连接正确。一层层下来,由小部分组成较大部分,再由较大部分组成大部分,越来越复杂时,layout工程师所做的记号就相当重要,好比一个好的程序员,会写上注释一样的重要。 layout常识 * poly只能用于信号线的连接 * 布线最小化,特别是高阻抗节点之间的连接。 * 采用对称结构,如果有必须应采用中心对称方式 * 注意匀称,比如等高,均匀摆放,特别注意有源器件 * 晶体管必须是直的,禁止拐弯 * 分开输入,输出线,避免出现回路 * 屏蔽高频线避免noise的影响 * 使用规则的图形 * 保持layout方向的一致 结尾: 做layout,没有什么好教的,就像师傅教徒弟一样,有些生硬,所以要依靠工具和好的想法。相信你自己!! 规划好了,画的时候就不要想了,先摆cell后布线!!(画的时候才想,速度就上不去了!!)
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

6
 

Re: IC设计之FAQ-ASIC篇(转帖)

版图设计中的热分布问题(转帖) 据推测,IC的芯片温度每提高25℃失效率约增加一倍,所以要尽量降低芯片温度以降低失效率。 为防止结温过高,功率较大的管子面积要设计得足够大,而发射区有效边长仍由最大电流确定。 在整个芯片上发热元件的布局分布要均匀,不使热量过分集中在一角。在元件的布局上,还应将容易受温度影响的元件远离发热元件布置。在必须匹配的电路中,可把对应的元件并排配置或轴对称配置,以避免光刻错位和扩散不匀。要注意电源线和地线的位置,这些布线不能太长。 加强工艺监控 版图设计时专门设计参数至最佳值。 其他措施 组微电子测试图形以利工艺监控,及时淘汰不合格产品,调整 (1)元件尺寸的选择要适当,应考虑功率密度、寄生效应、制版光刻误差、横向扩散及扩散容差等因素,Al条应覆盖欧姆接触孔并留一定余量。 (2)保证电路参数的要求:①多发射极晶体管的长脖子区不宜太长,因为太长会导 致/T下降;②避免在输出线上做扩散“地”道;⑧外延层电阻岛上接电源的欧姆接触孔要扩N’。 此外,对于CMOS集成电路,为提高其抗自锁能力,可在版图设计上采取以下措施: (1)合理布置电源接触孔,减小横向电流密度和横向电阻。 ①采用接衬底的环形电源线(P阱),并尽可能将衬底背面接VDD。 ②加多电源VDD和Vss接触孔,并加大接触面积。 ‘ ③对每一个接VDD的孔都要在相邻的阱中配以对应的Vss接触孔,以便加多并行的电流通路。④尽量使VDD和Vss的接触孔的长边相互平行。 ⑤接VDD的孔尽可能安排得离阱远一些。 ⑧按Vss的孔要尽可能安排在P阱的所有边上。 (2)采用伪收集极。伪收集极收集由横向PNP发射极注入的空穴,阻止了纵向NPN的基极注入,从而有效地减少了脚NP。 (3)采用保护环。保护环降低了Rw,增加了PNP的WBL,从而使夕PNP下降,但增加了面积。 (4)尽可能使P—阱和PMOS管的P’区离得远一些。例如输出级的NMOS,PMOS 放在压焊块两侧,可大大减小库NP。
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

7
 

Re: IC设计之FAQ-ASIC篇(转帖)

atch up(闩锁反应) IC layout千变万化,不同的版图工程师画出的版图就会不一样,但无论怎么变化,目的却是共同的,就是实现电路的function并且能够work。其中,各种滋味,好与坏all in your mind 。文中列举了一些图例,仔细看看,或许大家能有所体会。对一个简单的MOS,你打contact的位置不同,会产生不同的效果。 在LAYOUT里面CONTACT的位置和数量是非常重要的,最关键的因素就是CONTACT有较大的电阻!虽然POLY和有源区都有掺杂,增加了导电率,但由于它们是半导体,在与铝线通过CONTACT相连时形成半导体—金属接触,这样的电阻还是比较大的,可能会达到几欧姆,多打CONTACT就是增加了并联的连接,大大降低了接触电阻并且可以保证连接可靠性。CONTACT的位置靠中间比偏边上好,因为各层都是有电阻的,比如有源区上的CONTACT偏在一边会使得源区各处到连接点的距离不等导致电阻不等导致各处有电势差,显然这样的MOS管性能就会变差。 结论:所以画LAYOUT的时候,在有空间的地方多打CONTACT有益无害对一个width很大的mos,通常要进行分割,因为分割成奇数和偶数,而产生了不同。大的MOS被分割成奇数个小的MOS管,MOS管公用的源区和漏区面积上是相同的,因此,源极和漏极的电容也是相同的。而在图二(b)中,大的MOS被分割成偶数个小的MOS管,源区和漏区的个数是不相同的,因此,源极和漏极的电容也是不相同的。GATE的POLY层,也是有较大电阻,加在GATE上的电压也会因为电阻形成电势差,直接影响MOS管的导通情况。 除此之外,GATE并联管开关时间比较统一。而GATE串联管因为电压到达各管的时间显然有差别,会导致各管开关时间不统一,增大开关时间,大大降低MOS管的高频性能。 结论:画LAYOUT的时候,MOS管的GATE端并联比串联好 MOS管的SOUCE或者DRAIN是输出端,我们希望并联的MOS管能同时开关,也能够同时被输出,否则高频性能会变差。显然在图(a)中SOURCE串接的情况下,各点被输出的时间是不同的,而在后一种情况下图(b)则好得多。 结论:画LAYOUT的并联管时,SOUCE和DRAIN端都并接比较好。 制作电阻的衬底是和电阻材料掺杂类型相反的半导体,这样电阻区和衬底就构成了一个pn结,由于pn结都会存在结电容,为了减小寄生电容效应,应该减小连线的长度,用铝线相连。[结尾] 好与坏,其实不难区别,只是要去收集来分析,自然好坏就会相互突显了。 版图最忌就是不均匀,无论是摆放的位置,还是图形的形状,都应该保持均匀、对称!!
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

8
 

Re: IC设计之FAQ-ASIC篇(转帖)

CMOS 版图设计中对电源总线噪声的考虑 本文所描述的噪声现象不是由于热噪声或者电荷散射所引起的,而是由于CMOS I/O驱动器的输出管脚上的电平变化,在电源总线(VDD和VSS)上产生的噪声电压所引起的,被称为电源总线噪声(power bus noise)。   我们知道,每当CMOS门改变其输出电平时有一个电流尖峰(current spike)流过电源总线并产生噪声电压,称它是开关噪声。电源总线以及它们与封装管脚的连接必须有足够的导通性能,使得来自输出驱动器中的所有电流尖峰不致于产生过大的噪声电压,破坏电路的正常操作。然而,芯片中的电源总线以及压焊封装连接线都具有电阻和电感特性,在多个I/O驱动器(或者输出驱动器)排列的版图区域内,最有可能在电源总线上产生较大的噪声电压,过高的电源噪声电压还影响电路的延迟时间,使电路可能出现迟滞故障。 为了保证电路安全可靠地操作,需要减小和限制电源总线噪声。下面从版图设计角度来考虑如何进行好的强壮的电源设计。   从结构和布局考虑  所谓VLSI结构式布局(structuring place-ment)是首先确定功能单元(例如:数据通道、控制模块、存贮器、随机逻辑等)在芯片上放置的区域,然后再分配I/O驱动器及压焊点的位置。当功能块确定了所在区域后,就意味着确定了电源线(VDD)、地线(VSS)和时钟线的分配区域。因为在I/O区域内产生电源噪声最大,所以将它们组成在一起采用与其它功能单元相分离的电源总线,并称为“噪声”电源总线(noise power bus);而功能单元区域中的电源总线称为“静态”电源总线(Quiet power bus)。输入缓冲器上的电源总线可以由“静态”电源总线来提供。这两种电源总线采用各自的压焊点连接不同的管脚,实现电源总线噪声的区域隔离。   根据I/O驱动器的数量和输出驱动电流的大小,“噪声”电源总线可以有多个压焊点及连接管脚。压焊点的位置往往放在距封装管脚最近处,减小连接线的长度。 输出驱动器及分配   为了减小每个输出驱动器在输出电平变化时流入电源总线上的电流尖峰,在驱动器与电源总线连接通道上加入噪声限制电阻,这对大电流驱动是非常必要的。此外,就是对每一个VDD和VSS管脚分配一组输出驱动器。   每一个VSS和VDD所分配的输出驱动器组的数目是有限制的。在两个VSS(或者VDD)之间所分配的输出驱动器为一个VSS组(或者VDD组)。每一个VSS组(或者VDD组)输出驱动器的数目是由输出驱动器类型(是否有噪声限制)和驱动电流确定,这在VLSI版图设计时必须要充分考虑。   另外,如果在版图上有不闭的电源总线,电源总线的末端又远离VSS和VDD管脚,那么在该处电源噪声最大,因为电源总线本身的电感和电阻正比于电源总线的长度,对电源总线进行充放电的CMOS门数也正比于电源总线的长度,所以电源总线上的噪声电压正比于电源总线长度的平方。因此,输出驱动器尽可能地分配在靠近每一个VSS管脚。   总之,电源总线噪声问题是VLSI设计者在版图设计时必须给予充分考虑,特别要注意输出驱动器同时开关噪声。在CMOS数/模混合电路中,电源总线噪声影响程度比纯数字CMOS电路更严重。通过VLSI版图设计技巧、分离“静态”和“噪声”电源总线、增加VSS和VDD管脚数量及噪声限制输出驱动器等方法,控制电源总线噪声,使VLSI芯片能安全可靠地操作。 而且,事实上,对于噪声的抑制除了电路设计上要进行充分的考虑和采用不同的手段使信号足够干净之外,版图设计者拥有一定的电路设计知识和基础理论,养成一个良好的设计习惯(比如在大电流的地方习惯于尽可能多的VIA-stack和对衬底接触,对于如何隔离不同的干扰源和噪声,如何有效的采用一些简单直接的版图设计技巧并且自然的应用到设计当中)对于整个设计在最后物理实现中避免未知因素导致的失效,将非常非常重要。  
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

9
 

Re: IC设计之FAQ-ASIC篇(转帖)

Writing Efficient Testbenches 编写高效的测试设计(testbenches) 原文作者:Mujtaba Hamid 注: 一个设计的测试验证是非常重要的。有效的测试可以助我们快速的完成或改善设计。Testbenches建议编写有效的测试代码来通过软件实现可靠的验证。无意中发现,顺手译为中文,以备将来方便。也贴给没有找到更好中文版本的同道人。 Testbenches本意应该是测试平台更合理,但是在中文中阅读起来很不舒服。所以本文中有时译为“测试设计”,“测试代码”,有时干脆是“测试”。 摘要: 应用笔记为HDL验证设计的新手,或者是没有丰富的测试设计经验的逻辑设计者而编写。 测试设计是验证HDL设计的主要手段。本应用笔记为创建或准备和构建有效的测试设计提供准则。它也提供一个为任何设计开发自较验测的测试设计的一个代数方法。 涉及的所有设计文件可以从以下的站点获得: PC: ftp://ftp.xilinx.com/pub/applications/xapp/xapp199.zip UNIX: ftp://ftp.xilinx.com/pub/applications/xapp/xapp199.tar.gz 简介: 由于设计的规模越来越大和越来越复杂,数字设计的验证已经成为一个日益困难和繁琐的事。面对挑战,验证工程师们依靠许多的验证工具和方法。对于大的系统,如几百万门的设计,工程师们一般使用一套可靠的验证工具。当然,对于一些小的设计,设计工程师常常发现带有测试的hdl仿真器就可以做得很好。 测试设计已经成为一个验证高级语言设计HLL (High-Level Language) 的标准方法。 典型的,测试设计完成以下任务: 实现测试设计; 仿真通过使用模块的测试向量来仿真测试设计; 输出结果到终端或波形窗口以检视; 可选择的将实际结果和预期结果进行比较。 一般测试设计使用工业标准的VHDL或verilog硬件描述语言来编写。测试设计调用功能设计,然后仿真。复杂的测试设计完成一些附加的功能----如它们包含逻辑来为设计决定适当的设计激励或比较实际结果和预期结果。 后续的章节说明了一个非常稳定的测试设计的结构,并且提供了一个自较验测例子----它将自动比较实际结果和测试设计的预期结果。 图1说明一个基于以上基本要求的标准的hdl验证流程。由于测试设计使用VHDL或verilogHDL来描述,测试设计的验证过程可以在不同的平台或不同公司的软件工具环境完成。另外,由于VHDL或verilogHDL是公开的通用标准语言,使用VHDL或verilogHDL来描述验证设计可以毫无困难的在将来重用。 图1使用测试设计的HDL测试验证流程 构建测试设计: 测试设计可以用VHDL或verilogHDL来描述.因为测试设计只用来进行仿真,它们没有那些适应综合中仅应用的rtl语言子集的语法约束的限制.而是所有的行为结构都可以使用。从而测试设计可以编写的更为通用,使得它们可以更容易维护。 所有的测试设计包含了如表1的基本程序段块。正如上面所提到的,测试设计一般包含更多的附加功能,如在终端上可视的结果和内建的错误检测。 表1 测试设计的基本程序段 下面的例子说明经常使用的测试设计的结构。 产生时钟信号 使用系统时钟来的时序逻辑设计必须产生时钟。重复的时钟信号可以很容易的在vhdl或verilog源码中实现。以下是vhdl和verilog的时钟发生示例。 VHDL: -- Declare a clock period constant. Constant ClockPeriod : TIME := 10 ns; -- Clock Generation method 1: Clock <= not Clock after ClockPeriod / 2; -- Clock Generation method 2: GENERATE CLOCK: process begin wait for (ClockPeriod / 2) Clock <= ’1’; wait for (ClockPeriod / 2) Clock <= ’0’; end process; Verilog: // Declare a clock period constant. Parameter ClockPeriod = 10; // Clock Generation method 1: initial begin forever Clock = #(ClockPeriod / 2) ~ Clock; end // Clock Generation method 2: initial begin always #(ClockPeriod / 2) Clock = ~Clock; end
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

10
 

Re: IC设计之FAQ-ASIC篇(转帖)

编写高效的测试设计(testbenches)(译-2) 准备激励信号 为了获得测试设计的验证结果,激励必须在测试设计中提供。在测试设计中使用的并行激励块提供必要的激励。两个方法被考虑:绝对时间激励和相对时间激励。在第一个方法里,仿真变量被详细描述为相对于仿真时间零点。通过比较,相对时间激励提供初始值,然后在重触发激励前等待一个事件。根据设计者的需要,两种方法可以在测试设计中组合使用。 表2绝对时间激励 表2和表3分别以vhdl和verilog提供了一个绝对时间激励和相对时间激励的源代码。 表3相对时间激励 VHDL进程块和Verilog初始块与设计文件中的其他的进程块或初始块同时执行。然而,在每一个进程块或初始块中,事件是按照书写的顺序有序的规划的。这说明在仿真时间零点并发的每一个块激励的顺序。多模块应该被用来将复杂的激励顺序分解为有更好的可读性和方便维护的代码。 显示结果 在verilog中推荐使用关键字$display 和 $monitor 显示结果。虽然vhdl没有等效的显示指令,它提供了std_textio标准文本输入输出程序包。它允许文件的i/o重定向到显示终端窗口(作为这个技术的示例,参看下面的自较验查验证设计) 下面是verilog示例,它将在终端屏幕上显示一些值。 // pipes the ASCII results to the terminal or text editor initial begin $timeformat(-9,1,"ns",12); $display(" Time Clk Rst Ld SftRg Data Sel"); $monitor("%t %b %b %b %b %b %b", $realtime, clock, reset, load, shiftreg, data, sel); end 关键字 $display在终端屏幕上输出引用的附加的说明文字(“。。。”).关键字$monitor操作不同。因为它的输出是事件驱动的。例中的变量$realtime(由用户赋值到当前的仿真时间)用于触发信号列表中值的显示。信号表由变量 $realtime开始,跟随其他将要显示的信号名(clock, reset, load等)。以%开始的关键字包含一个格式描述的表,用来控制如何格式化显示信号列表中的每个信号的值。格式列表是位置确定的。每个格式说明有序地与信号列表中的信号顺序相关。比如%t说明规定了$realtime的值是时间格式。并且第一个%b说明符格式化clock的值是二进制形式。verilog提供附加的格式说明,比如%h用于说明十六进制,%d说明十进制,%c说明显示为八进制。(参见verilog准则了解完整的关键字及格式描述符)
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

11
 

Re: IC设计之FAQ-ASIC篇(转帖)

编写高效的测试设计(testbenches)(译-3) 简单的测试设计 简单的测试设计实例化用户设计,然后提供相应的激励。测试输出被图形化显示在仿真器的波形窗口里或者作为文本发送到用户的终端或者是管道输出文本。 以下是一个简单的用Verilog实现的设计,它实现了一个移位寄存器的功能。 module shift_reg (clock, reset, load, sel, data, shiftreg); input clock; input reset; input load; input [1:0] sel; input [4:0] data; output [4:0] shiftreg; reg [4:0] shiftreg; always @ (posedge clock) begin if (reset) shiftreg = 0; else if (load) shiftreg = data; else case (sel) 2’b00 : shiftreg = shiftreg; 2’b01 : shiftreg = shiftreg << 1; 2’b10 : shiftreg = shiftreg >> 1; default : shiftreg = shiftreg; endcase end endmodule 以下是简单的测试设计示例移位寄存器设计的例子,verilog描述。 module testbench; // declare testbench name reg clock; reg load; reg reset; // declaration of signals wire [4:0] shiftreg; reg [4:0] data; reg [1:0] sel; // instantiation of the shift_reg design below shift_reg dut(.clock (clock), .load (load), .reset (reset), .shiftreg (shiftreg), .data (data), .sel (sel)); //this process block sets up the free running clock initial begin clock = 0; forever #50 clock = ~clock; end initial begin// this process block specifies the stimulus. reset = 1; data = 5’b00000; load = 0; sel = 2’b00; #200 reset = 0; load = 1; #200 data = 5’b00001; #100 sel = 2’b01; load = 0; #200 sel = 2’b10; #1000 $stop; end initial begin// this process block pipes the ASCII results to the //terminal or text editor $timeformat(-9,1,"ns",12); $display(" Time Clk Rst Ld SftRg Data Sel"); $monitor("%t %b %b %b %b %b %b", $realtime, clock, reset, load, shiftreg, data, sel); end endmodule 以上的测试设计实例化设计,设置时钟,提供激励信号。所有的进程块在仿真时间零点开始。英镑标记(#)说明下一个激励作用前的延迟。$stop命令使仿真器停止测试仿真(所有测试设计中都应该包含一个停止命令)。最后,$monitor语句返回ascII格式的结果到屏幕或者管道输出到一个文本编辑器。接后的是一个vhdl描述的的测试设计,它实例化设计并提供激励到上述用verilog描述的移位寄存器. VHDL 测试设计示例: library IEEE; use IEEE.std_logic_1164.all; entity testbench is end entity testbench; architecture test_reg of testbench is component shift_reg is port (clock : in std_logic; reset : in std_logic; load : in std_logic; sel : in std_logic_vector(1 downto 0); data : in std_logic_vector(4 downto 0); shiftreg : out std_logic_vector(4 downto 0)); end component; signal clock, reset, load: std_logic; signal shiftreg, data: std_logic_vector(4 downto 0); signal sel: std_logic_vector(1 downto 0); constant ClockPeriod : TIME := 50 ns; begin UUT : shift_reg port map (clock => clock, reset => reset, load => load, data => data, shiftreg => shiftreg); process begin clock <= not clock after (ClockPeriod / 2); end process; process begin reset <= ’1’; data <= "00000"; load <= ’0’; set <= "00"; wait for 200 ns; reset <= ’0’; load <= ’1’; wait for 200 ns; data <= "00001"; wait for 100 ns; sel <= "01"; load <= ’0’; wait for 200 ns; sel <= "10"; wait for 1000 ns; end process; end architecture test_reg; 上述vhdl测试设计与之前提到的verilog测试设计的功能是相似的,如希望用一个命令来返回输出到终端。在vhdl中,std_textio程序包被用于在终端上显示信息,它将被搁到下一节说明。 自动验证 推荐自动实现测试结果的验证,尤其是对于较大的设计来说。自动化减少了检查设计是否正确所要求的时间,也使人可能的犯错最少。 一般有以下几种常用的自动测试验证的方法: 1、数据库比较。首先,要创建一个包含预期输出(一个黄金向量文件)的数据库文件。然后,仿真输出被捕获并与黄金向量文件中参考的向量比较(在unix中的diff 工具可以用来比较ascii数据文件)。然而,因为从输出到输入文件指针没有提供,是这种方法的一个缺点,使得跟踪一个导致错误输出的原因比较困难。 2、波形比较。波形比较可以自动或是手动的运行。自动的方法使用一个测试比较器来比较黄金波形与测试输出波形。xilinx的hdl bencher工具可以用于执行一个自动波形比较(关于hdl bencher的相关信息,请参看 http://www.xilinx.com/products/software/statecad/index.htm) 3、自较验测试。一个自较验测试检查预期的结果与运行时间的实际结果,并不是在仿真结束以后。因为有用的错误跟踪信息可以内建在一个测试设计中,用来说明哪些地方设计有误,调试时间可以非常明显地缩短。更多的关于自较验测试的信息在下一节说明。 自较验测试 自较验测试通过在一个测试文档中放置一系列的预期向量表来实现。运行时间时间间隔将这些向量与定义好的实际仿真结果进行比较。如果实际结果与预期结果匹配,仿真成功。如果结果不匹配,测试报告两者的差异。 为同步设计实现自较验测试更简单一些,因为与实现的结果相比较可以在一个时钟沿或任何一个整数倍的时钟周期后。比较的方法基于设计本身的特性。比如一个用于内存I/O的测试应该检查每一次更新数据时的结果或者从一个内存位置读取。类似的,如果一个设计用了一个显而易见的组合块的数字,在预期结果描述时,组合时延就必须要考虑。 在自较验测试中,预期输出与实际输出在一个特定的运行时间间隔比较以便提供自动的错误检查。这个技术在小到中型的设计中非常好。但是,因为当设计复杂后,可能的输出组合成指数倍的增长,为一个大型设计编写一个自较验测试设计是非常困难和非常费时的。 以下是一个用verilog和vhdl描述的自较验测试的简单的例子:
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

12
 

Re: IC设计之FAQ-ASIC篇(转帖)

编写高效的测试设计(testbenches)(译-4) Verilog例子 下述的设计实例中,预期的结果被详细说明。后面的代码,两种结果被比较,比较的结果被返回终端。如果没有错误,一个“end of good simulation”消息会显示。如果失配发生,根据期望与实际值的失配情况,错误会被相应报告。 ‘timescale 1 ns / 1 ps module test_sc; reg tbreset, tbstrtstop; reg tbclk; wire [6:0] onesout, tensout; wire [9:0] tbtenthsout; parameter cycles = 25; reg [9:0] Data_in_t [0:cycles]; // ///////////////////////////// // Instantiation of the Design // ///////////////////////////// stopwatch UUT (.CLK (tbclk), .RESET (tbreset), .STRTSTOP (tbstrtstop), .ONESOUT (onesout), .TENSOUT (tensout), .TENTHSOUT (tbtenthsout)); wire [4:0] tbonesout, tbtensout; assign tbtensout = led2hex(tensout); assign tbonesout = led2hex(onesout); /////////////////////////////////////////////////////////////// //EXPECTED RESULTS /////////////////////////////////////////////////////////////// initial begin Data_in_t[1] =10’b1111111110; Data_in_t[2] =10’b1111111101; Data_in_t[3] =10’b1111111011; Data_in_t[4] =10’b1111110111; Data_in_t[5] =10’b1111101111; Data_in_t[6] =10’b1111011111; Data_in_t[7] =10’b1110111111; Data_in_t[8] =10’b1101111111; Data_in_t[9] =10’b1011111111; Data_in_t[10]=10’b0111111111; Data_in_t[11]=10’b1111111110; Data_in_t[12]=10’b1111111110; Data_in_t[13]=10’b1111111101; Data_in_t[14]=10’b1111111011; Data_in_t[15]=10’b1111110111; Data_in_t[16]=10’b1111101111; Data_in_t[17]=10’b1111011111; Data_in_t[18]=10’b1110111111; Data_in_t[19]=10’b1101111111; Data_in_t[20]=10’b1011111111; Data_in_t[21]=10’b0111111111; Data_in_t[22]=10’b1111111110; Data_in_t[23]=10’b1111111110; Data_in_t[24]=10’b1111111101; Data_in_t[25]=10’b1111111011; end reg GSR; assign glbl.GSR = GSR; initial begin GSR = 1; // /////////////////////////////// // Wait till Global Reset Finished // /////////////////////////////// #100 GSR = 0; end // //////////////// // Create the clock // //////////////// initial begin tbclk = 0; // Wait till Global Reset Finished, then cycle clock #100 forever #60 tbclk = ~tbclk; end initial begin // ////////////////////////// // Initialize All Input Ports // ////////////////////////// tbreset = 1; tbstrtstop = 1; // ///////////////////// // Apply Design Stimulus // ///////////////////// #240 tbreset = 0; tbstrtstop = 0; #5000 tbstrtstop = 1; #8125 tbstrtstop = 0; #500 tbstrtstop = 1; #875 tbreset = 1; #375 tbreset = 0; #700 tbstrtstop = 0; #550 tbstrtstop = 1; // ///////////////////////////////////////////////////// // simulation must be halted inside an initial statement // ///////////////////////////////////////////////////// // #100000 $stop; end integer i,errors; /////////////////////////////////////////////////////////////////// /////////////// // Block below compares the expected vs. actual results // at every negative clock edge. /////////////////////////////////////////////////////////////////// /////////////// always @ (posedge tbclk) begin if (tbstrtstop) begin i = 0; errors = 0; end else begin for (i = 1; i <= cycles; i = i + 1) begin @(negedge tbclk) // check result at negedge $display("Time%d ns; TBSTRTSTOP=%b; Reset=%h; Expected TenthsOut=%b; Actual TenthsOut=%b", $stime, tbstrtstop, tbreset, Data_in_t, tbtenthsout); if ( tbtenthsout !== Data_in_t ) begin $display(" ------ERROR. A mismatch has occurred-----"); errors = errors + 1; end end if (errors == 0) $display("Simulation finished Successfully."); else if (errors > 1) $display("%0d ERROR! See log above for details.",errors); else $display("ERROR! See log above for details."); #100 $stop; end end endmodule 这种简单的自较验测试设计可以转换到任何测试场合----当然,预期的输出值和信号的名字在重用时是需要更改的。如果不需要每个时钟沿检查,需要的话可以修改for-loop结构。 如果仿真成功,信息就会在显示终端上显示:
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

13
 

Re: IC设计之FAQ-ASIC篇(转帖)

编写高效的测试设计(testbenches)(译-5) VHDL 示例: 在VHDL中,向量文件包含预期的结果。VHDL 的textio程序包用于从向量文件中读取数据,和显示错误信息。这个测试用VHDL示例秒表设计. LIBRARY IEEE; USE IEEE.std_logic_1164.all; LIBRARY ieee; USE IEEE.STD_LOGIC_TEXTIO.ALL; USE STD.TEXTIO.ALL; ENTITY testbench IS END testbench; ARCHITECTURE testbench_arch OF testbench IS COMPONENT stopwatch PORT ( CLK : in STD_LOGIC; RESET : in STD_LOGIC; STRTSTOP : in STD_LOGIC; TENTHSOUT : out STD_LOGIC_VECTOR (9 DOWNTO 0); Figure 3: Verilog Example Verification ONESOUT : out STD_LOGIC_VECTOR (6 DOWNTO 0); TENSOUT : out STD_LOGIC_VECTOR (6 DOWNTO 0) ); END COMPONENT; SIGNAL CLK : STD_LOGIC; SIGNAL RESET : STD_LOGIC; SIGNAL STRTSTOP : STD_LOGIC; SIGNAL TENTHSOUT : STD_LOGIC_VECTOR (9 DOWNTO 0); SIGNAL ONESOUT : STD_LOGIC_VECTOR (6 DOWNTO 0); SIGNAL TENSOUT : STD_LOGIC_VECTOR (6 DOWNTO 0); constant ClockPeriod : Time := 60 ns; FILE RESULTS: TEXT IS OUT "results.txt"; signal i: std_logic; BEGIN UUT : stopwatch PORT MAP ( CLK => CLK, RESET => RESET, STRTSTOP => STRTSTOP, TENTHSOUT => TENTHSOUT, ONESOUT => ONESOUT, TENSOUT => TENSOUT ); stimulus: PROCESS begin reset <= ’1’; strtstop <= ’1’; wait for 240 ns; reset <= ’0’; strtstop <= ’0’; wait for 5000 ns; strtstop <= ’1’; wait for 8125 ns; strtstop <= ’0’; wait for 500 ns; strtstop <= ’1’; wait for 875 ns; reset <= ’1’; wait for 375 ns; reset <= ’0’; wait for 700 ns; strtstop <= ’0’; wait for 550 ns; strtstop <= ’1’; end process stimulus; clock: process begin clk <= ’1’; wait for 100 ns; loop wait for (ClockPeriod / 2); CLK <= not CLK; end loop; end process clock; check_results : process variable tmptenthsout: std_logic_vector(9 downto 0); variable l: line; variable good_val, good_number, errordet: boolean; variable r : real; variable vector_time: time; variable space: character; file vector_file: text is in "values.txt"; begin while not endfile(vector_file) loop readline(vector_file, l); read(l, r, good => good_number); next when not good_number; vector_time := r * 1 ns; if (now < vector_time) then wait for vector_time - now; end if; read(l, space); read(l, tmptenthsout, good_val); assert good_val REPORT "bad tenthsoutvalue"; wait for 10 ns; if (tmptenthsout /= tenthsout) then assert errordet REPORT "vector mismatch"; end if; end loop; wait; end process check_results; end testbench_arch; library XilinxCoreLib; CONFIGURATION stopwatch_cfg OF testbench IS FOR testbench_arch FOR ALL : stopwatch use configuration work.cfg_tenths; END FOR; END FOR; END stopwatch_cfg; 以下向量文件用于上述的测试。它包含了预期的仿真值。 -- Vector file containing expected results 0 1111111110 340 1111111110 400 1111111101 460 1111111011 520 1111110111 580 1111101111 640 1111011111 700 1110111111 760 1101111111 820 1011111111 880 0111111111 940 1111111110 1000 1111111110 1060 1111111101 1120 1111111011 1180 1111110111 1240 1111101111 1300 1111011111 1360 1110111111 1420 1101111111 1480 1011111111 1540 0111111111 1600 1111111110 1660 1111111110 1720 1111111101 1780 1111111011 如果错误被检测到,它会显示在一个仿真提示器中显示。图4展示在MTI脚本窗口
此帖出自FPGA/CPLD论坛
 
 
 

回复

108

帖子

0

TA的资源

宇宙尘埃

14
 

Re: IC设计之FAQ-ASIC篇(转帖)

编写高效的测试设计(testbenches)(译-6) 编辑测试文件的准则 本节提供测试设计的编辑准则。正如计划一个电路设计可以帮助构建更好的电路性能,计划好测试方案可以提高仿真验证的结果。 在编写测试设计前要了解仿真器 虽然通用仿真工具遵从HDL工业标准,但标准并没有说明多少重要的仿真描述条项。不同的仿真器有不同的功能,兼容能力,和执行性能,形成不同的仿真结果。 --基于事件vs基于周期的仿真 仿真器使用基于事件或基于周期的仿真方法。基于事件的仿真器,当输入,信号,或是门改变了值,来确定仿真器事件的时间。在一个基于事件的仿真器中,一个延时值可以附加在门电路或是电路网络上来构建最适的时间仿真。基于周期的仿真器面向同步设计。他们最优化组合逻辑,在时钟周期内分析结果。这个功能使得基于周期的仿真器比基于事件的仿真器更快更有效。然而,由于基于周期的仿真器不允许详细的时间说明,他们并不如基于事件的仿真器准确。对于更多的关于两者的差异的信息,参看 http://www.ednmag.com/ednmag/reg/1996/070496/14df4.htm 上的"数字逻辑仿真:事件驱动,周期驱动,和Home-Brewed"(Digital Logic Simulation: Event-Driven, Cycle-Based, and Home-Brewed), --确定事件时间 基于事件的仿真器提供商使用不同的运算法则来确定仿真事件。所以,根据仿真器用来确定的运算法则不同,同一个仿真时间的事件被确定为不同的次序(根据在每个事件之间插入的delta延时)。为避免对运算法则的依赖和确保正确的结果,一个事件驱动测试应该详细描述明确的激励次序。 --避免使用无限循环 当一个事件添加到基于事件的仿真器,cpu和内存的使用就增加了,仿真过程就会变慢。除非是评价测试设计,无限循环不应该使用来作为设计的激励。一般地,时钟被说明为一个内部的无限循环(如verilog中的'forever'循环),但是没有其他信号事件。 --细分激励到逻辑模块 在测试中,所有初始块(verilog)或进程块(VHDL)并列地运行。如果无关的激励被分离到独立的块,测试激励的次序会变得更容易实现和检视。因为每个并行的块相关于零点运行,对于分离的块传递激励更容易。分离激励块的使用使得测试设计建立,维护和升级(参看后面的高级测试技术,及该技术的示例) --避免显示并不重要的数据 大型设计的测试可能包含10万以上的事件或匿名信号。显示大量的仿真数据会相当地降低仿真的速度。最好只是尝试每整数时钟周期时相应的信号来确保适当的仿真速度。
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表