一个使用VCS后仿真的问题,希望大侠可以帮忙,不是太好解决,谢谢:)
时间:10-02
整理:3721RD
点击:
目前在后仿真时遇到一个问题设计所有寄存器的negtive check,暂以DFCNQD1BWP7T寄存器为例,该寄存器model如下:
- `celldefine
- module DFCNQD1BWP7T (D, CP, CDN, Q);
- input D, CP, CDN;
- output Q;
- reg notifier;
- `ifdef NTC
- // Reserve for NTC.
- `ifdef RECREM
- // Reserve for RECREM.
- wireCDN_d ;
- buf(CDN_i, CDN_d);
- `else
- // Reserve for non RECREM.
- buf(CDN_i, CDN);
- `endif
- wire D_d, CP_d ;
- pullup(SDN);
- tsmc_dff (Q_buf, D_d, CP_d, CDN_i, SDN, notifier);
- buf(Q, Q_buf);
- `else
- // Reserve for non NTC.
- buf(CDN_i, CDN);
- pullup(SDN);
- tsmc_dff (Q_buf, D, CP, CDN_i, SDN, notifier);
- buf(Q, Q_buf);
- `endif
- // Timing logics defined for default constraint check
- buf(CP_check, CDN_i);
- buf(D_check, CDN_i);
- `ifdef TETRAMAX
- `else
- tsmc_xbuf (CP_DEFCHK, CP_check, 1'b1);
- tsmc_xbuf (D_DEFCHK, D_check, 1'b1);
- `endif
- `ifdef TETRAMAX
- `else
- specify
- if (CP == 1'b1 && D == 1'b1)
- (negedge CDN => (Q+:1'b0)) = (0, 0);
- if (CP == 1'b1 && D == 1'b0)
- (negedge CDN => (Q+:1'b0)) = (0, 0);
- if (CP == 1'b0 && D == 1'b1)
- (negedge CDN => (Q+:1'b0)) = (0, 0);
- if (CP == 1'b0 && D == 1'b0)
- (negedge CDN => (Q+:1'b0)) = (0, 0);
- ifnone (negedge CDN => (Q+:1'b0)) = (0, 0);
- (posedge CP => (Q+)) = (0, 0);
- $width (negedge CDN, 0, 0, notifier);
- $width (posedge CP &&& CP_DEFCHK, 0, 0, notifier);
- $width (negedge CP &&& CP_DEFCHK, 0, 0, notifier);
- `ifdef NTC
- `ifdef RECREM
- $setuphold (posedge CP &&& D_DEFCHK, posedge D, 0, 0, notifier,,, CP_d, D_d);
- $setuphold (posedge CP &&& D_DEFCHK, negedge D, 0, 0, notifier,,, CP_d, D_d);
- $recrem (posedge CDN, posedge CP, 0,0, notifier, , , CDN_d, CP_d);
- `else
- $setuphold (posedge CP &&& D_DEFCHK, posedge D, 0, 0, notifier,,, CP_d, D_d);
- $setuphold (posedge CP &&& D_DEFCHK, negedge D, 0, 0, notifier,,, CP_d, D_d);
- $recovery (posedge CDN, posedge CP, 0, notifier);
- $hold (posedge CP, posedge CDN, 0, notifier);
- `endif
- `else
- $setuphold (posedge CP &&& D_DEFCHK, posedge D, 0, 0, notifier);
- $setuphold (posedge CP &&& D_DEFCHK, negedge D, 0, 0, notifier);
- $recovery (posedge CDN, posedge CP, 0, notifier);
- $hold (posedge CP, posedge CDN, 0, notifier);
- `endif
- endspecify
- `endif
- endmodule
- `endcelldefine
后仿环境使用VCS 2009.06,当仿真时不加+neg_tchk选项时,反标时报如下错误:
- Warning-[SDFCOM_NNTC] Need timing check option +neg_tchk
- /home/yuanq/pnd_bb_chip/simulation/pnd_bb_chip_wcs.sdf, 109222
- module: DFCNQD2BWP7T, "instance: tb_bb_psim.U_pnd_bb_chip.u_BD2_Channel.IF_L1_reg_1_"
- SDF Error: Negative RECOVERY value replaced by 0.
- Add +neg_tchk to consider Negative delay value.
- Warning-[SDFCOM_NNTC] Need timing check option +neg_tchk
- /home/yuanq/pnd_bb_chip/simulation/pnd_bb_chip_wcs.sdf, 109227
- module: DFCNQD2BWP7T, "instance: tb_bb_psim.U_pnd_bb_chip.u_BD2_Channel.IF_L1_reg_1_"
- SDF Error: Negative HOLD value replaced by 0.
- Add +neg_tchk to consider Negative delay value.
为了检查negtive延迟,增加+neg_tchk,反标仍有错误:
- Warning-[SDFCOM_NL] Negative Limit on Simple TC
- ../../nl/pnd_bb_chip_wcs.sdf, 113120
- module: DFCNQD1BWP7T, "instance: tb_bb_psim_max_inf_t.U_pnd_bb_chip.u_BD2_Channel.i_TIMEBASE_GEN.flag_armed_reg"
- SDF Warning: Negative limit cannot be used in simple timing check, it's
- replaced by 0.
- Please use $recrem ..
根据寄存器model定义了NTC和RECREM以便调用$recrem系统函数,但是定义以上两个宏后仍然报如下错误:
- Warning-[SDFCOM_CFTC] Cannot find timing check
- ../../nl/pnd_bb_chip_wcs.sdf, 113119
- module: DFCNQD1BWP7T, "instance: tb_bb_psim_max.U_pnd_bb_chip.u_BD2_Channel.i_TIMEBASE_GEN.flag_armed_reg"
- SDF Warning: Cannot find timing check $hold(posedge CP,posedge CDN,...)
TSMC的库?同问啊!
这种问题也有同问呀!
问题已经解决,是pt提取sdf的问题,一是注意pt的版本,二是注意是否输出negetive参数。
问一下,哪个版本的PT存在问题?
另外你所说的是否提取Negative参数,是提取还是不提取?
加+neg_tchk选项以后可以注意到"SDF Error"变成"SDF Warning"了。
当然也可以让STA工具写SDF的时候去掉负的timing check, 前提是这些timing没问题,或者你只是在调试阶段。
学习学习
学习学习
我的sdf文件是用dc生成的。
怎么办?
同问。 我的sdf目前也是dc的加上neg_tchk 好多错误都没有了 请问为何。、
今天也遇到sdf反标的问题。库里面是$recovery和$removal,但后仿说没找到$hold...
后来找到原因:sdf2.1版本不支持removal,换sdf3.0就好了。
pt的write_sdf加-version 3.0的选项。