马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 关森陌 于 2020-6-22 18:00 编辑
各位大佬,如题所示。
在综合的阶段做了ICG(Insert Clock Gate),综合后的网表formal比对通过,但是拿去给前端的工程师做
仿真无法通过,不进行ICG的网表能够否仿真通过。
根据前端工程师的反馈,相比于不进行ICG的网表仿真,ICG网表仿真的结果存在错位一个周期的错误。
(我们使用的是INCISIV作为仿真工具)
做ICG网表的仿真必须带timing信息吗?还是说得在仿真器里面做一些特定的处理?
这个问题困扰我们很久了,希望各位大神能够帮帮忙。
#============================================================#
#============================================================#
2020.06.22 14:54补充:
目前已经定位到问题的根源是clk_gate的时序有问题,输出的上升沿错位了一个时钟周期(clk_out)。
工具自动插入的是tcbn40lpbwp的CKLNQD1BWP,它的模型定义如下:
`celldefine
module CKLNQD1BWP (TE, E, CP, Q);
input TE, E, CP;
output Q;
reg notifier;
`ifdef NTC
wire TE_d, E_d, CP_d;
pullup (CDN);
pullup (SDN);
or (D_i, E_d, TE_d);
not (CPB, CP_d);
tsmc_dla (Q_buf, D_i, CPB, CDN, SDN, notifier);
and (Q, Q_buf, CP_d);
`else
pullup (CDN);
pullup (SDN);
or (D_i, E, TE);
not (CPB, CP);
tsmc_dla (Q_buf, D_i, CPB, CDN, SDN, notifier);
and (Q, Q_buf, CP);
`endif
`ifdef TETRAMAX
`else
tsmc_xbuf (nTE_SDFCHK, nTE, 1'b1);
tsmc_xbuf (nE_SDFCHK, nE, 1'b1);
tsmc_xbuf (E_TE_SDFCHK, E_TE, 1'b1);
tsmc_xbuf (E_nTE_SDFCHK, E_nTE, 1'b1);
tsmc_xbuf (nE_TE_SDFCHK, nE_TE, 1'b1);
tsmc_xbuf (nE_nTE_SDFCHK, nE_nTE, 1'b1);
`endif
not (nTE, TE);
not (nE, E);
and (E_TE, E, TE);
and (E_nTE, E, nTE);
and (nE_TE, nE, TE);
and (nE_nTE, nE, nTE);
// Timing logics defined for default constraint check
`ifdef NTC
not (E_int_not, E_d);
not (TE_int_not, TE_d);
`else
not (E_int_not, E);
not (TE_int_not, TE);
`endif
buf (E_check, TE_int_not);
buf (TE_check, E_int_not);
`ifdef TETRAMAX
`else
tsmc_xbuf (E_DEFCHK, E_check, 1'b1);
tsmc_xbuf (TE_DEFCHK, TE_check, 1'b1);
`endif
`ifdef TETRAMAX
`else
specify
if (E == 1'b1 && TE == 1'b1)
(CP => Q) = (0, 0);
if (E == 1'b1 && TE == 1'b0)
(CP => Q) = (0, 0);
if (E == 1'b0 && TE == 1'b1)
(CP => Q) = (0, 0);
if (E == 1'b0 && TE == 1'b0)
(negedge CP => (Q+:1'b0)) = (0, 0);
$width (posedge CP &&& E_TE_SDFCHK, 0, 0, notifier);
$width (negedge CP &&& E_TE_SDFCHK, 0, 0, notifier);
$width (posedge CP &&& E_nTE_SDFCHK, 0, 0, notifier);
$width (negedge CP &&& E_nTE_SDFCHK, 0, 0, notifier);
$width (posedge CP &&& nE_TE_SDFCHK, 0, 0, notifier);
$width (negedge CP &&& nE_TE_SDFCHK, 0, 0, notifier);
$width (negedge CP &&& nE_nTE_SDFCHK, 0, 0, notifier);
`ifdef NTC
$setuphold (posedge CP &&& nTE_SDFCHK, posedge E , 0, 0, notifier,,, CP_d, E_d);
$setuphold (posedge CP &&& nTE_SDFCHK, negedge E , 0, 0, notifier,,, CP_d, E_d);
$setuphold (posedge CP &&& nE_SDFCHK, posedge TE , 0, 0, notifier,,, CP_d, TE_d);
$setuphold (posedge CP &&& nE_SDFCHK, negedge TE , 0, 0, notifier,,, CP_d, TE_d);
`else
$setuphold (posedge CP &&& nTE_SDFCHK, posedge E , 0, 0, notifier);
$setuphold (posedge CP &&& nTE_SDFCHK, negedge E , 0, 0, notifier);
$setuphold (posedge CP &&& nE_SDFCHK, posedge TE , 0, 0, notifier);
$setuphold (posedge CP &&& nE_SDFCHK, negedge TE , 0, 0, notifier);
`endif
endspecify
`endif
endmodule
`endcelldefine
#============================================================#
#============================================================#
2020.06.22 17:58补充:
最后在仿真选项中追加了-seq_udp_delay该命令解决了这一问题。
|