门级仿真经验(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
  • 4
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在VCS中,可以使用SDFStandard Delay Format)文件来指定电路中的时序信息,以便进行时序仿真反标sdfannotate)则是VCS中的一个命令,用于将SDF文件中的时序信息应用到仿真中。具体来说,可以通过以下步骤实现VCS SDF反标: 1. 首先,在VCS的工作目录中创建一个SDF文件,例如“ring_oscillator.sdf” 。 2. 在代码中使用$sdf_annotate命令来调用SDF文件。例如,可以在initial begin块中使用以下代码来调用SDF文件中的时序信息:$sdf_annotate("ring_oscillator.sdf", ring_oscillator); 。 3. 然后,使用VCS编译和运行仿真,以使SDF文件中的时序信息生效。 4. 在仿真过程中,VCS将根据SDF文件中的时序信息来模拟电路的时序行为,以确保仿真结果准确。 通过使用SDF文件和$sdf_annotate命令,可以在VCS中进行准确的时序仿真,以验证电路的时序行为。这能够帮助设计人员检查和优化电路的时序特性,确保电路在实际应用中能够正常工作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [VCS门级仿真系列文章之sdf文件和$sdf_annotate反标](https://blog.csdn.net/m0_49540263/article/details/114881858)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值