在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
查看: 2208|回复: 4

[求助] cadence PFD行为仿真功能验证

[复制链接]
发表于 2021-1-27 22:14:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
还未入门希望各位大佬指教一下,这是老师提供的cadence自带的代码应该没问题:// Verilog-A model created  Mon Dec 13 2004 15:51:03
// Using VCME version 04.10.2.1 by user volden
// The user accepts full responsibility for the use of this model.
`include "disciplines.h"
module PLL_PFD(DN,UP,FBCLK,REFCLK,PD,VDD,VSS,global_VSS,global_VDD);
output     UP,DN;
input      FBCLK,REFCLK,PD;
input           (* integer inh_conn_prop_name="DVSS";
         integer inh_conn_def_value="cds_globals.\\VSS! "; *) global_VSS;
input           (* integer inh_conn_prop_name="DVDD";
         integer inh_conn_def_value="cds_globals.\\VDD! "; *) global_VDD;
inout      VDD,VSS;
electrical DN,UP,FBCLK,REFCLK,PD,VDD,VSS,global_VSS,global_VDD;
parameter real ttol = 1e-12;
real       dead_region, dead_time,REFCLK_last,FBCLK_last;
real UP_reset,UP_rise,UP_fall,UP_delay,
                        REFCLK_UP_tran_delay,
                   FBCLK_UP_tran_delay;
integer UP_fun;
real PD_thr;
real REFCLK_thr;
real FBCLK_thr;
real DN_reset,DN_rise,DN_fall,DN_delay,
                   REFCLK_DN_tran_delay,
           FBCLK_DN_tran_delay;

integer DN_fun;
real       VSS_value,global_VSS_value,VDD_value,thr;
analog begin
        VSS_value=V(VSS);
        global_VSS_value=V(global_VSS);
        VDD_value=V(VDD);
        thr=VDD_value/2.0;
        I(FBCLK,VSS) <+ ddt($table_model(VDD_value,"PLL_PFD_FBCLK_incap.vat","")*V(FBCLK,VSS));
        I(REFCLK,VSS) <+ ddt($table_model(VDD_value,"PLL_PFD_REFCLK_incap.vat","")*V(REFCLK,VSS));
        I(PD,VSS) <+ ddt($table_model(VDD_value,"PLL_PFD_PD_incap.vat","")*V(PD,VSS));
        @(initial_step) begin
        UP_rise=1e-9;
        UP_fall=1e-9;
        UP_fun=0;
        DN_rise=1e-9;
        DN_fall=1e-9;
        DN_fun=0;
        end

        PD_thr=(VDD_value/2.0);

        REFCLK_thr=(VDD_value/2.0);
        FBCLK_thr=(VDD_value/2.0);

        @(cross(V(PD)-PD_thr,+1)) begin
                UP_delay=1e-9;
                UP_fun=0;
                DN_delay=1e-9;
                DN_fun=0;
                end

        REFCLK_last = last_crossing(V(REFCLK)-REFCLK_thr,+1);
        @(cross(V(REFCLK)-REFCLK_thr,+1,ttol)) if (V(PD)<PD_thr)  begin

                if (($abstime>dead_region) && !UP_fun) begin
                        if (!DN_fun) begin
                                REFCLK_UP_tran_delay=$table_model(VDD_value,"PLL_PFD_REFCLK_tran_UP_delay.vat","");
                                UP_rise=$table_model(VDD_value,"PLL_PFD_REFCLK_tran_UP_slope.vat","")*0.5;
                                UP_delay=max((REFCLK_UP_tran_delay-UP_rise),0);
                                UP_fun=1;

                        end
                        else begin
                                dead_time=$table_model(VDD_value,"PLL_PFD_dead_time.vat","");
                                dead_region=REFCLK_last+2*dead_time;
                                REFCLK_DN_tran_delay=$table_model(VDD_value,"PLL_PFD_REFCLK_tran_DN_delay.vat","");
                                DN_fall=$table_model(VDD_value,"PLL_PFD_REFCLK_tran_DN_slope.vat","")*0.5;
                                DN_reset=max(DN_reset,REFCLK_last+REFCLK_DN_tran_delay-DN_fall);
                        end
                end
        end
        FBCLK_last = last_crossing(V(FBCLK)-FBCLK_thr,+1);

        @(cross(V(FBCLK)-FBCLK_thr,+1,ttol)) if (V(PD)<PD_thr)  begin

                if (($abstime>dead_region) && !DN_fun) begin
                        if (!UP_fun) begin
                                FBCLK_DN_tran_delay=$table_model(VDD_value,"PLL_PFD_FBCLK_tran_DN_delay.vat","");
                                DN_rise=$table_model(VDD_value,"PLL_PFD_FBCLK_tran_DN_slope.vat","")*0.5;
                                DN_delay=max((FBCLK_DN_tran_delay-DN_rise),0);
                                DN_fun=1;
                        end
                        else begin
                                dead_time=$table_model(VDD_value,"PLL_PFD_dead_time.vat","");
                                dead_region=FBCLK_last+2*dead_time;
                                FBCLK_UP_tran_delay=$table_model(VDD_value,"PLL_PFD_FBCLK_tran_UP_delay.vat","");
                                UP_fall=$table_model(VDD_value,"PLL_PFD_FBCLK_tran_UP_slope.vat","")*0.5;
                                UP_reset=max(UP_reset,FBCLK_last+FBCLK_UP_tran_delay-UP_fall);
                        end
                end
        end
        @(timer(UP_reset)) begin
                UP_fun=0;
                UP_delay=0.0;
        end
        @(timer(DN_reset)) begin
                DN_fun=0;
                DN_delay=0.0;
        end
V(UP)<+transition(UP_fun?VDD_value:0,UP_delay,UP_rise*2.0,UP_fall*2.0);
V(DN)<+transition(DN_fun?VDD_value:0,DN_delay,DN_rise*2.0,DN_fall*2.0);
end
endmodule

这是我想验证使用的电路图 image.png



 楼主| 发表于 2021-1-27 22:15:55 | 显示全部楼层
这个信号源之类的应该如何设置呢
回复 支持 反对

使用道具 举报

发表于 2021-1-28 09:24:58 | 显示全部楼层
可以用vpulse啊,两个信号的频率一样,但存在一定的相位差,然后跑tran,看看不同的相位差的情况。
回复 支持 反对

使用道具 举报

发表于 2021-1-28 10:40:21 | 显示全部楼层
thanks similar in spectre needed please share it will help a lot..
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-28 12:37:24 | 显示全部楼层


   
tjuzhjian 发表于 2021-1-28 09:24
可以用vpulse啊,两个信号的频率一样,但存在一定的相位差,然后跑tran,看看不同的相位差的情况。 ...


嗯嗯,感谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-9-14 08:05 , Processed in 0.017795 second(s), 4 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表