• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC Design
  3. Verilog-A white_noise function returns 0 in transient noise...

Stats

  • Locked Locked
  • Replies 4
  • Subscribers 126
  • Views 11871
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Verilog-A white_noise function returns 0 in transient noise simulation

threepwood06
threepwood06 over 4 years ago

Hi everyone,

How come the white_noise function returns 0 in transient noise simulation?

As a matter of fact, for a reason I ignore, depending on the whether outside probably, sometimes it works, sometimes it doesn't... Rearranging my verilog-A code, changing the variables names, could turn on or off the white_noise function. Any idea?

I use Maestro with AMS Mulithreading.

Thanks a lot in advance.

FYI my ongoing 8-buffers ring VCO verilog-A code, including jitter noise generated by white_noise function:

`include "constants.vams"
`include "disciplines.vams"

module cdr_model_vco_8phases(ckn_out, ckp_out, measperiod_out, test, vctrl, vdd);
output [0:7] ckn_out;
electrical [0:7] ckn_out;
output [0:7] ckp_out;
electrical [0:7] ckp_out;
output measperiod_out;
electrical measperiod_out;
output test;
electrical test;
input vctrl;
electrical vctrl;
input vdd;
electrical vdd;

parameter real pKVDD = 0 ;
parameter real pKVCO = 8e+09 ;
parameter real pFVCO0 = 4e+09 ;

genvar index;
real Ji[0:7];
integer ck_int[0:7];
real freq, del;

real tevent;


analog begin

@( initial_step ) begin
for( index=0; index<=7; index=index+1 ) begin
ck_int[index] = 0;
end

freq = pFVCO0 + pKVCO*V(vctrl) + pKVDD*V(vdd);
if( freq<1e9 ) freq=1e9; // VCO frequency clamp
del = 1.0/(16.0*freq); // unit buffer delay
tevent = $abstime + del;
index = 0;
end

for( index=0; index<=7; index=index+1 ) begin
Ji[index] = white_noise( ( (2p/3)**2 )/2G );
end

@( timer(tevent) ) begin
ck_int[index] = 1-ck_int[index];
freq = pFVCO0 + pKVCO*V(vctrl) + pKVDD*V(vdd);
if( freq<1e9 ) freq=1e9; // VCO frequency clamp
del = 1.0/(16.0*freq) + Ji[index]; // unit buffer delay
tevent = $abstime + del;

if( index==7 ) index=0; else index=index+1;
end

for( index=0; index<=7; index=index+1 ) begin
V(ckp_out[index]) <+ transition( ck_int[index] , 0 , 10f );
V(ckn_out[index]) <+ 1-V(ckp_out[index]);
end

//V(test) <+ Ji[0];

end


endmodule

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago

    I'd suggest for this (and your other question) that you contact customer support. Others here may be able to help of course, but I have no bandwidth this week to experiment and investigate (the day job is keeping me busy!)

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • monglebest
    monglebest over 4 years ago

    It shouldn't work. verilog-A noise is small signal noise, your transient is large signal analysis, I thought my expectation is ZERO always. I only get it work in "noise" analysis. Not fully understood the mechanism

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago in reply to monglebest
    monglebest said:
    It shouldn't work. verilog-A noise is small signal noise, your transient is large signal analysis

    However, the small-signal noise contributions will have an effect during transient noise simulations, in a similar fashion to the noise contributions in primitive devices. They get translated into a time-domain source instead. As I said, I don't have the time this week to investigate the issue so hopefully the original poster contacted support as I suggested.

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • threepwood06
    threepwood06 over 4 years ago

    I've found a workaround. Actually the white_noise must be injected into an ELECTRICAL instead of a real, and then this Electrical injected into a real to be exploitable in the calculations:

    electrical electricalvariable;
    real realvariable;
    real miscvariable;
    analog begin
    V(electricalvariable) <+ white_noise( stuff );
    realvariable= V(electricalvariable);
    miscvariable = misc calculation with realvariable...;
    V(test) <+ V(miscvariable);
    end


    This is a bit cumbersome and I think this is a bug from Cadence. Hope this will be fixed in future realeases.
    Just for information, the VA noise build-in functions do work in transient noise simulations, not only in small-signal analysis, contrary to what the Cadence support has told to me; I've been using VA noise functions for years this way so far.

    Regards.

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information