The Designer's Guide Community Forum
https://designers-guide.org/forum/YaBB.pl Design Languages >> Verilog-AMS >> zi_zp() is inaccurate in Cadence Spectre https://designers-guide.org/forum/YaBB.pl?num=1557999612 Message started by cheap_salary on May 16th, 2019, 2:40am |
Title: zi_zp() is inaccurate in Cadence Spectre Post by cheap_salary on May 16th, 2019, 2:40am We can evaluate frequency characteristics of z-domain transfer function, H(z) by using Verilog-A in Cadence Spectre. Assume H(z) = (1-z^-1)^3 = 1 -3*z^-1 +3*z^-2 -1*z^-3 Here we have three options as expression in Verilog-A. (1) zi_nd(V(Input), {1, -3, 3, -1}, {1}, Tsample); (2) zi_zp(V(Input), {1,0, 1,0, 1,0}, {0,0}, Tsample); (3) zi_zd(V(Input), {1,0, 1,0, 1,0}, {1}, Tsample); However, only (1) can give accurate result. See attached figure. out1 is a result of Spectre primitive, zvcvs. out2 is a result of (2). Why can not (2) and (3) give accurate result ? This is true for H(z) = (1-z^-1)^1 = 1 -1*z^-1 (1) zi_nd(V(Input), {1, -1}, {1}, Tsample); (2) zi_zp(V(Input), {1,0}, {0,0}, Tsample); (3) zi_zd(V(Input), {1,0}, {1}, Tsample); My Cadence Spectre is Version 17.1.0.307.isr6 64bit -- 4 Jul 2018 "test_my_zi_nd.scs" Code:
"my_zi_nd.va" Code:
|
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by Geoffrey_Coram on May 16th, 2019, 7:47am This doesn't answer your question, but what about zi_np? (4) zi_np(V(Input), {1, -3, 3, -1}, {0,0}, Tsample); |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by Ken Kundert on May 16th, 2019, 4:50pm Have you looked at the time domain waveforms? |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by cheap_salary on May 17th, 2019, 6:08am Synopsys HSPICE can give accurate results for any expression. //H(z) = (1-z^-1)^3 = 1 -3*z^-1 +3*z^-2 -1*z^-3 (1) zi_nd(V(Input), {1, -3, 3, -1}, {1}, Tsample); (2) zi_zp(V(Input), {1,0, 1,0, 1,0}, {0,0}, Tsample); (3) zi_zd(V(Input), {1,0, 1,0, 1,0}, {1}, Tsample); (4) zi_np(V(Input), {1, -3, 3, -1}, {0,0}, Tsample); Cadence Spectre can not give accurate results for (2) and (3). But this is a limited case, FIR form. (1) and (4) are also suspicious in Cadence Spectre. All of (1)-(4) can not give correct result for more general transfer function which has both zeros and poles in Cadence Spectre. We can not trust frequency characteristics of zi_xx() of Verilog-A in Cadence Spectre at all. "my_zi_xx.va" Code:
"test_my_zi_xx.spi" Code:
"test_my_zi_xx.scs" Code:
|
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by cheap_salary on May 17th, 2019, 6:10am Spectre Result. |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by Geoffrey_Coram on May 21st, 2019, 5:09am Have you tried these using the native dependent source? Something like z1 (3 0 1 0) zvcvs numer=[1 -3 3 -1] denom=[1] Is there a problem with the z-transform implementation, or only with the translation of the Verilog-A to native? Years ago, I was looking into the Laplace transform implementations, and I seem to recall it was easy to convert ZP to ND, but not vice-versa. Or was it that, if you have complex poles, it's hard to verify that you have the conjugate pairs in floating-point math? |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by cheap_salary on May 21st, 2019, 5:19am Geoffrey_Coram wrote on May 21st, 2019, 5:09am:
Geoffrey_Coram wrote on May 21st, 2019, 5:09am:
See https://designers-guide.org/forum/YaBB.pl?num=1557999612/0#0 |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by Geoffrey_Coram on May 21st, 2019, 5:27am Sorry, I just re-read the original post: Quote:
But out1 was the zvcvs using numer and denom; what about using zvcvs with zeros and poles? |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by Ken Kundert on May 21st, 2019, 6:57pm Have you looked at the time domain waveforms? |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by cheap_salary on May 22nd, 2019, 4:08am Geoffrey_Coram wrote on May 21st, 2019, 5:27am:
So we can trust Spectre Primitive, zvcvs. However a frequency characteristics of zi_xx() is very suspicious in Verilog-A of Cadence Spectre. https://designers-guide.org/forum/YaBB.pl?num=1298380482 H(z) = (1 -1*z^-1) / (1 +1*z^-1 +0.5*z^-2) zeros = {0, 1} poles = {-0.5+j*0.5, -0.5-j*0.5} "test_zvcvs.scs" Code:
|
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by cheap_salary on May 22nd, 2019, 4:20am Ken Kundert wrote on May 21st, 2019, 6:57pm:
https://designers-guide.org/forum/YaBB.pl?num=1361756819/3#3 zi_xx() has value only for AC-Analysis, since we have no option for periodic frequency characteristics except for zi_xx(). |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by Ken Kundert on May 22nd, 2019, 6:23pm Before you decide that the simulator is broken, you should actually verify that you are using the function properly. You are not seeing the nulls at multiples of the clock frequency, that suggests there is some feedthrough. Where is it coming from? Looking at the results in the time domain might given you some understanding of what is going wrong. Working in the frequency domain is convenient, but it can hide many issues. When things go wrong, it is generally a good idea to take a look at the time domain results. -Ken |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by Ken Kundert on May 22nd, 2019, 6:28pm I don't understand your comment about zi_xx() not being useful in the time domain, and your reference does not seem to mention to zi_xx() filters at all. Why would you use them in the frequency domain if their results are useless in the time domain? -Ken |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by Geoffrey_Coram on May 24th, 2019, 11:02am Are these the corresponding zvcvs elements? I5 (out5 0 in 0) zvcvs ts=1/fsample numer=[1 -3 3 -1] denom=[1] I6 (out6 0 in 0) zvcvs ts=1/fsample zeros=[1 0 1 0 1 0] poles=[0 0] I7 (out7 0 in 0) zvcvs ts=1/fsample zeros=[1 0 1 0 1 0] denom=[1] I8 (out8 0 in 0) zvcvs ts=1/fsample numer=[1 -3 3 -1] poles=[0 0] I must be doing something wrong, because the simulator fails to converge when I6 is in, and the ac waveforms for I7 and I8 are flat 1.0 (0dB). |
Title: Re: zi_zp() is inaccurate in Cadence Spectre Post by Geoffrey_Coram on May 24th, 2019, 11:03am I tried a time-domain simulation with a sine source, and the waveforms all looked the same. (When I compared those waveforms to the zvcvs I5, the latter had sharper transitions.) |
The Designer's Guide Community Forum » Powered by YaBB 2.2.2! YaBB © 2000-2008. All Rights Reserved. |