- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
带有48字节RAM的日历时钟芯片的设计
日历时钟芯片应用非常广泛,例如在IC卡电子门锁中,可利用日历时钟芯片的定时时钟计数功能,在IC卡内输入客人住房时的时间段,只有当时间段所包含的时间与日历时钟所记录的时间一致时,方可开门,否则IC卡为无效卡。
利用Synopsys公司提供的集成电路设计工具VCS和DC,设计了一个带有48字节RAM的日历时钟芯片,包括该芯片RTL级代码的编写、功能仿真和综合,达到了预期的目标。该芯片的具体性能指标是:工作电源电压为2.5~6V;日历时钟工作电源和RAM数据保持电源电压为1~6V;工作电流最大为50μA;四年日历时钟,24或12小时格式,32.768kHz时基;48字节RAM,自动字节地址增量;具有可编程的闹钟、定时和中断功能。
1 ASIC设计概述
随着深亚微米技术的发展,数字集成电路的规模已经发展到上百万门。未来的二十多年里,一块ASIC芯片中将会达到上千万门的规模。这样的电路规模,仿真和综合优化在开发过程中发函来发函重要。较复杂的数字电子系统设计往往采用自顶向下(Top-Down)的方法,设计流程可以分为以下几个主要的部分:系统级设计、设计实现、设计验证和流片封装。深亚微米工艺下的ASIC设计流程[2]如图1所示。
本文主要介绍芯片的系统级设计和所有逻辑设计,生成可供物理设计的经过验证的门级网表文件。
2 芯片的系统级设计
系统级设计是芯片设计的第一步,也是关键的一步。首先根据设计要求提出设计构想,然后再对这一构想进行细化。本设计把整个系统分成几大模块,即产生32.768kHz的振荡器(这个模块不用设计)、256分频器、48字节RAM和地址寄存器。设计构想如图2所示。
RAM中的00~0FH单元是一些带有特殊功能的寄存器,00H单元是控制芯片所有功能和操作的状态寄存器,通过设置状态寄存器,可以选择32.768kHz时钟模式或计数模式。在日历时钟模式中,1/128秒、秒、分、小时、年/日期、星期/月都是以BCD码分别存放在01H~06H单元的寄存器中;而在事件计数模式中,则对输入到振荡器输入端(OSCI)的脉冲计数,事件计数器为6位BCD码。07H单元是能存储最大数为99天的定时器。08H是控制定闹、定时和中断输出功能的闹钟控制寄存器。09H~0FH单元用于储存用户信息。
对于这样的设计,传统的方法是使用中小规模集成电路来构成,本文则用Verilog HDL描述来实现。整个芯片采用模块化设计方式和Top-Down设计方法,根据寄存器的不同划分成模块,然后用测试程序TestBench对顶层模块进行仿真;仿真通过后利用厂家提供的工艺库及时序约束脚本文件对其进行综合;综合通过后生成门级网表文件,然后再用厂家提供的仿真库对门级网表进行综合后仿真。本文设计用到的工艺库是台湾旺宏公司(Macronix,MXIC)提供的基本单元库(slow.db和fast.db)、基本符号单元库(slow.sdb)和用于综合后仿真的库文件仿真库(models.v)。
这是一个同步时序电路的设计,所以保证正确的时序是设计的关键,本设计中有四个时钟:
(1)系统时钟clksys,是外部微控制器提供的时钟信号,用作寄存器读、写时钟信号;
(2)测试时钟clktest,是整个芯片的测试时钟信号,一般限于厂家使用。
(3)时基时钟clk32,定时方式时,外部石英晶振提供的32.768kHz振荡信号经过256分频后得到时钟信号(evt128),作为RAM前16字节特殊寄存器的同步时钟信号。
(4)计数时钟clkevt,计数模式时的外部计数脉冲信号。
图3是日历时钟顶层模块端口示意图,读选通信号w、写选通信号r、片选信号csn和RAM地址控制信号addr[5:0]是由外部微处理器提供的。当写信号w为真时,将输入数据datin[7:0]写入存储器被选中的地址;当读信号r为真时,将从存储器被选中的地址中输出数据datu[7:0]。当满足下面两个条件之一时,中断请求信号intz输出低电平:①00H单元中的第0位为1,并且08H单元的第3位为1。
由于篇幅有限,在这里只写出顶层模块rtc的部分设计程序,具体如下:
‵timescale 10ns/10ps //模拟时间定标;
module rtc (clktest,clksys,clk32,clkevt,csn,rstz,w,r, addr,datin, datu, intz);
input clktest,clkysy,clk32,clkevt,csn,rstz,w,r; //输入输出端口说话
input[7:0] datin;
input[5:0] addr;
output[7:0] datu;
output intz;
reg[7:0] datu; //设定变量的数据结构;
ctl_status c0 ( clksys,evt128,rstz,w,cs00,……); //调用00H单元子模块;
sec128 c1 (clksys, clktest, evt128, rstz,……); //调用01H单元子模块;
sec c2 (clksys, evt128, clktest,rstz,……); //调用02H单元子模块;
……
int c20 ( timer_flag,alarm_flag,……); //调用产生中断模块;
always @ ( addr or stop_soft or ) begin if(cs & r) begin //根据控制地址信号而输出RAM中各寄存器的数据;
case (addr)
0:datu={stop_soft,hold_flag,func_mode,mask_flag,alarm_en,alarm_flag,time_flag};
1:datu=data_latch[15:8];
……
47:datu=data_ram[255:248];
default:datu=8‵h00;
endcase
end
else
datu=8‵h00;
end
endmodule
在顶层模块中调用了根据不同功能而编写的20个子模块,如ctl_status.v、sec.v和ram.v等。其中RAM存储器的1F~2FH单元是模拟电路,要用全定制的方法生成。而在数字集成电路设计中,仿真时经常要用到存储器的行为模型,这里给出的行为模型ram.v用于仿真。
3 利用EDA工具进行系统仿真
设计人员利用先进的EDA工具作为测试平台,以验证数字电子系统设计模块的逻辑功能和时序功能。虽然不同的EDA工具提供的平台不同,但都可以对被测试对象加载激励信号,并通过波形输出、文件记录输出等方式观察和比较仿真结果。加载激励信号需要设计人员设计测试程序(TestBench)[3],对于较大规模的系统设计,测试程序的设计有时比本身的程序设计还要复杂。
在本文的设计中,首先对每一个子模块设计一个测试程序,单独进行逻辑仿真,然后再设计一个测试程序对整个设计进行逻辑仿真。由于篇幅有限,在这里仅写出sec.v的部分测试程序,具体如下:
‵timescale 10ns/10ps
module sec_test;
reg clksys,evt128,clktest,carry_sec128,rstz,datin,datoout,w;
reg[7:0]datin,datout;
reg[1:0]func_mode;
sec c2 (clksys,evt128,clktest,carry_sec128,rstz,datin, datout,func_mode,w,);
always #10 clksys = ~ clksys;
always #30 evt128 = ~ evt128;
always #50 clktest = ~ clktest;
always #80 carry_sec128 = ~ carry_sec128; //产生输入激励;
initial
begin
rstz = 0;
#90 rstz = 1;
end //产生复位信号
initial
begin
w = 0;
#100 w = 1;
#5 w = 0;
#1100 w = 1;
#5 w = 0;
end //产生写信号
initial
begin
func_mode= 0 ;
#1000 func_mode = 1;
end //功能模式的选择;
initial
begin
datin= 0 ;
#20 datin = 00100101h;
#1000 datin = 00010010;
end //输入数据;
always @ (func_mode or datin of datout)
﹩ display ("At time %t,func_mode=%b,datin is %b%
b,datout is %b",﹩time,func_mode,datin,datout); //输出模拟结果。
利用Synopsys公司的仿真工具VCS进行仿真,无论在功能上还是在时序上,都完全符合要求。
4 利用EDA工具进行综合和优化
综合是利用芯片制造商提供的基于电路单元(综合库)实现用硬件描述语言描述的电路功能。现在许多优秀的综合工具都能借助现有的综合库将Verilog HDL源代码进行综合,转化成门级电路图,并且可以根据设计者施加的约束条件对电路进行优化,产生面积或者速度达到最优的结构,并生成相应的逻辑网表以供后端设计使用。
综合时要进行延时计算和设计规则检查,需要设置的相关内容主要包括:操作环境、导线负载模型、设计约束、设计规则约束。通常情况,设计者要先编辑一个包括这些设置的脚本文件(例如本文编辑的脚本文件rtc.tcl),启动逻辑综合工具DC后就可,执行文件中的各条指令了。综合的过程如图4所示。下面利用日历时钟实例简单介绍这一过程。
(1)建立设计环境
台湾旺宏公司的0.35μm CMOS标准单元综合库slow.db和fast.db包含了与非、或非、非门等基本逻辑单元,还有选择器、与或非、或与非等较复杂的组合逻辑以及DFF(D触发器)等时序逻辑单元。利用该库可以这样来建立环境:
set target_library {slow.db fast.db}
set link_library {*slow.db fast.db}
set search_path "/home/tools/synopsys/library"
(2)读入HDL描述
如果读入多个模块,首先应该读入的是顶层模块。要将当前的设计设置为顶层模块,可以这样来设置:
read_verilog "home/design/rtl/rtc.v"
read_verilog "home/design/rtl/see.v"
current_design rtc
(3)定义环境变量
环境变量输出网表和输出报告等路径设置可以这样来定义:
netlist_path = "home/design/netlist"
report_path = "home/design/report"
(4)定义性能约束、时序约束和面积约束
性能约束主要包括创建时钟、输入延迟和输出延迟等;综合的目标是得到最小的面积。可以这样来设置:
creat_clock-period 70-name my_clock [get_ports clksys]
set ex_clk[remove_from_collection[all_inputs][get_ports clksys]
set_input_delay 4 -clock my_clock ﹩ex_clk
set_output_delay 3 -clock my_clock [all_outputs]
set_max_area 1
(5)编译
用compile命令进行编译即可。
(6)写门级网表
综合后的门级网表可以用edif文件形式保存,也可以用.V文件形式存放,采用如下命令:
write-format verilog-hierarchy-output $netlist_path/rtc.vg
此外,还需要保存延时信息,以便综合后仿真,延时信息一般放在.sdf文件中,采用如下命令:
write_sdf ﹩netlist_path/rtc.sdf-version 1.4
(7)给出报告
可以报告综合出的面积、时序信息、违反约束路径以及单元的个数等,并存放到定义的目录文件中,下面举几个例子:
report_area >$report_path/area.rpt
report_timing >$report_path/timing.rpt
report_constraint-verbose-all_violators $report_path/constrain.rpt
利用Synopsys公司的逻辑综合工具DC[4]进行综合和优化非常成功。
本文设计主要描述带有48字节RAM的日历时钟芯片的逻辑设计过程,并对其成功地进行了代码编写、仿真和综合,版图设计等。当然,本逻辑设计不是一蹴而就的。在此过程中,对各种异常情况都需要认真分析和反复调试。