The Designer's Guide Community Forum
https://designers-guide.org/forum/YaBB.pl Design Languages >> Verilog-AMS >> Problem with Analog Sensitivity to Digital Events https://designers-guide.org/forum/YaBB.pl?num=1394098885 Message started by Zorro on Mar 6th, 2014, 1:41am |
Title: Problem with Analog Sensitivity to Digital Events Post by Zorro on Mar 6th, 2014, 1:41am Dear Members, well it's been a long time since my last post and since I was using verilogams. Now I have a to do a simple model but somehow I cannot figure out what is wrong as the code is not working as I expect it to do. Hopefully you can help me out to find the error. The basic concept is 1bit dac i.e. the input is a digital signal (1bit) that must be converted into an analog signal. I want to use "Digital Access on Demand", in more detail "Analog Sensitivity to Digital Events" As a reference I am using the book "The Designer's Guide to VerilogAMS" by Kenneth S. Kundert", section 3.2.2, page 116, "Analog Sensitivity to Digital Events", Listing 11. Here is my code: `include "constants.vams" `include "disciplines.vams" `timescale 1ns/1ps module dac_1bit_model1 ( out_ana, in_dig); inout out_ana; electrical out_ana; inout in_dig; logic in_dig; real value_ana; analog begin @(posedge in_dig) value_ana = 1.2; @(negedge in_dig) value_ana = 0.0; @(initial_step) value_ana = (in_dig ? 1.2 : 0.0); V(out_ana) <+ transition(value_ana, 0.0, 1n, 1n); end endmodule Well, for me the code looks ok. As you can see from pict1 the sensitivity to the events in signal "in_dig" is not working properly because the real variable "value_ana" is corrupt and therefore the transition to V(out_ana) is also corrupt. I was thinking of possible reasons: 1. I need to include following lines inside the analog block in order to increase the accuracy: `include "constants.vams" `include "disciplines.vams" `timescale 1ns/1ps module dac_1bit_model1 ( out_ana, in_dig); inout out_ana; electrical out_ana; inout in_dig; logic in_dig; real value_ana; analog begin @(posedge in_dig) ; @(negedge in_dig) ; @(posedge in_dig) value_ana = 1.2; @(negedge in_dig) value_ana = 0.0; @(initial_step) value_ana = (in_dig ? 1.2 : 0.0); V(out_ana) <+ transition(value_ana, 0.0, 1n, 1n); end endmodule the problem is that I have tried this already and I see no difference in the results. 2. I also tried out this code: `include "constants.vams" `include "disciplines.vams" `timescale 1ns/1ps module dac_1bit_model1 ( out_ana, in_dig); inout out_ana; electrical out_ana; inout in_dig; logic in_dig; real value_ana; analog begin @(posedge in_dig) $discontinuity(0); @(negedge in_dig) $discontinuity(0); @(posedge in_dig) value_ana = 1.2; @(negedge in_dig) value_ana = 0.0; @(initial_step) value_ana = (in_dig ? 1.2 : 0.0); V(out_ana) <+ transition(value_ana, 0.0, 1n, 1n); end endmodule but results are identical. 3. Accuracy Settings, may be I have to change some tool accuracy settings, but I think this is not the problem. So here I have not done any attempt. I am very happy about your suggestions, comments. Regards! Douglas |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Zorro on Mar 6th, 2014, 5:26am Hi All again, I could find a temporary solution. However this is not exactly the approach that I wanted to use and it is still not working fine. I wanted to sense the "digital events" while being inside the "analog process" so that I can call it "Analog Sensitivity to Digital Events" as explained in the book. Unfortunately it is not working properly. May be something is missing and I still need support or suggestions about how to do this. For example in another code I could make "Digital Sensitivity to Analog Events" and it was working fine, like this: always @(cross(V(in_ana)-vddc_high/2, -1)) fork t1 = $realtime; in_ana_is_low_is_low = 1; join always @(in_ana_is_low_is_low) begin #(td) flag1 = 1; end In the temporary solution I am sensing the "digital events" outside the "analog process" and therefore they are being sensed inside the "digital proces". This is working and it is fine. But this is not what I wanted to try and verify. This is my temporary solution (which cannot be called "Analog Sensitivity to Digital Events"). The real variable "value_ana" seems to be ok now but there is a problem when passing it to the "analog domain" and I cannot explain why. `include "constants.vams" `include "disciplines.vams" module dac_1bit_model2 ( out_ana, in_dig); output out_ana; electrical out_ana; input in_dig; logic in_dig; real value_ana; initial begin value_ana = (in_dig ? 1.2 : 0.0); end always @(posedge in_dig) value_ana = 1.2; always @(negedge in_dig) value_ana = 0.0; analog begin V(out_ana) <+ transition(value_ana, 0.0, 1n, 1n); end endmodule Please give me a hint if you have any suggestion to implement correctly "Analog Sensitivity to Digital Events" or to correct the temporary solution. Thank you! Regards! Douglas |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by boe on Mar 6th, 2014, 6:54am Zorro, model2 is correct and working as expected because transition filter should have discrete (and not continuous as in model1) input. - B O E |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Zorro on Mar 6th, 2014, 7:39am Hi BOE, thanks for your feedback. Do you have any hint about how can I transfer/assign the variable "value_ana" to the electrical pin "out_ana" without distortion? This is not working and that is the task of the model, to convert a "digital" clock into an "analog" clock. You say: "model2 is correct and working as expected because transition filter should have discrete (and not continuous as in model1) input." but 1. The transition filter is not working. See pict2 and scroll down. May be you are not seeing signal "out_ana". 2. In Kennet Kundert's book, section 3.1, page 114 towards the bottom I can read: always @(posedge clk) begin ... a=1; end would mean that the real variable is ouned by the digital kernel. Other assignments to "a" would be allowed in the digital context like in other "always" or in "initial" blocks, but assigments to "a" in the analog process would be illegal. However "read-access" to "a" would be allowed in both contexts. That is exactly what I am doing (but it is not working). In the analog process I am only "reading" the variable "value_ana" which I know that is owned by the digital kernel. I understand that this is allowed as I am not assigning a new value to "value_ana" inside the analog process, rather than that I am only "reading" or "using" the value of the variable inside the analog process and "read-access" is allowed in both contexts. Thanks for any suggestion. Regards, Douglas |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by boe on Mar 6th, 2014, 8:29am Hi Zorro, I just tested it. model2 works. Maybe you're using an old/buggy tool version? - B O E |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Zorro on Mar 6th, 2014, 9:10am Hi BOE, could you plot following signals and post a picture please? out_ana electrical signal in_dig digital signal value_ana variable that is owned by the digital kernel the problem that I have is when I do this: analog begin V(out_ana) <+ transition(value_ana, 0.0, 1n, 1n); end in my case the contribution to the "out_ana" signal is not correct as you can see in pict2. Then I will have to check the settings. Regards, Douglas |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Zorro on Mar 6th, 2014, 11:19pm Hi All, I am using cadence 6.1.5 so I do not think that the problem is because the software is outdated. :( |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by boe on Mar 7th, 2014, 12:21am Zorro wrote on Mar 6th, 2014, 9:10am:
Douglas, as you can see, it works fine. I used Cadence ncsim 11.1 as simulator. If you are using an older version, you should consider changing to a newer version. - B O E |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Ken Kundert on Mar 7th, 2014, 3:01pm Zorro, Please disregard BOE's suggestion that you should use your model2. I would not expect that model to work well. However, I would think your model1, though perhaps overly complicated, should work well. I am surprised it is not, and I believe it is something that you should discuss with your simulator company. You may be stumbling over a bug. Having said that, there are ways you can improve your model and perhaps overcome the problem you are having. I would suggest using something like: Code:
Somethings to notice about this implementation:
-Ken |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Zorro on Mar 9th, 2014, 6:53am Hi Ken, thanks for your reply. Unfortunately I will be able to check your suggestion until Tuesday when I am back in office. I was also thinking that this could be a software issue because I could not explain myself what could be wrong in the code. For example in model2 I can see that there is in fact something wrong with the "transition". I will need to use a transition time of tr=tf=1ns because the input clock signal has a period of 4us and having a rising/falling time of 1us would not work fine for this particular case. For model's testing purposes using tr=tf=1ns is ok. When I am sure that I have full control of the behavior I will use tr=tf=0.1us=100ns to reduce simulation time. I will post my results as soon as I have tried your suggestions. Regards! Douglas |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Zorro on Mar 11th, 2014, 12:47pm Hi Ken, I have spent hours trying different approaches and combinations without success. I am sorry to say that your suggested code is also not working. It seems that there must be a bug in the software. I will contact CAD Support tomorrow so that they can have a look. I will use your suggested code to show the error. Attached some pictures and below the codes that I am using. clk_gen `include "constants.vams" `include "disciplines.vams" `timescale 1us/1ps module clk_gen(clk); output clk; reg clk; parameter real period = 4; // clock period (us) parameter real td = 0.0; // delay (us) initial begin clk = 0; #(td) clk = ~clk; forever begin #(period/2) clk = ~clk; end end endmodule dac_1bit_model8 `include "constants.vams" `include "disciplines.vams" `timescale 1us/1ps module dac_1bit_model8 ( out, in); inout out; electrical out; inout in; logic in; real value; analog begin @(posedge in or negedge in) ; V(out) <+ transition(in ? 1.2 : 0.0, 0.0, 1n, 1n); end endmodule Best Regards! Douglas |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Zorro on Mar 11th, 2014, 12:52pm ...and these are the simulation results: fall time is to be ok = 1ns rise time is not ok = 146ns I wonder where this value trise=146ns comes from? As I mentioned I have run several simulations and I have used different models and sometimes trise is wrong, sometimes tfall is wrong and sometimes both values are wrong i.e. arbitrary values can be read. |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Ken Kundert on Mar 13th, 2014, 12:52am Did you ever try setting the transition time to something not so extreme? -Ken |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Zorro on Mar 13th, 2014, 10:18am Hi Ken, BOE, All, well after some sessiones with support we found the root cause. In my settings I was using this: skipcount=2 If I choose the default values i.e. skipcount=0 everything is fine. thanks to everybody for your time and support! Below some details that could be interesting. Douglas "Within the transient simulation the options skipdc=yes and skipcount=2 are activated. The simulation itself is event driven from the digital world. The analogue solver knows exactly when to calculate the analogue signal. This is done and then with skipcount every second point is saved. The Viva loads the results and interpolate the pre event point with the post event point and it seems that the outputs reacts before something happens at the input. If you set skipdc and skipcount to default the results are looking good." scskipcount Specifies a number of points and directs the simulator to save one point every time it calculates that number of points. skipcount The number of points to be calculated for each saved point. |
Title: Re: Problem with Analog Sensitivity to Digital Events Post by Ken Kundert on Mar 13th, 2014, 4:39pm There are a couple of lessons to be taken from this. First, you should not be using skip count. One should only use skip count if the size of the simulation data file is problematic, and when you use it and you get unexpected results, you should always place it high among the list of likely perpetrators. There is a reason why the simulator computes all those time points, and ignoring half of them or more is a dubious practice that should only be used if you are desperate. Second, you should always generate a simple example and give the complete example on this forum if you want people to help you. If you had given the model and the netlist, you would have gotten an answer to your problem right away. Lastly, and this is for Cadence, not you, Spectre should always output the break points regardless of skip count. This is the "bug" I mentioned in my previous message. Perhaps you can pass this suggestion/bug report back to whomever you were talking to at Cadence. -Ken |
The Designer's Guide Community Forum » Powered by YaBB 2.2.2! YaBB © 2000-2008. All Rights Reserved. |