第5章 门级仿真和静态时序分析

更新时间:2024-03-30 10:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第5章 门级仿真和静态时序分析

5.1 门级仿真的作用

在逻辑综合后,设计代码被转换为由标准单元(cell)构成的“门级网表”,并包含了一定的时序信息。利用“门级网表”和芯片生产厂家提供的Verilog格式或VHDL格式的库文件,可以进行“门级”仿真分析。“门级”仿真分析一般使用与RTL级仿真相同的测试平台(Testbench),但需要使用实际的时间单位。布线前的“门级仿真”可以证明RTL代码描述的逻辑关系是可利用标准单元实现的,并能预测电路的性能。 5.2 门级仿真方法

在计数器的例子中,门级网表是由脚本文件中以下语句生成的,因此也是一个Verilog文件,内容见下页。

set NETLIST_FILE $WORK_DIR/netlist/counter_gate.v write -format verilog -hier -o $NETLIST_FILE 该文件存放在DC工作目录下的netlist目录中,需要拷贝到/mnt/hgfs/share下,并最终拷贝到window环境下的工作目录下。门级仿真需要使用Verilog格式的标准单元库,该库文件存放在/iclibs/CSMCBCD05/verilog下,名为IC05CScore.v。一种简单的仿真方法是将该库文件、门级的设计代码和测试平台(testbench)文件加入到同一个Project中,一起编译即可。

如果原来的testbench文件中没有使用实际的时间单位,需要先查看库文件中的时间单位,再做相应的修改,使testbench文件与库文件使用相同的时间单位。

module counter ( clk, rst, ld, di, q, cy ); input [3:0] di; output [3:0] q; input clk, rst, ld; output cy; wire n37, n38, n39, n40, N15, n4, n6, n11, n12, n16, n17, n18, n19, n20, n22, n23, n24, n25, n26, n27, n31, n32, n36; XN02D1 U13 ( .A(n11), .B(n31), .Y(n12) ); DFPNSRBQQB2 \\q_reg[1] ( .D(n27), .CK(clk), .RB(n4), .Q(n39), .QB(n36) ); DFPNSRBQQB2 \\q_reg[0] ( .D(n32), .CK(clk), .RB(n4), .Q(n40), .QB(n17) ); DFPNSRBQQB2 \\q_reg[2] ( .D(n26), .CK(clk), .RB(n4), .Q(n38), .QB(n6) ); DFPNSRBQQB2 \\q_reg[3] ( .D(n20), .CK(clk), .RB(n4), .Q(n37) ); MX21D2 U18 ( .A(n18), .B(di[3]), .S(ld), .Y(n20) ); XR02D1 U19 ( .A(n37), .B(n24), .Y(n18) ); MX21D2 U20 ( .A(n12), .B(n16), .S(ld), .Y(n25) ); IN01D2 U21 ( .A(di[2]), .YN(n16) ); MX21D2 U22 ( .A(n17), .B(di[0]), .S(ld), .Y(n32) ); XR02D2 U23 ( .A(n39), .B(n40), .Y(n19) ); MX21D1 U24 ( .A(n19), .B(di[1]), .S(ld), .Y(n27) ); CK01D2 U25 ( .CK(n25), .CN(n26) ); IN01D4 U26 ( .A(n22), .YN(n24) ); NI01D4 U27 ( .A(n6), .Y(n31) ); NI01D4 U28 ( .A(n23), .Y(n22) ); OR02D2 U29 ( .A1(n11), .A2(n31), .Y(n23) ); NI01D5 U30 ( .A(n39), .Y(q[1]) ); NI01D5 U31 ( .A(n37), .Y(q[3]) ); NI01D5 U32 ( .A(n40), .Y(q[0]) ); IN01D4 U33 ( .A(n31), .YN(q[2]) ); IN01D5 U34 ( .A(rst), .YN(n4) ); NI01D4 U35 ( .A(N15), .Y(cy) ); AN02D2 U36 ( .A1(q[3]), .A2(n24), .Y(N15) ); ND12D3 U37 ( .A2B(n36), .A1(q[0]), .YN(n11) ); endmodule 从以上的门级仿真文件中可以看出,该文件中已经没有了抽象的逻辑关系描述,只是各种cell及相互间的连接关系。这些cell都是标准单元库中存在的,对于简单的设计,已经可以手工画出电路图和版图。

在库文件的开始有以下语句,定义了时间单位。

`celldefine `suppress_faults `enable_portfaults `ifdef functional `timescale 1ns / 1ns `delay_mode_distributed `delay_mode_unit `else `timescale 10ps / 10ps `delay_mode_path `endif `ifdef语句的作用类似C语言中的条件编译,`timescale语句用于定义时间单位。这段话的意思是说,如果在testbench中定义了“functional”,就将时间单位定义为“1ns/1ns”,即时间单位为1ns,分辨率也为1ns。以后出现“#1”就代表1ns,且没有小数,这种情况用于功能验证。如果testbench中没有定义“functional”,则定义时间单位为10ps/10ps,以后出现“#1”就代表10ps,也忽略小数部分。 如果希望计数器工作在1GHz的频率下,则一个时钟周期应为1ns,因此半个时钟周期应改写为#50。

//---------------------------------------------------------------------------- task half_pulse; inout clock; #50 clock = ~ clock; endtask

在d盘建一个名为verilog_gate的目录,将以上3个文件都拷贝到该目录中,按第2章介绍的方法建立一个project,加入以上3个文件,编译后应如图5-1。

图5-1 在Modelsim的主菜单上点Simulate?Simulate,然后在库中寻找testbench,点“ok”,见图5-2。

图5-2

由于某些cell的引脚可能没有用到,屏幕上可能出现一些警告信息,首次仿真时最好检查一下。

图5-3 如果警告信息说某些cell处缺少连接,一般不必考虑。例如,库中的CK01D2单元有2个输出,但当前只使用了一个,故缺少一个连接,这是正常现象。

module CK01D2 (C,CN,CK); output C,CN; input CK; not inst_1(CN,CK); buf inst_2(C,CK); `ifdef functional `else specify // Delays ( CK +=> C ) = (1:1:1,1:1:1); ( CK -=> CN) = (1:1:1,1:1:1); endspecify `endif endmodule 以后的操作步骤与RTL仿真基本相同,但一般不用观察cell的信号,选择Add?Wave in region直接看顶层信号即可。

本文来源:https://www.bwwdw.com/article/c3qr.html

Top