I have a SystemVerilog module containing concurrent assertions for formal property verification that is bound to a VHDL design under verification.
I wanted to use some Verilog code in this module to support my assertions. I tried 2 different versions of always blocks. The one using $rose allows the cover property to be coverable. The one using posedge makes the cover property uncoverable.
There are no assumptions, no other assertions or cover properties. testSignal is connected to a input of the VHDL block. etCount is a dummy int variable.
In reply to katce:
A few comments and observations:
[list=1]
[*] On cover property (##[0:$]rose(testSignal));* You do not need the ##[0:]
[] There is a big difference between always @($rose(testSignal)) and always @(posedge testSignal) and always @(posedge clk) if($rose…
The correct way to code the supporting code is:
// Correct way
always @(posedge clk) begin
if ($rose(testSignal)) begin
-> e_clk;
#2 etCount_clk <= etCount_clk+1'b1;
end
end
Can you please explain me why e_rose is generated two times each time the testSignal rose? When the clocking event is specified to @(posedge clk), I would have expected that it only happens at the positive clock edge, not at the positive edge of testSignal.
I put this code into a module for formal verification. I was actually surprised that I can use $rose outside a property, because I thought the always blocks would be synthesized. I am not sure how $rose is behaving in synthesized code.
And then I am wondering how using the signal in an always block can have an influence on the coverability of the cover property. Do you know that?
Because @(expr) means suspend the process until the expression changes. So the event e_rose gets generated when $rose goes from 0 to 1 and 1 to 0. You would really need
@(posedge $rose(testSignal, @(posedge clk)))
You can use $rose, $fell, etc. outside a property. See 16.9.3 Sampled value functions in the 1800-2017 LRM. But using $rose inside a procedural event control statement makes for a very unclear clocking context.
On always @($rose(testSignal, @(posedge clk)))
I see it triggering when testsignal rises 2ns after the posedge clk.
But the $rose should be tested @posedge clk.
Question: why then is the always @($rose(testSignal, @(posedge clk)))triggering?
At that time (2ns after the posedge of clk) there is no $rose tested in the clk edge that occurred 2ns before the testsignal changes.
Looks like the $rose is ignoring the specified clk edge.
Agree, this is a very unusual way of using the $rose.
Ben