BPS with stage split
BPS Frontend Results
- BPS generated 875 assertions out of which 133 (15.2%) were proven and 742 (84.8%) had CEX.
- BPS was given a template to mine only $G(A \rightarrow X(B))$
- The entire process of mining and proving took 46 minutes
- The number of rules mined per file is as follows:
program00.vcd(Directed test): 625program01.vcd(csmith): 241program11.vcd(csmith): 9
- No rules were generated from the other files
program11.vcdhas a size of 5.2 MiB which is different from the othercsmithtraces, which are, on average, 450 MiBprogram00.vcdis the largest at 3.4 GiB
Process
- BPS was set to just focus on 232 frontend signals
- I had to make some changes to the signal names given in
frontend_config_corner_cases.xml- Parameters such as
i_frontend.i_instr_queue.gen_instr_fifo[0].i_fifo_instr_data.FALL_THROUGH,i_frontend.i_instr_queue.gen_instr_fifo[1].i_fifo_instr_data.FALL_THROUGHhad to be removed - There were a lot of signals which should be indexed but were not
- Example:
padded_input[0]was given aspadded_input_0in the.xmlfile - I changed all of them to be the former
- Example:
- Parameters such as
- BPS was given the following
property template<signal A, signal B> globally_always_next_cycler;
(( A |=> B ));
endproperty
-
I believe this is roughly equivalent to the template given to HARM, which was
G(P0 -> X(P1))
-
The entire process took 46 minutes

-
15.2%/84.8% proven:cex ratio with 875 assertions

-
Looking at the time taken, we see a huge difference in the mean and median values. Around 400 rules are proved within a second and the other 400 take up to 30 minutes

-
You can see the rules at bps_frontend_with_template
Comments
- I can try to use the
implicationtactic of BPS. Right now the template is defined on signals not SVA expressions
$G(A \rightarrow X(B))$

- The template essentially does the following algorithm
candidates = set()
rejection = set()
# Loop through all signal
for signal in signals:
# Loop through a signal's trace
for value, timestep in signal:
# if high
if value == 1:
# check for other signals that go high in the next cycle
# Only check the remaining signals
for other_signal in (set_difference(signals, rejection)):
if other_signal[timestep+1] == 1:
candidates.add(other_signal)
else:
# If a signal goes low even once, we don't have to check it again
candidates.remove(other_signal)
rejection.add(other_signal)
-
This means that a constant signal can be matched with all other signals and produce a rule and any other signal that matches should essentially be one that is phase shifted by 1
-
This leads me to believe using
implicationmight be better. I don’t know what it does under the hood but it may be able to generate implications on expressions rather than signals. It saysexprbut it also says scalars. So this might or might not be the same as our template.
