SystemVerilog Assertions Without Using dist
SystemVerilog Assertions (SVA) are a powerful mechanism for verifying the functional correctness of designs. While the dist
operator (for calculating the distance between events) is frequently used, many powerful assertions can be written without it. This article explores techniques for creating effective SVA without relying on dist
. We'll address common scenarios and demonstrate how to achieve the same functionality using alternative approaches.
What Does dist
Do?
Before diving into alternatives, let's briefly review what the dist
operator accomplishes. dist(e1, e2)
calculates the number of clock cycles between two events, e1
and e2
. It's often used in assertions to specify timing constraints or check for sequences within a given timeframe. However, omitting dist
doesn't limit the expressiveness of your assertions; it simply necessitates a different approach to specifying timing.
Alternative Approaches to Timing Constraints Without dist
Several methods can replace the functionality of dist
without directly using the operator:
-
always
blocks and counters: For simple timing constraints, analways
block can track the time elapsed since a specific event. A counter can be incremented on each clock cycle, and a comparison can be made to check if a subsequent event occurs within a specified timeframe. This approach is suitable for relatively simple scenarios. -
Sequence operators: SystemVerilog's rich sequence operators provide powerful tools for defining complex event patterns and checking for their occurrence. While sequences themselves don't explicitly handle timing, you can combine them with other constructs to implicitly enforce timing constraints. For example, using
##
to specify a fixed delay between events in a sequence creates a time-dependent assertion. -
Property based assertions: By strategically combining sequences and properties, you can define more complex timing-related checks. Properties allow you to express complex temporal relationships between events. You can specify constraints on how frequently or how soon after certain events other events must occur.
Example: Checking for an Event Within a Time Window
Let's consider a scenario where we want to assert that event event_b
occurs within 5 clock cycles after event_a
. Using dist
, this would be simple:
assert property (@(posedge clk) disable iff (reset) dist(event_a, event_b) <= 5);
Without dist
, we could achieve this using an always
block and a counter:
always @(posedge clk) begin
if (reset) begin
counter <= 0;
flag <= 0;
end else begin
if (event_a) begin
counter <= 0;
flag <= 1;
end else if (flag && counter < 5) begin
counter <= counter + 1;
end else if (flag && event_b) begin
counter <= 0;
flag <= 0;
end else if (flag && counter == 5 && !event_b) begin
$error("event_b did not occur within 5 cycles of event_a");
flag <= 0;
end
end
end
This always
block tracks the time elapsed since event_a
and reports an error if event_b
doesn't occur within 5 cycles. This demonstrates a basic alternative; more complex scenarios may require more sophisticated techniques.
Example Using Sequences
Another example showcasing the power of sequences without dist
. Let's say we need to verify a sequence of events (A, B, C) must happen within 10 clock cycles.
sequence seq_abc;
a ##10 b ##10 c;
endsequence
property prop_abc;
seq_abc;
endproperty
assert property (@(posedge clk) disable iff (reset) prop_abc);
This example utilizes the ##
operator within the sequence to specify the maximum delay between events. Although not directly using dist
, it achieves the same effect of checking timing between events.
Conclusion
While the dist
operator provides a concise way to express timing constraints in SystemVerilog Assertions, it's not essential. By utilizing always
blocks, counters, sequence operators, and properties strategically, you can create effective and comprehensive SVA without relying on dist
, enabling versatile verification for your designs. The choice of method depends on the complexity of the timing constraint and the overall assertion structure. Remember to choose the method that best suits your specific needs and enhances readability and maintainability of your verification code.