Aigneryu
|
To contnue my other thread, I quicky wrote a frequency/period measurement module without hidden states. However, it does not work for all cases. Sometimes it cause convergence problem in PSS. Can anybody check if there is any potential problem?
----Start from here-----------------------------------------------------
module period_meas (vp, vn, period, freq); input vp, vn; electrical vp, vn;
output period; electrical period; output freq; electrical freq;
parameter real vth=0; // threshold (V) parameter integer dir =1; parameter real ttol=1f; // in sec parameter real outStart = 100n; // in sec parameter integer period_save_flag =1;
parameter real freq_ini = 1G; // estimated frequency parameter real unit_period = 1n; parameter real unit_freq = 1G;
real cross_cur, cross_cur_d, cross_prev; real period_inst, period_inst_d; integer fp_periods;
integer actNow_p1, actNow_p2, actNow_p3;
analog begin
@(initial_step) begin actNow_p1=0; actNow_p2=0; actNow_p3=0; cross_prev=0; cross_cur=0; cross_cur_d=0; period_inst=1/freq_ini; period_inst_d=1/freq_ini; if(period_save_flag==1) fp_periods=$fopen("periods.m"); end
actNow_p1 = 0; actNow_p2 = 0; actNow_p3 = 0;
cross_cur=last_crossing(V(vp,vn)-vth, dir);
@(cross(V(vp,vn)-vth, dir, ttol)) actNow_p1 = 1;
@(cross(V(vp,vn)-vth, -dir, ttol)) actNow_p2 = 1;
@(cross(V(vp,vn)-(vth+0.1), dir, ttol)) actNow_p3 = 1;
period_inst = idt(0, cross_cur_d-cross_prev, actNow_p3); period_inst_d = ((period_inst>0)? period_inst:1/freq_ini); cross_cur_d = idt(0, cross_cur, actNow_p1); cross_prev = idt(0, cross_cur_d, actNow_p2);
//preiod strobe @(cross(V(vp,vn)-vth, dir, ttol)) begin if(($abstime >= outStart)&&(period_save_flag==1)) $fstrobe(fp_periods, period_inst); end
V(period) <+ period_inst_d/unit_period; V(freq) <+ 1.0 / period_inst_d / unit_freq;
end endmodule
|