数字设计之ASIC流程1.docx
- 文档编号:3029910
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:43
- 大小:1.35MB
数字设计之ASIC流程1.docx
《数字设计之ASIC流程1.docx》由会员分享,可在线阅读,更多相关《数字设计之ASIC流程1.docx(43页珍藏版)》请在冰豆网上搜索。
数字设计之ASIC流程1
数字设计流程
第一步、前端功能代码设计:
良好的代码风格可以在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。
所以,在设计之前要按照顶层模块的输入INPUT、输出OUTPUT以及顶层模块内部所调用到的线网wire、reg进行说明,同时要画出顶层模块的内部结构图,便于定义顶层模块所调用到的单元之间的连接端口关系。
良好代码编写风格的通则概括如下:
(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写;
(2)使用有意义的信号名、端口名、函数名和参数名;
(3)信号名长度不要太长;
(4)对于时钟信号使用clk作为信号名,如果设计中存在多个时钟,使用clk作为时钟信号的前缀;
(5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;
(6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b或n表示。
注意在同一个设计中要使用同一个小写字母表示低电平有效;我习惯使用n来表示。
(7)对于复位信号使用rst作为信号名,如果复位信号是低电平有效,建议使用rst_n;注意做异步复位的同步化;一般在使用的时候为了避免异步复位的毛刺对芯片的工作产生影响,都把异步复位用在上电启动的复位过程中,在芯片上电后就不再使用异步复位而改用同步复位,牺牲一个周期的复位等待时间来得到不会受到复位毛刺影响的电路性能;
(8)当描述多比特总线时,使用一致的定义顺序,对于verilog建议采用bus_signal[x:
0]的表示;
(9)尽量遵循业界已经习惯的一些约定。
如*_r表示寄存器输出,*_a表示异步信号,*_pn表示多周期路径第n个周期使用的信号,*_nxt表示锁存前的信号,*_z表示三态信号等;
(10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:
文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;
(11)使用适当的注释来解释所有的always进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。
注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;
(12)每一行语句独立成行。
尽管VHDL和Verilog都允许一行可以写多个语句,但是每个语句独立成行可以增加可读性和可维护性。
同时保持每行小于或等于72个字符,这样做都是为了提高代码得可读性;
(13)建议采用缩进提高续行和嵌套语句得可读性。
缩进一般采用两个空格,如果空格太多则在深层嵌套时限制行长。
同时缩进避免使用TAB键,这样可以避免不同机器TAB键得设置不同限制代码得可移植能力;
(14)在RTL源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog和VHDL语言的关键字;
(15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:
输入信号的clk、rst、enablesothercontrolsignals、dataandaddresssignals。
然后再申明输出信号的clk、rst、enalbesothercontrolsignals、datasignals;
(16)在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug连线错误;
(17)如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。
注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性;
(18)尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效地减少代码行数;
(19)对一些重要的always语句块定义一个有意义的标号,这样有助于调试。
注意标号名不要与信号名、变量名重复;
(20)代码编写时的数据类型只使用IEEE定义的标准类型,在VHDL语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE的标准;
(21)在设计中不要直接使用数字,作为例外,可以使用0和1。
建议采用参数定义代替直接的数字。
同时,在定义常量时,如果一个常量依赖于另一个常量,建议在定义该常量时用表达式表示出这种关系;
(22)不要在源代码中使用嵌入式的dc_shell综合命令。
这是因为其他的综合工具并不认得这些隐含命令,从而导致错误的或较差的综合结果。
即使使用DesignCompiler,当综合策略改变时,嵌入式的综合命令也不如放到批处理综合文件中更易于维护。
这个规则有一个例外的综合命令,即编译开关的打开和关闭可以嵌入到代码中;
(23)在设计中避免实例化具体的门级电路。
门级电路可读性差,且难于理解和维护,如果使用特定工艺的门电路,设计将变得不可移植。
如果必须实例化门电路,我们建议采用独立于工艺库的门电路,如SYNOPSYS公司提供的GTECH库包含了高质量的常用的门级电路;
(24)避免冗长的逻辑和子表达式;
(25)避免采用内部三态电路,建议用多路选择电路代替内部三态电路。
三态电路一般只出现再I/O模块部分。
除了要做好端口与信号的命名约定外,还要根据顶层模块需要实现的功能将其划分若干的子功能模块,并且考虑好每个子功能模块的具体功能与测试激励的方案。
在以上工作都做好后,可以利用软件Debuss将.V的RTL级代码来观察所描述的代码是否与设计所需要的状态转换情况相吻合。
如果吻合可以利用工具NovasnLint2.2v24来检查在代码中是否存在不能进行综合或者综合错误的语法错误,保证在后面的综合过程中不会因为代码描述的问题得到错误的综合网表而无法实现正确的功能。
当然如果该设计式针对FPGA的话这一步骤可以省略。
附:
同步复位与异步复位的选择比较:
同步复位很适合于使用以周期为基础的仿真器。
同步复位通常保证电路100%同步工作。
同步复位保证复位只在时钟有效沿工作,作为一个滤波器过滤掉小的复位毛刺,不过当毛刺发生在时钟有效沿附近时,触发器有可能进入亚稳态。
当复位信号是由一组内部状态产生时,推荐使用同步复位,可以过滤掉时钟周期之间逻辑方程产生的毛刺。
同步复位可能需要一个脉冲延伸器,使得复位的脉冲宽度足够宽,保证复位信号出现在时钟的有效沿。
同步复位意味着需要一个时钟来实现复位操作,对于某些设计来说是很烦人的事。
如果ASIC/FPGA内部有三态的总线,由时钟引起的复位就变得十分重大了。
当芯片上电时,为了防止总线在内部三态上发生争用,芯片必须一个上电异步复位。
这样在芯片上电的时刻,总线就能够正确的分配数据通道而不必等待一个时钟周期来实现同步复位操作,保证了数据传输的正确性,避免总线的竞争。
单独使用异步复位是十分危险的。
最大的问题是复位的释放,也称为resetremoval。
Synopsys要求当敏感列表中的任何一个信号是边沿敏感时,其他所有敏感信号也必须是边沿敏感。
综合异步复位的方法在于设计者对reset-buffer-tree的设计。
如果复位信号直接被外部的复位引脚驱动,那么在该引脚上加“set_drive0”,该信号线上加“set_dont_touch_network”可以保护该信号线不会因为综合发生变化。
建议尽量避免采用同时使用异步复位和置位的触发器。
使用异步复位最大的优势在于,当供应商的库中有异步复位的触发器时,可以保证数据通路(datapath)是干净(clean)的。
异步复位的另一个优势在于电路的复位操作不需要时钟。
异步复位最大的问题在于复位信号有效和无效都是异步的。
有效不是问题,无效是个问题。
如果复位信号在或者靠近触发器时钟的有效沿,触发器的输出会可能进入亚稳态,ASIC的复位状态就丢失了。
异步复位的另一个问题是它的驱动,板极或系统级复位会因为噪声或毛刺而产生虚假复位。
如果系统级真的出现了这个问题,可以考虑用同步复位解决。
另一个类似的问题是这些虚假的复位如果出现在或者靠近触发器时钟的有效沿,触发器可能进入亚稳态。
异步复位信号释放对于时钟来说是异步的,这里有两个潜在的问题。
1)违反复位恢复时间;2)对不同顺序的器件复位信号的释放发生在不同的时钟周期。
复位恢复时间也指复位或者置位信号在时钟上升沿之前释放的建立时间。
使用方针:
每个使用异步复位的ASIC都包括一个复位同步电路
没有复位同步电路,即使仿真中工作正常的异步复位信号在最后的系统中也是无用的。
复位同步逻辑被设计成同时利用同步复位和异步复位的优势。
第二步、综合:
#设计输入
remove_design-all#移除以前所有设计
analyze-formatverilog./cnt.v#读入设计并置顶所需要的设计
elaboratecnt
current_designcnt
uniquify#对一个单元的多个实例进行统一设置
check_design#检查源代码
#设置操作环境、负载模型
set_operating_conditionsWORST_TREE
setauto_wire_load_selectiontrue
set_wire_load_modetop
#设置时钟、复位信号
create_clock"clk"-period10-waveform{05}#创建时钟
set_clock_uncertainty-setup0.2clk#设置时钟扭
set_clock_uncertainty-hold0.1clk
set_clock_transition0.1clk#设置时钟转移
set_clock_latency1.0clk#时钟插入延迟
set_dont_touch_network{clkrstn}#暂不处理的信号
#设置输入驱动和输出负载
set_driving_cell-lib_cellQB40633S-pinDIN[remove_from_collection[all_inputs][get_ports{clkrstn}]]
#输入端口建模
set_drive0{clkrstb}#输入端口驱动强度
set_load0.5[all_outputs]#输出端口负载
#设置输入输出延迟
set_input_delay5.0-clockclk[all_inputs]
set_output_delay3.0-clockclk[all_outputs]
#设计检查和时序检查
check_design>./RPT/check_design.rpt
check_timing>./RPT/check_timing.rpt
#修复多个端口的直接连接(其间插入buffer)和修复违反保持时间约束
set_fix_multiple_port_nets-all-buffer_constants
set_fix_holdclk
#编译以及生成报告
write-fdb-o./DB/d1.db
compile-map_effortmedium
write-fdb-o./DB/d2.db
report_constraint-all_violators>./RPT/all_violators.rpt
report_area>./RPT/area1.rpt
report_timing-nets-capacitance-trans
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 设计 ASIC 流程