门级仿真经验(SDF反标及其工作原理)
门级仿真经验(SDF反标及其工作原理)
Standard Cell的仿真模型:首先我们先看一个stand cell的仿真模型
一般情况下,仿真模型包括两个部分,一个部分是功能部分也就是这个standcell的功能,可以用udp元件或者逻辑功能做表述,第二个部分是时序反标和时序检查部分,这部分主要是提供sdf反标时序,和timingcheck的类型,并且通过系统函数告知仿真者和改变输出值。
`timescale 1ns/1ps
`celldefine
module DFFXL (Q, QN, D, CK);
output Q, QN;
input D, CK;
reg NOTIFIER;
//时序检查系统函数和udp功能真值表之间的联系寄存器
supply1 xSN,xRN;
//下面是这个时序cell的功能描述,由元件,udp,逻辑操作组成。
buf IC (clk, CK);
udp_dff I0 (n0, D, clk, xRN, xSN, NOTIFIER);
and I4 (flag, xRN, xSN);
buf I1 (Q, n0);
not I2 (QN, n0);
//specify….endspecify是对基本门级元件输入输出端口的时延描述,称为延时说明块。延时说明块是module中一个独立结构。
specify
specparam//对一些代表时量的延时参数进行定义
tplh$CK$Q = 1.0,
tphl$CK$Q = 1.0,
tplh$CK$QN = 1.0,
tphl$CK$QN = 1.0,
tsetup$D$CK = 1.0,
thold$D$CK = 0.5,
tminpwl$CK = 1.0,
tminpwh$CK = 1.0,
tperiod$CK = 1.0;
//对模块输入输出端口之间的路径延时进行说明
if (flag)
(posedge CK *> (Q +: D)) = (tplh$CK$Q, tphl$CK$Q);
//前半部分时指定路径,后半部分是指定路径延时,若存在多条路径到达一个口在仿真中会选取延时最大的一条路径
if (flag)
(posedge CK *> (QN -: D)) = (tplh$CK$QN, tphl$CK$QN);
//借助时序检验系统任务对模块输入输出时序进行时序检验,一旦发现时序违规,仿真程序就会对违规触发标志位NOTIFIER //反转一次(如果是第一次违规报警,NOTIFIER其被之为1),这会通知udp使输出为X
$setuphold(posedge CK &&& (flag == 1), posedge D, tsetup$D$CK, thold$D$CK, NOTIFIER);
$setuphold(posedge CK &&& (flag == 1), negedge D, tsetup$D$CK, thold$D$CK, NOTIFIER);
$width(negedge CK &&& (flag == 1), tminpwl$CK, 0, NOTIFIER);
$width(posedge CK &&& (flag == 1), tminpwh$CK, 0, NOTIFIER);
$period(posedge CK &&& (flag == 1), tperiod$CK, NOTIFIER);
endspecify
endmodule // DFFXL
`endcelldefine
下面我们接着看一个udp是如何构成的,输入产生输出的,如何和时序检验系统函数进行联系的,其中udp(User Defined Primitives)元件的定义是通过真值表的形式来进行的,可以用真值表来描述组合逻辑UDP和时序逻辑的UDP的逻辑功能。该模块主要由primitive … endprimitive界定。如下:
primitive udp_dff (out, in, clk, clr_, set_, NOTIFIER);
output out;
input in, clk, clr_, set_, NOTIFIER;
//NOTIFIER来自时序检验系统函数,注意UDP定义的端口只能是一位宽度的标量类型
reg out;
//真值表的格式:
table
// in clk clr_ set_ NOT : Qt : Qt+1
//
0 r ? 1 ? : ? : 0 ;
// clock in 0
1 r 1 ? ? : ? : 1 ;
// clock in 1
1 * 1 ? ? : 1 : 1 ;
// reduce pessimism
0 * ? 1 ? : 0 : 0 ;
// reduce pessimism
? f ? ? ? : ? : - ;
// no changes on negedge clk
* b ? ? ? : ? : - ;
// no changes when in switches
? ? ? 0 ? : ? : 1 ;
// set output
? b 1 * ? : 1 : 1 ;
// cover all transistions on set_
1 x 1 * ? : 1 : 1 ;
// cover all transistions on set_
? ? 0 1 ? : ? : 0 ;
// reset output
? b * 1 ? : 0 : 0 ;
// cover all transistions on clr_
0 x * 1 ? : 0 : 0 ;
// cover all transistions on clr_
? ? ? ? * : ? : x ;
// any notifier changed
//注意-表示输出状态保持不变,?表示输入任意状态,b表示输入端任意状态(不包括X),*表示输入端的任意变化
//从最后一行我们可以看出一旦NOTIFIER发生了任意变化输出端将会输出X!!
endtable
endprimitive // udp_dff
推荐阅读
- 我在管理实验班中的一些经验教训
- 屁股决定脑袋!当了领导后才明白的8件事,每一个都是经验和教训
- 法国找实习经验分享——02动机信
- 写作的实操方法(入门级)
- (2019.3.9)1853:宁宁给小鱼传授读经的经验
- 吴正宪老师让学生爱上数学的四点经验
- 【小艾眼中的世界】耀东老师律动禅拍实录【20】——从禅拍经验沙因老师的教导【对话孩子、相信自己、自我对话】
- 经验风险、期望风险、结构风险
- 夜市摆摊卖点什么最好卖,老鸟经验之谈
- 2018-11-28在创业公司做运营,我总结了这些经验