天津大学ASIC设计中心数字集成电路设计基本流程初稿ShiyafengWord下载.docx
《天津大学ASIC设计中心数字集成电路设计基本流程初稿ShiyafengWord下载.docx》由会员分享,可在线阅读,更多相关《天津大学ASIC设计中心数字集成电路设计基本流程初稿ShiyafengWord下载.docx(70页珍藏版)》请在冰豆网上搜索。
inputclk,rst_n;
outputclk0,clk1,clk2,clk3;
//internalsignaldeclaration
reg[7:
0]state,next_state;
regclk0,clk1,clk2,clk3;
wireclk_tmp;
//one-hotcodeforfsm
parameters0=8'
b0000_0001,
s1=8'
b0000_0010,
s2=8'
b0000_0100,
s3=8'
b0000_1000,
s4=8'
b0001_0000,
s5=8'
b0010_0000,
s6=8'
b0100_0000,
s7=8'
b1000_0000;
//statetriggeredbytherisingedgeofclk_tmpandresetedbyasynchronousrst_nwith1'
b0
always@(posedgeclk_tmpornegedgerst_n)
if(!
rst_n)
state<
=s0;
else
=next_state;
//fsmstatecyclewiths0-->
s1-->
s2-->
s3-->
s4-->
s5-->
s6-->
s7-->
s0
always@(rst_norstateorclk0orclk1orclk2orclk3)
{clk3,clk2,clk1,clk0}=4'
b0000;
//resetbyrst_nifrst_n=1'
b0
case(state)
s0:
begin
next_state=s1;
//clk0=1'
b0,clk1=1'
b0,clk2=1'
b0,clk3=1'
end
s1:
next_state=s2;
{clk2,clk1,clk0}=4'
b0001;
b1,clk1=1'
s2:
next_state=s3;
b0011;
//clk0=1'
b1,clk2=1'
s3:
next_state=s4;
b0111;
//clk0=1'
b1,clk3=1'
b0
s4:
next_state=s5;
b1111;
b1
s5:
next_state=s6;
b1110;
s6:
next_state=s7;
b1100;
s7:
next_state=s0;
b1000;
end
default:
//default
endcase
assignclk_tmp=clk^clk3;
//ifclk3=1'
b0,clk_tmp=clk;
//ifclk3=1'
b1,clk_tmp=~clk;
endmodule
二、功能仿真
方法1:
使用modelsim进行功能仿真。
使用modelsim建立工程,添加verilog文件,编译、仿真(注意:
在simulation时需要将enableoptimization选项的勾选去掉,否则在波形查看窗口中可能找不到信号),在波形窗口中观察仿真波形。
如下图所示。
从图中可以看出clk0、clk1、clk2、clk3实现了对原始信号的7分频。
方法2:
使用SynopsysVCS进行前仿真
打开终端,输入命令:
vcs-R-debug_pp../../src/odd_div.v../../src/testbench.v
该命令调用VCS进行编译仿真。
注:
testbench中需加入如下语句,用于生成VPD波形文件:
initial
$vcdpluson(0,testbench);
$vcdplusautoflushon;
End
如果要得到其他格式波形文件,可在终端中使用相关命令进行转换。
如执行
vpd2vcdvcdplus.vpdodd_div.vcd可以得到该波形文件的vcd格式,生成的vcd格式文件为odd_div.vcd,该名称可以自由定义。
同时可以使用vcd2fsdb命令将vcd文件转换成fsdb文件供debussy使用。
三、逻辑综合形成门级网表
1.逻辑综合的概念
完成行为级代码的功能验证之后,接下来需要完成芯片的逻辑综合工作。
那么什么是逻辑综合?
简单地说,逻辑综合就是从RTL级描述得到门级网表的过程。
在这个过程中,我们使用软件的方法来设计硬件,并将门级电路的实现与优化的工作留给综合工具。
它是根据一个系统逻辑功能与性能的要求,在一个包含众多结构、功能、性能均已知的逻辑元件的单元库的支持下,寻找出一个逻辑网络结构的最佳实现方案,也就是实现在满足设计电路的功能、速度及面积等限制条件下,将行为级描述转化为指定技术库中单元电路的连接。
综合过程细分的话主要包括三个阶段:
转换(translation);
优化(optimization)与映射(mapping)。
转换阶段综合工具将高级语言描述的电路用门级电路来实现,对于Synopsys的综合工具DC来说,就是使用gtech.db库(这个库是Synopsys自带的库,它只包含布尔表达式描述的单元电路逻辑,并不包含其他信息,如门延迟、门的驱动能力等)中的门级单元来组成HDL语言描述的电路,从而构成初始的未优化的电路。
优化与映射是综合工具对已有的初始电路进行分析,去掉电路中冗余的单元,并对不满足限制条件的路径进行优化,然后将优化之后的电路映射到由制造商提供的工艺库上。
因此,综合实际上是一个不断迭代的过程,当然这个过程都是由软件去完成的。
在进行逻辑综合的过程中我们需要给设计中的各个模块设置一定的约束条件,这些约束条件定义了综合的目标。
例如时序约束(timingconstraints)定义了每个信号相对于时钟信号的关系。
除约束之外,还需要定义综合的环境,如综合使用工艺库等综合所需的信息。
然后综合工具就根据RTL代码和制定好的约束条件进行综合,最后产生满足设计要求的门级网表。
在综合的过程中我们主要使用的工具是Synopsys公司的DesignCompiler,它可以方便的将HDL语言描述的电路转换到基于工艺库的门级网表。
得到综合后的门级网表和延时文件后,就可以将它用于后端的布局布线了。
2.逻辑综合的基本步骤
下图给出了做电路综合所需要的一些设置、命令及综合的全过程。
我们在使用DesignCompiler(以后称DC)进行综合的时候既可以使用它的图形化界面,也可以通过调用已经写好的脚本文件来使DC自动完成综合的各项操作,这里我们主要讲解后者。
我们这里主要以运行脚本文件为主。
所谓脚本文件就是一系列命令的文本,我们在进入unix/linux环境后可以通过source命令来使综合工具完成整个综合过程。
这里我们还是以前面的奇数分频器的例子为例来说明如何完成综合过程,以及如何编写综合的脚本。
(1)文件目录
fm:
用于存放完成形式验证工作产生的中间文件。
sim:
用于存放前仿和后仿的中间文件。
src:
存放工程的RTL级源代码。
syn:
存放逻辑综合的中间文件和输出的网表及报告等。
post:
存放后端数据。
(2)进入syn目录,启动终端,在终端中输入design_vision启动DesignCompiler图形化窗口。
也可启动dc的shell形式,终端中输入dc_shell。
然后在命令窗中输入source./scr/front_dc.tcl命令,调用编写好的综合脚本完成综合操作。
针对奇数分频器的例子的综合脚本如下:
#/*****************************************************************
#/*Author:
ShiYafeng
#/*Company:
#/*GeneralscriptsforSynopsysDesignCompiler.Someparameters
#/*andvariablesaresetin.synopsys_dc.setupwhileotherdesign
#/*specificthingsaresethere
#/########################################################
#belowparametersshouldbesetaccordwitheachdesign#
#/#################
#setlibrarypath#
setsearch_path{.\
/home/syf/mpw/lib/chrt35/2004.12/csm35/v1.0/synopsys/models\
/home/syf/mpw/lib/chrt35/2004.12/csm35/v1.0/synopsys/icons\
/home/syf/mpw/odd_div\
/home/syf/mpw/odd_div/syn/WORK\
/home/syf/mpw/odd_div/src\
/home/syf/mpw/odd_div/syn/scr\
}
settarget_library{CSM35OS142_typ.db}
setlink_library{*\
CSM35OS142_typ.db\
CSM35IO122_typ.db\
setsymbol_library{CSM35OS142_icon.sdb}
#/###############################
#Generalconfigurationsettings#
setverilogout_no_tritrue
setverilogout_show_unconnected_pinstrue
setbus_naming_style{%s[%d]}
define_name_rulesBORG-allowed{A-Za-z0-9_}-first_restricted"
0-9_\[]"
-max_length30-map{{{"
*cell*"
"
mycell"
},{"
*-return"
myreturnz"
}}}
setactive_designodd_div
setoutfileodd_div
set_min_library"
CSM35OS142_max.db"
-min_version"
CSM35OS142_min.db"
#/################################
#readdesign#
#analyzeandelaboratethefiles#
analyze-formatverilog$active_design.v
elaborate$active_design
current_design$active_design
link
uniquify
check_design
#/###########################
#setoperationenvironments#
set_operating_conditions-maxWCCOM-minBCCOM
set_wire_load_model-name8000
set_wire_load_modeenclosed
#set_driving_cell-cellpc3b05u-pinCIN[get_portspin_name]
#set_drivenum_of_resistance
set_drive0[listclkrst_n]
set_load[load_ofCSM35OS142_typ/inv0d0/I][all_outputs]
#/#######################
#settimingconstraints#
create_clock-period80-waveform{040}[get_portsclk]
set_clock_latency2[get_clocksclk]
set_clock_uncertainty-setup0.5[get_clocksclk]
set_clock_transition0.15[get_clocksclk]
set_dont_touch_network[listclk]
set_input_delay-max24-clockclk[remove_from_collection[all_inputs]clk]
set_output_delay-max24-clockclk[all_outputs]
#/################
#fixandcompile#
set_fix_multiple_port_nets-all-buffer_constants
compile-map_effortmedium
compile-incremental_mapping-map_effortmedium
remove_unconnected_ports[get_cells-hier{*}]
change_names-hierarchy-rulesBORG
#/#####################################
#outputtheresultsandfileswewant#
shmkdirlog
report_constraints-all_violators>
>
log/violaotrs_$outfile
report_timing-delaymin-max_paths5>
log/min_$outfile
report_timing-delaymax-max_paths5>
log/max_$outfile
report_area>
log/area_$outfile
report_reference>
log/ref_$outfile
shmkdirnetlist
#shmkdirdb
write-formatverilog-hierarchy-outputnetlist/$outfile.v
#write_lib-formatdb-outputdb/$outfile.db
write_sdfnetlist/$outfile.sdf
write_sdcnetlist/$outfile.sdc
check_design>
log/check_design.log
通过上面的过程,我们就能得到我们想要的门级网表,此时在我们当前工作文件夹syn里有如下图所示的三个文件夹,其中我们所要的网表就在netlist文件夹中,log文件夹中存放的则是延时和面积等相关报告文件,scr文件夹中存放放的是综合中使用的脚本。
其他文件为综合过程中产生的中间文件。
下图是通过DesignVision看到的综合出来的电路原理图:
(3)如何写脚本文件以及脚本文件中常用语句的含义分析
⑴首先我们要了解综合过程中要使用的库
1链接库(link_library):
设置模块或单元电路的引用,以前面设置链接库命令为例:
setlink_library[list{*}CSM35OS142_typ.dbCSM35IO122_typ.db]在link_library设置中必须包含‘*’,表示DC在引用实例化模块或单元电路是首先搜索已经调进DCmemory中的模块和单元电路,如果不含有‘*’DC会发出无法匹配的模块或单元电路的警告(unresolveddesignreference)。
上面命令中的CSM35OS142_typ.db和CSM35IO122_typ.db是工艺库名。
2目标库(target_library):
设置综合时要映射的库,它包含了单元电路的延时信息,DC综合时是根据target_library中给出的延时信息来计算延迟的。
目标库定义了半导体制造商提供的单元电路及其相关信息的技术库,包括单元名称、引脚名字、单元延时信息、引脚的带负载能力、工作环境等。
设置命令为:
settarget_library[listCSM35OS142_typ.db]
3符号库(symbol_library):
定义了单元电路显示的电路原理图(Schematic)的库。
我们前面启动Design_vision查看电路原理图时就要调用符号库。
⑵设置搜索路径
命令:
setsearch_path[list…]
前面我们知道了对相关库的设置,但是在设置这些库之前,我们先要设置搜索路径,即要告诉DC到哪里去搜索综合时所要用到的文件(包括库文件还有综合前的代码及脚本文件等)。
设置搜索路径时在list后面加上我们要使用的文件路径即可。
⑶读取行为级描述或网表并进行链接
上面例子读取.v文件命令为:
read_verilogseq.v//该命令将读入名字为seq的.v文件
这里我们配合使用了analyze命令和elaborate命令:
analyze是分析HDL的源程序并将分析产生的中间文件存于work(用户也可以自己指定)的目录下;
elaborate则在产生的中间文件中生成verilog的模块,缺省情况下elaborate读取的是work目录中的文件。
current_designseq//定义顶层模块为seq
link/*对读入的模块进行链接,即DC将模块按照RTL级或者门级的描述将电路连接起来,之后的各种限制条件就可以对该电路的顶层模块施加*/
另外我们这里还用到了uniquify命令,该命令主要是为了我们在某个模块时,由于各个模块工作的环境并不相同,那么使用该命令后DC将会针对它们不同的环境风分别进行优化。
⑷定义设计环境
所谓综合就是在设计人员给定的限制条件下对电路进行优化与映射的,它是综合工具对电路一些性能进行折中的结果,对于数字电路来说,就是在电路的面积与功耗,面积与时序上的性能进行折中。
在添加限制条件时,必须对如下的对象施加限制条件:
1电路中需要有时钟定义
2保留时钟网络,不对时钟网络进行综合
3综合的时候需要指定线载模型,用于估计连线延迟
4限制模块中组合路径的输入输出延迟
5限制输出的带负载能力以及输入的驱动单元(drivingcell)
6模块同步输出的输出延迟(outputdelay)的限制,以及同步输入的输入延迟(inputdelay)的限制
7多周期路径(multicyclepath)以及非法路径(falsepath)的限制
8工作环境的约束
定义设计环境的相关命令:
●set_operating_conditions-maxWCCOM-minBCCOM
设置工作环境,由于不同的工作环境所对应的单元电路的延迟也不相同,像工作温度、工作电压以及电路的