IC博文.docx
- 文档编号:24710737
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:53
- 大小:398.65KB
IC博文.docx
《IC博文.docx》由会员分享,可在线阅读,更多相关《IC博文.docx(53页珍藏版)》请在冰豆网上搜索。
IC博文
4.1逻辑综合概述
4.1.1逻辑综合的概念
综合(synthesis):
就是把思想转换为实现欲想功能的可制造的设计。
综合是约束驱动和基于路径的。
在这里,综合也就是把行为级或RTL级的HDL描述转换为门级电路的过程,用公式表示就是:
综合等于 =翻译 +优化 +映射
(Synthesis =Transiation +Optimization +Mapping )用图形表示就是:
(见图4.1)
图4.1综合的概念
4.1.2逻辑综合的工具介绍
。
工具操作界面
设计编译器(DesignCompiler简称DC)是Synopsys综合工具的核心。
综合一个设计时,可以选用两种界面:
A。
设计分析器(DesignAnalyzer简称DA)-图形窗口界面。
B。
dc_shell—命令行界面。
DA图形窗口界面的启动:
%da
dc_shell命令行界面的启动;%dc_shell
dc_shell界面的提示符为:
dc_shell >
dc_shell命令行界面支持两种脚本语言:
dcsh模式和dctcl模式。
dcsh是使用源于Synopsys的语言。
dctcl使用工具命令语言(ToolCommandLangugae)。
dcsh模式和dctcl模式比较
tcl是一种开放型的工业标准语言。
它比dc_shell更加强大。
启动dcsh模式用dc_shell命令,启动dctcl模式用dc_shell -t
如果你已经有了dcsh的setup文件或脚本文件(.scr),你想转换为Tcl的setup文件和约束文件,则我们只需执行下面命令即可.
setup文件的转换:
设dcsh的setup文件为.synopsys_dc.setup.old,要转换为Tcl的setup文
件.synopsys_dc.setup则
%dc-transcript .synopsys_dc.setup.old .synopsys_dc.setup脚本文件的转换:
设dcsh的约束文件为old_scriptfile.scr,dctcl的约束文件为tcl_script.tcl,则%dc-transcriptold_scriptfile.scrtcl_script.tcl
由于dcsh和dctcl是可以转换的,以下的介绍中,在支持dcsh的地方,将都用dcsh命令。
。
Synopsys格式
大多数Synopsys产品都支持和共享一个公用的中间结构--”db”格式。
db文件是描述
文本数据的二进制已编译表格式。
DC可以读和写以下的所有格式:
Verilog,VHDL,
EDIF。
逻辑综合的流程
流程图如图4.2:
图4.2逻辑综合设计流程
4.2 setup文件,库以及一些基本概念
4.2.1 setup文件
把行为级描述转换为门级电路,在映射过程种,必须有技术库的支持,否则它将找不参照的元器件。
为此我们在综合前必须在setup文件中设置好综合所需的技术库。
这里所需的技术库的格式为.db和.sdb格式。
技术库的描述略。
Synopsys的设计编译器(DesignCompiler,简称DC)提供了三个同名的setup文
件.synopsys_dc.setup。
一个为安装目录下的setup文件,它提供系统管理员指定的系统变量设置。
一个为你根目录下的setup文件,它提供你的工作环境变量的设置:
公司的名字,你的名字,背景色。
这是由用户指定的DC值。
一个为你工作目录下的setup文件,它规定了你设计所指定的DC值,如:
searchpath,targetlibrary,linklibrary ,symbollibrary.
启动DC工具时,它依次读入这三个文件,且读的越后的文件优先级别更高,即相同的
变量,后面的设置值将覆盖前面的设置。
根目录下的setup例子如下:
company = “your_company”;
designer = “your_name”;
view_blackground = “black”;
工作目录下的setup文件例子如下:
dcsh模式:
searsh_path = {} +search_path
link_library = {MTC45000.db};
target_library = {MTC45000.db};
symbol_library = {MTC45000.sdb};
define_design_libwork -pathwork ;
Tcl模式:
setsearch_path [concat [list] $search_path]
setlink_library [listMTC45000.DB]
settarget_library [listMTC45000.db]
setsymbol_library [listMTC45000.sdb]
define_design_libwork -pathwork
说明:
search_path:
为DC提供未分析设计标准的搜寻路径,亦即你的技术库的搜寻路径。
如果你的库不是放在DC的安装目录下的库的目录下,则你还需修改你的search+path,
指定库的目录。
方法是:
dcsh模式:
search_path = {directory} +search_pathdctcl模式:
setsearch_path [concat [listdirectory] $search_path]link_library:
指明了你的设计所参照的子设计的位置。
DC根据link_library寻找它所参照的设计。
如果参考设计的完整名字在link_library里没有定义,则需在search_path中包括这参考设计的路径。
link_library定义了被单独使用的元器件的库的名字。
即,
link_library里的元器件是不被DC所inferred的。
4.2.2库
target_library:
指明了在你优化设计时用到的元器件的库。
symbollibrary:
指明了含技术库元件的图形描述的库。
4.2.3对象
在进行综合时,我们经常会遇到一些对象的概念。
搞清楚这些概念具体是指代什幺是很有必要的。
Design:
对应于执行一定逻辑功能的电路描述。
design可以是独立的一个,也可以含有其他的子设计。
子设计虽然可以是设计的一部分,但是Synopsys也把它看成是一个设计。
Cell:
是design中的子设计的一个instance。
在Synopsys的术语中,cell和
instance被认为是一样的。
Reference:
cell或instance参考的源设计的定义。
Port:
指主要inputs,outputs或design的IO管脚。
Pin:
对应于设计中的cell的input,output,或IO管脚。
Net:
这是信号的名字,即通过连接ports与pins或pins与pins而把一个设计连在一起的的金属线的名字。
Clock:
作为时钟源的port或pin..
library:
对应于设计的综合目标或参考连接的工艺指定单元的集合。
具体示例如图4.3:
图4.3 对象
4.3设计分块
分块(partitioning):
把复杂的设计分成各个小部分的过程。
Partitioning =Divide +Conquer
概念如图4.4
图4.4分块的概念
分块是成功的进行综合和布局布线的关键。
传统上的分块是根据逻辑功能,而不考虑综合的。
固定的边界降低了综合结果的质量,使优化难以进行。
正确的给设计分块能大大的增强设计结果,而且降低编译的时间和简化脚本的管理。
以下是分块的几条建议:
1. 把相关的组合逻辑保留在同一模块中;
2. 考虑设计的重用;
3. 根据它们的功能划分模块;
4. 把结构逻辑和随机逻辑分开;
5. 合理的块大小(每个块最大大约为10K个门);
6. 把顶层分块出来(独立I/OPads,边界扫描BoundaryScan ,核心逻辑,Clocks);
7. 顶层避免存在glue-logic;
8. 把状态机和其他逻辑独立开来;
9. 避免在一个块中存在多时钟;
10. 把用来同步多个时钟的块独立出来;
11. 分块时考虑你的版图设计。
块的产生:
entity和module语句定义了层次的块。
entity或module的示例也产生了一个新层。
算术电路( +,- ,*,。
。
)的inference也能产生新层。
process和always语句不会产生层次。
逻辑优化并不能穿过块的界线。
最好的分块是把相关的组合逻辑和它的目的寄存器聚集在同一个块中。
这样组合优化技术能被完全的利用,时序优化也可以吸收一些组合逻辑到复杂的触发器中(JK,T,Clock-enabled)。
好的分块如图4.5所示:
图4.5最佳的分块
什幺是glue-logic:
就是用一个组合逻辑把几个块结合起来,这个组合逻辑就是gluelogic.由于这gluelogic不能被吸收,优化是被限制的,要删除这gluelogic,我们把这NAND放进后面的逻辑电路中。
这样gluelogic就可以和其他逻辑一起优化了。
顶层设计只能是一个结构的网表,不需要被编译。
换句话说,就是顶层不能含gluelogic,当然其他层最好也是不要存在gluelogic。
分块时各个块的大小最好不要相差太大,因为,太小多余的边界将限制优化,太大编译的时间又太长。
尽量减少不必要的层。
编写HDL源代码时每一个块的输出最好都是通过寄存器实现,这样可以可以简化约束的说明和方便优化。
inputdelay和outputdelay可以不用设置。
块的名字必须和文件名相同,否则在分析是将会出错。
初始的分块由HDL定义。
不满意的话,DC可以进行调整。
DC分块的命令是group与ungroup.
例如我们把两个块U1,U2合并为一个块U23,则转到当前层后group {U1,U2} -cell_nameU23
ungroup {U23}
命令的具体应用请查看在线帮助。
4.4读进设计
DC的输入格式可以是VerilogHDL,VHDL等硬件描述语言,可编程逻辑阵列(PLA),EDIF2000,格式。
对于HDL格式,DC要求用analyze和elaborate读进设计。
analyze:
读进VHDL,或Verilog文件,检查语法和可综合逻辑,并把设计已中间格式存在设计工作库(WORK)中。
analyze后,在DA(DesignAnalyzer)中并看不到有什幺东西出现。
analyze命令可以同时对若干个文件执行操作。
elaborate:
从工作库中把analyze后的中间文件转换为一个设计。
elaborate命令用综合的操作符代替HDL的操作符,且决定正确的总线大小。
elaborate命令后,在DA中你可以看到出来了一个一个的模块。
一个文件一个,即一个entity或module一个。
elaborate一次只能对一个文件进行操作。
这点需要注意。
在这里我们需要提醒一下的是,entity或module的名字,即设计的名字必须和文件
名相同。
因为analyze后它存在WORK里的名字是设计的名字(entityormodule)而不是你源程序的文件名,所以如果你elaborate的是文件名,那幺如果设计和文件名不同,DC将找不到你的设计,出现error。
当然如果你不厌其烦的特别让elaborate他的设计名,这问题就不存在了。
对于其他非HDL文件,DC用read命令读进设计。
read命令并不产生中间文件,而是之间把他转换为了DC里的符号。
理论上,read可以读进所以的设计,不管是不是HDL文件,但是建议对HDL文件用analyze和elaborate读。
对于VHDL的package文件,我们应该用read命令读,且必须在读进VHDL源程序前读。
4.5设计约束
为了从DC中能得到合适的结果,设计者必须通过描述其的设计环境,目标任务和设计规则来系统的约束其设计。
约束包含时序和面积信息。
它们通常是从规格说明中提取出来的。
DC用这些约束去综合和优化设计以符合其目标任务。
本文只讲些最常用的约束命令,且不会讲的很详细。
约束命令的具体用法请参照在线帮助。
4.5.1设计环境
几个环境变量含义如图4.6所示:
图4.6环境变量
图4.7时序图
set_operating_conditions:
描述了设计的工艺,电压和温度等条件。
通常以
WORST,TYPICAL,BEST的情况进行描述。
技术库通常具有正常情况的的特性。
为了查找芯片
商提供的运行环境,我们可以用report_liblibname命令。
set_operating_conditions 例子:
dc_shell>current_design = “addtwo”
dc_shell>set_operating_conditions -max “typ_124_4.50”最坏(即最慢)的运行条件是最低的电压和最高的温度。
最好(即最快)的运行条件是最高的电压和最低的温度。
对于设置thebestcase的运行条件是:
set_operating_conditions -maxWORSTC_OPCONDS -minBESTC_OPCONDS
如果你想检查你的设置,你可以用report_port -verbose,write_script和report_design命令。
set_load:
定义了输出单元总的驱动能力。
set_load
例子:
直接指定一个值:
dc_shell>set_load 4find (portOUT1)
利用load_of(lib/cell/pin)命令把技术库的门作为负载数的衡量:
dc_shell>set_loadload_of(CBA/AN2/A)find (portOUT1)
load_of(lib/cell/pin)可以乘以系数:
dc_shell>set_loadload_of(CBA/IVA/A) * 3find (portOUT1)
set_driving_cell:
模拟了驱动输入管脚的的驱动单元的驱动电阻。
定义了信号到达输入管脚的传输时间,可以直接指明驱动输入管脚的外部实际单元。
set_driving_cell -cell -pin
set_max_capacitance
set_max_fanout
关于时钟抖动Jitter和偏移Skew
系统时序设计中对时钟信号的要求是非常严格的,因为我们所有的时序计算都是以恒定的时钟信号为基准。
但实际中时钟信号往往不可能总是那么完美,会出现抖动(Jitter)和偏移(Skew)问题。
所谓抖动(jitter),就是指两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关,布线对其没有影响。
除此之外,还有一种由于周期内信号的占空比发生变化而引起的抖动,称之为半周期抖动。
总的来说,jitter可以认为在时钟信号本身在传输过程中的一些偶然和不定的变化之总和。
0Y:
L7J
时钟偏移(skew)是指同样的时钟产生的多个子时钟信号之间的延时差异。
它表现的形式是多种多样的,既包含了时钟驱动器的多个输出之间的偏移,也包含了由于PCB走线误差造成的接收端和驱动端时钟信号之间的偏移。
信号完整性对时序的影响,比如串扰会影响微带线传播延迟;反射会造成数据信号在逻辑门限附近波动,从而影响最大/最小飞行时间;时钟走线的干扰会造成一定的时钟偏移。
有些误差或不确定因素是仿真中无法预见的,设计者只有通过周密的思考和实际经验的积累来逐步提高系统设计的水平。
Clockskew和Clockjitter是影响时钟信号稳定性的主要因素。
很多书里都从不同角度里对它们进行了解释。
其中“透视”一书给出的解释最为本质:
ClockSkew:
Thespatialvariationinarrivaltimeofaclocktransitiononanintegratedcircuit;
Clockjitter:
Thetemporalvatiationoftheclockperiodatagivenpointonthechip;
简言之,skew通常是时钟相位上的不确定,而jitter是指时钟频率上的不确定(uncertainty)。
造成skew和jitter
的原因很多。
由于时钟源到达不同寄存器所经历路径的驱动和负载的不同,时钟边沿的位置有所差异,因此就带来了
skew。
而由于晶振本身稳定性,电源以及温度变化等原因造成了时钟频率的变化,就是jitter。
skew和jitter对电路的影响可以用一个简单的时间模型来解释。
假设下图中t(c-q)代表寄存器的最大输出延迟,
t(c-q,cd)表示最小输出延时;t(su)和t(hold)分别代表寄存器的setup,holdtime(暂不考虑p.v.t)差异;t(logic)
和t(logic,cd)分别表示最大的组合逻辑传输延迟和最小组合逻辑传输延迟;
在不考虑skew和jitter的情况下,及t(clk1)和t(clk2)同频同相时,时钟周期T和t(hold)需要满足
T>t(c-q)+t(logic)+t(su)
t(hold) 这样才能保证电路的功能正常,且避免竞争的发生。 如果考虑CLK2比CLK1晚t1的相位,及skew=t1。 则 t(hold) 这意味着电路由更大的倾向发生holdtimeviolation;如果考虑CLK1比CLK2晚t2的相位,及skew=-t2, 则 T>t(c-q)+t(logic)+t(su)+t2 这意味着电路的性能下降了,但由于R2的holdtime始终满足,所以不会有竞争的麻烦存在。 clockjitter 始终是对性能造成负面的影响,一般设计中都需要专门留取10%左右的margin来保证。 clockuncertainty=clockjitter+clockskew. jitter是由时钟源产生的抖动。 skew是时钟树不平衡引起的到达两个寄存器的延迟差。 在cts之后,skew由工具算出,因此sta的时候clockuncertainty可以设一个比较小的值。 另外做holdcheck的时候因为检查的是同一个时钟沿,因此没有jitter只有skew. 一.同步电路的组成 1.组合逻辑电路: 用来实现各种逻辑计算 2.时序逻辑电路: 用来存储由时序电路计算得到的逻辑值 3.时钟分布网络: 向整个电路中的时序逻辑提供正确的时钟信号 二.clockskew问题的提出 1.clockskew的产生 延时与时钟线的长度及被时钟线驱动的时序单元的负载电容、个数有关 由于时钟线长度及负载不同,导致时钟信号到达相邻两个时序单元的时间不同 于是产生所谓的clockskew 2.有关的概念 SetupTime(Ts): 建立时间 即要求数据端信号在时钟信号触发沿到来之前到达的最小时间 HoldTime(Th): 保持时间 即要求在时钟信号触发沿到来之后,数据端信号仍然维持的最小时间 Dcq: 时钟端到触发器输出端Q的延时 三.对同步电路中clockskew的分析 设Dp: 组合逻辑电路部分的延时 Tcp: 时钟周期 TC1: 时钟信号沿时钟树到达寄存器R1的延迟时间 TC2: 时钟信号沿时钟树到达寄存器R2的延迟时间 (1)第K个时钟周期的时钟信号到达R1的时间为KTcp+TC1 第K+1个时钟周期的时钟信号到达R2的时间为(K+1)*Tcp+Tc2 第K个时钟周期数据信号经R1锁存后到达R2数据端的时间为K*Tcp+Tc1+Dcq+Dp 考虑到建立时间(Ts)的要求 这个时间应比第K+1个时钟周期的时钟信号到达R2的时间提前Ts 所以有下式: K*Tcp+Tc1+Dcq+Dp<=(K+1)*Tcp+Tc2-Ts 整理得: Tskew<=Tcp-Dcp-Dp-Ts (1) (2)考虑到保持时间(Th)的要求 第K个时钟周期数据信号经R1锁存后到达R2数据端的时间 应比第K个时钟信号到达R2的时间晚Th 有下式: K*Tcp+Tc1+Dcp+Dp>=K*Tcp+Tc2+Ts 整理得: Tskew>=Th-Dcp-Dp (2) 要使电路正常运行,相邻两个触发器之间的CLOCKSKEW必须满足 (1) (2)两式 当式 (1)不满足时,称发生了setupviolation 当式 (2)不满足时,称发生了holdviolation 当发生了setupviolation时可以通过延长时钟周期,即降低系统频率来解决 而当发生了holdviolation时,电路一定无法正确工作 因此holdviolation是一定要避免的 四.对clockskew的优化方法 插入时钟树时设法使时钟信号同时到达芯片上所有触发器, 虽然可以保证整个电路正确工作,但却不一定使电路工作在最优性能下 针对具体的路径延时,特别是关键路径的延时 合理地调整时钟信号到达各个触发器(或锁存器)的时序 也就是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IC 博文
![提示](https://static.bdocx.com/images/bang_tan.gif)