Coverage Analysis in Verilog - 0&&0? - code-coverage

I'm running some tests for a chip via Verilog, and I've run into a little bit of a problem where I am scratching my head a little. I'm testing coverage on the code to make sure all states happen over randomized testing of all parameters, etc.
In evaluating two values of the following type:
case(state_vector)
STATE1:
...
STATE2:
if(!var1 && var2)
state_vector = STATE1;
else
state_vector = STATE2;
STATE3:
...
Now the problem is that in doing coverage analysis the statement after the else statement is never reached, meaning that the if-statement always evaluates to true.
I originally assumed that the values of var1 and var2 were 0 and 1, respectively. Upon double checking before finishing my report I noticed that this assumption was incorrect, as a waveform analysis shows that var1 is always 1 and var2 is always 0 throughout the entire simulation.
Now I will test to make sure the values change the way I want them, but I'm curious as to how in Verilog this may happen. Essentially I am slipping into a state because the if-statement evaluates to true for infinitesimal unit of time.
Any ideas on how to better evaluate this problem? I'd like to check that another function isn't changing my state_vector at the same time I'm trying to check my current state.

Quick and dirty way is to sprinkle $display("%t %m got here",$time); around the code in question and make sure there are labels for the begin-end blocks eg:
begin : meaningful_label
$display("%t %m got here",$time);
... code ...
$display("%t %m got here too",$time);
end
If the display statement(s) are called, then state_vector is being assigned somewhere else. Otherwise the something something is preventing the code from exciting.
To further debug:
Not display message:
add more display messages to higher levels.
Displaying messages:
Some waveform viewers have active drivers tracing. If your viewer does not have this feature, then add messages around all other assigning statements and watch for time-stamp when the condition should be true.

Related

Storing crossover values for multi-crossover condition check Pine script

I'm developing a strategy that triggers signal after recording 4 crossovers of different lines.
The final variable I will use to trigger signals will be:
longSignal = ChikouAboveAll and priceAboveCloud and greenCloudSignal and tenkan_X_KijunLong
shortSignal = ChikouBelowAll and priceBelowCloud and redCloudSignal and tenkan_X_KijunShort
The problem is that those variables within carry the vale "true" when crossover function is true for each. Since the crosover boolean value is calculated separately for each bar the "longSignal" and "shortSignal" are true only when all crossover will happen on the same bar, which is quite rare.
How can I store the value for future bars for each crossover until it is being changed?
Thanks for all suggestions!
You could try doing a work around I use sometimes by redefining the cross to greater than. E.g. ChikouAboveAll = Chikou > All
Notice that instead of using a ta.crossover you use >
Also, have you found another way around this already? Actually came here because this work around does not work for me anymore.

Why is the second instrution evaluated before the first one?

I was doing some calculations to use as the testcases for a question I'm going to post on PCCG Stack Exchange, and I noticed that in a piece of code like this:
for i = 0, 20 do
io.write(i..": ")
diff(i)
end
(where diff is a function which does some pretty heavy calculation and prints the result), the result of diff is first calculated and, only then, i: and the result of diff are printed.
But why is this happening? Shouldn't I see i: before and during the calculation, and the result of the calculation only after? Why is it waiting for diff to execute before?
I first noticed this using Luajit, but it also happens on vanilla Lua and even outside of a for loop.
Just as with many other output functions in many other languages, io.write output is buffered. It is evaluated, it is just your output is now in intermediate buffer pending flushing or filling of this buffer. Add an io.flush() call if you need your data to go through right now.

Describing a 'waiting' step on gherkin language

I'm trying to describe a scenario of my app on gherkin language so that I can use it as executable spec. The scenario is more less the following: There's a phase of a process in which a check is performed. If all conditions for the check are fulfilled then the process end. Otherwise, the process waits for any condition to change (it's notified about this) and the checks again, finishing if succesful. What I'm having trouble describin is this waiting part. My current version (simplified) is:
Given condition A
And not condition B
When the check is performed
Then the result is negative, pending condition B
What I'm trying to express with pending condition B is that the test will be repeated once condition B changes, but I don't particularly like this version, since it's hard to turn one to one to a test (the fact that condition B changes would be a new When).
Can anybody with more experience come up with a better formulation?
You can either link the two tests together, like this:
Scenario: When A and not B result is negative, but if B happens then result is positive
Given condition A
But not condition B
Then the check returns negative
But if condition B
Then the check returns positive
Which might not be best practice but is sometimes the pragmatic way of doing things, especially if the tests are slow running because of the system under test or your test environment etc.
Or you could make it into two scenarios with some repetition behind the scenes.
Scenario: When A and not B the result is negative
Given condition A
But not condition B
Then the check returns negative
Scenario: When A and B the result should be positive
Given the system has condition A but not B
And the check is returning negative
When condition B
Then the check returns positive
In your case I would say that which one to choose depends on how long your tests take to run. If they are slow then go for one big scenario. If they aren't, or it doesn't matter for some reason then go for the second suggestion. The second suggestion will give more information about the cause of the failure which is nice to have, but if the tests are slow then I think it would still be quite obvious why the the test was failing even if you are using one big scenario.

understanding code coverage results

I have a strange coverage result in visual studio:
it appears as the if statement was not covered but since we did enter the block it must have been. Why are those results wrong? (those result cover many runs under many conditions)
screenshot
I suspect what you are seeing is branch coverage due to not testing all combinations that can result in going down each path. Logical AND (&&) allows early escape i.e. it only evaluates the second operator if the first is true.
e.g.
if (bool.TryParse(savePrep, out save) && save)
has 3 possibilities
savePrep = "true"
savePrep = "false"
savePrep = "neither-true-nor-false"
you have probably only exercised #1 and #2

Why does this code causes the machine to crash?

I am trying to run this code but it keeps crashing:
log10(x):=log(x)/log(10);
char(x):=floor(log10(x))+1;
mantissa(x):=x/10**char(x);
chop(x,d):=(10**char(x))*(floor(mantissa(x)*(10**d))/(10**d));
rnd(x,d):=chop(x+5*10**(char(x)-d-1),d);
d:5;
a:10;
Ibwd:[[30,rnd(integrate((x**60)/(1+10*x^2),x,0,1),d)]];
for n from 30 thru 1 step -1 do Ibwd:append([[n-1,rnd(1/(2*n-1)-a*last(first(Ibwd)),d)]],Ibwd);
Maxima crashes when it evaluates the last line. Any ideas why it may happen?
Thank you so much.
The problem is that the difference becomes negative and your rounding function dies horribly with a negative argument. To find this out, I changed your loop to:
for n from 30 thru 1 step -1 do
block([],
print (1/(2*n-1)-a*last(first(Ibwd))),
print (a*last(first(Ibwd))),
Ibwd: append([[n-1,rnd(1/(2*n-1)-a*last(first(Ibwd)),d)]],Ibwd),
print (Ibwd));
The last difference printed before everything fails miserably is -316539/6125000. So now try
rnd(-1,3)
and see the same problem. This all stems from the fact that you're taking the log of a negative number, which Maxima interprets as a complex number by analytic continuation. Maxima doesn't evaluate this until it absolutely has to and, somewhere in the evaluation code, something's dying horribly.
I don't know the "fix" for your specific example, since I'm not exactly sure what you're trying to do, but hopefully this gives you enough info to find it yourself.
If you want to deconstruct a floating point number, let's first make sure that it is a bigfloat.
say z: 34.1
You can access the parts of a bigfloat by using lisp, and you can also access the mantissa length in bits by ?fpprec.
Thus ?second(z)*2^(?third(z)-?fpprec) gives you :
4799148352916685/140737488355328
and bfloat(%) gives you :
3.41b1.
If you want the mantissa of z as an integer, look at ?second(z)
Now I am not sure what it is that you are trying to accomplish in base 10, but Maxima
does not do internal arithmetic in base 10.
If you want more bits or fewer, you can set fpprec,
which is linked to ?fpprec. fpprec is the "approximate base 10" precision.
Thus fpprec is initially 16
?fpprec is correspondingly 56.
You can easily change them both, e.g. fpprec:100
corresponds to ?fpprec of 335.
If you are diddling around with float representations, you might benefit from knowing
that you can look at any of the lisp by typing, for example,
?print(z)
which prints the internal form using the Lisp print function.
You can also trace any function, your own or system function, by trace.
For example you could consider doing this:
trace(append,rnd,integrate);
If you want to use machine floats, I suggest you use, for the last line,
for n from 30 thru 1 step -1 do :
Ibwd:append([[n-1,rnd(1/(2.0*n- 1.0)-a*last(first(Ibwd)),d)]],Ibwd);
Note the decimal points. But even that is not quite enough, because integration
inserts exact structures like atan(10). Trying to round these things, or compute log
of them is probably not what you want to do. I suspect that Maxima is unhappy because log is given some messy expression that turns out to be negative, even though it initially thought otherwise. It hands the number to the lisp log program which is perfectly happy to return an appropriate common-lisp complex number object. Unfortunately, most of Maxima was written BEFORE LISP HAD COMPLEX NUMBERS.
Thus the result (log -0.5)= #C(-0.6931472 3.1415927) is entirely unexpected to the rest of Maxima. Maxima has its own form for complex numbers, e.g. 3+4*%i.
In particular, the Maxima display program predates the common lisp complex number format and does not know what to do with it.
The error (stack overflow !!!) is from the display program trying to display a common lisp complex number.
How to fix all this? Well, you could try changing your program so it computes what you really want, in which case it probably won't trigger this error. Maxima's display program should be fixed, too. Also, I suspect there is something unfortunate in simplification of logs of numbers that are negative but not obviously so.
This is probably waaay too much information for the original poster, but maybe the paragraph above will help out and also possibly improve Maxima in one or more places.
It appears that your program triggers an error in Maxima's simplification (algebraic identities) code. We are investigating and I hope we have a bug fix soon.
In the meantime, here is an idea. Looks like the bug is triggered by rnd(x, d) when x < 0. I guess rnd is supposed to round x to d digits. To handle x < 0, try this:
rnd(x, d) := if x < 0 then -rnd1(-x, d) else rnd1(x, d);
rnd1(x, d) := (... put the present definition of rnd here ...);
When I do that, the loop runs to completion and Ibwd is a list of values, but I don't know what values to expect.

Resources