Re: noise_table question

From: Geoffrey Coram <Geoffrey.Coram@analog.com>
Date: Thu Apr 05 2012 - 08:30:09 PDT

Hi, Ken -
I'm not sure what I'd do with that line:

> V(out) <+ cos(2*`M_PI*phase + flicker_noise(pn,2));

other than the same sort of trick all the compact modelers use
for correlated noise. The LRM shows this example for noise
assigned to a variable:

        n = white_noise(pwr);
        V(a,b) <+ c1*n;
        V(c,d) <+ c2*n;

but some simulators didn't/don't support even that, and that
was in the LRM as far back as 2.0! If the simulator doesn't
support this feature from 10+ years ago, I wouldn't hold my
breath that a new example in the LRM would motivate them.

I think some simulators can handle this:
        real fl;
        fl = flicker_noise(pn,2);
        V(out) <+ cos(2*`M_PI*phase + fl);

And then the usual trick is to create a new node, and do this:
        electrical fl;
        I(fl) <+ V(fl) + flicker_noise(pn,2);
        V(out) <+ cos(2*`M_PI*phase + V(fl));

which I believe all simulators can handle.

-Geoffrey

Ken Kundert wrote:
> Geoffrey,
> It seems like a nice little enhancement. If I remember correctly, very
> little thought went into the details of the noise_table() function. The simplest
> thing possible was done with the assumption that it could be fixed later based
> on use/need.
>
> While we are on the topic, there is a real problem with the small-signal
> stimulus functions, of which noise_table is an example (along with ac_stim,
> white_noise and flicker_noise). The problem is with at least one of the major
> commercial implementations of these functions rather than with the LRM.
> Currently Cadence requires that these functions be contributed directly to
> a signal. So,
> I(out) <+ noise_table(...);
> is okay, but
> I(out) <+ f(noise_table(...));
> is not. This is problematic because it makes it difficult to build models with
> modulated noise sources. For example, the following simple model for a vco that
> exhibits phase noise is not supported in Cadence (at least last time I checked,
> which admittedly was some time ago):
>
> module vco (out, in);
> voltage out, in;
> parameter k = 1;
> parameter f0 = 0;
> parameter real pn=1;
> real phase, freq;
>
> analog begin
> freq = k*V(in) + f0;
> phase = idtmod(freq, 0, 1);
> V(out) <+ cos(2*`M_PI*phase + flicker_noise(pn,2));
> $bound_step(1/(10*freq));
> end
> endmodule
>
> If someone is going to update the LRM to include logarithmic interpolation in
> noise_table, I think at the same time we should add the above model as an
> example in the flicker_noise section of the LRM to make it clear
> 1. how to build a model that exhibits modulated noise, and
> 2. that the intent of the LRM is that there should be no restrictions on the
> placement of the small-signal stimulus functions within an expression.
>
> -Ken
>
> On Wed, Apr 04, 2012 at 03:55:49PM -0400, Geoffrey Coram wrote:
>> Was there ever a proposal of how to request log-log interpolation
>> for noise_table ?
>>
>> Does any simulator support it?
>>
>> The current syntax is:
>> noise_table ( input [ , name ] )
>>
>> where input can be a vector or a string (filename), and name is a string.
>>
>> We could require the noise have a name to request interpolation:
>> noise_table ( input [ , name [, interp ] ] )
>>
>> Or we could let the type of the 2nd argument determine what it is:
>> noise_table ( input [ , name ] )
>> noise_table ( input [ , log_interp ] [, name ] )
>>
>> where log_interp would be 0 or 1 (an integer).
>>
>> -Geoffrey
>>
>>
>>
>> Oskar Leuthold wrote:
>>> Geoffrey,
>>> you might also question the wisdom of linear interpolation here.
>>> Noise generally varies as the log of the frequency, see section 4.5.4.2,
>>> thus interpolation in the log-log domain would be more useful.
>>> Regards
>>> Oskar
>>>
>>> ----------------------------------------------------------------------
>>> Oskar Leuthold, Corporate Applications Engineer
>>> Silicon Engineering Group Synopsys, Inc. 700 E. Middlefield Rd.
>>> Mountain View, CA 94043 650 584 5887
>>> oskar.leuthold@synopsys.com
>>>
>>>> -----Original Message-----
>>>> From: owner-verilog-ams@eda.org
>>>> [mailto:owner-verilog-ams@eda.org] On Behalf Of Geoffrey.Coram
>>>> Sent: Monday, March 20, 2006 9:18 AM
>>>> To: VerilogAMS Reflector
>>>> Subject: noise_table question
>>>>
>>>> Section 4.5.4.3 on noise_table specifies that linear
>>>> interpolation is used (presumably for frequencies inside the
>>>> range of frequencies specified in the vector).
>>>>
>>>> What happens outside the vector?
>>>> 1) value is zero
>>>> 2) if the first pair is (fmin,val1), then for frequencies < fmin,
>>>> the value is val1; similarly if (fmax,valn) is the last pair,
>>>> then the value is valn for frequencies > fmax.
>>>>
>>>> I propose (2).
>>>>
>>>>
>>>> Also, the LRM does not specify what a "vector" is.
>>>>
>>>> -Geoffrey
>>>>
>>
>> --
>> This message has been scanned for viruses and
>> dangerous content by MailScanner, and is
>> believed to be clean.
>>
>

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Thu Apr 5 08:30:44 2012

This archive was generated by hypermail 2.1.8 : Thu Apr 05 2012 - 08:30:56 PDT