Skip properties for expression coverage (#6830)

This commit is contained in:
Todd Strader 2025-12-17 13:51:40 -05:00 committed by GitHub
parent bd38775ad2
commit d10e841b56
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 136 additions and 1 deletions

View File

@ -359,7 +359,8 @@ class CoverageVisitor final : public VNVisitor {
VL_RESTORER(m_state);
VL_RESTORER(m_exprStmtsp);
VL_RESTORER(m_inToggleOff);
m_exprStmtsp = nodep;
// skip properties for expresison coverage
if (!VN_IS(nodep, Property)) m_exprStmtsp = nodep;
m_inToggleOff = true;
createHandle(nodep);
iterateChildren(nodep);

View File

@ -0,0 +1,18 @@
#!/usr/bin/env python3
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2024 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
import vltest_bootstrap
test.scenarios('simulator')
test.compile(verilator_flags2=['--assert --cc --coverage'])
test.execute()
test.passes()

View File

@ -0,0 +1,116 @@
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed into the Public Domain, for any use,
// without warranty, 2025 by Wilson Snyder
// SPDX-License-Identifier: CC0-1.0
module t (/*AUTOARG*/
// Inputs
clk
);
input clk;
integer cyc; initial cyc=1;
Test test (
/*AUTOINST*/
// Inputs
.clk(clk),
.cyc(cyc)
);
always @ (posedge clk) begin
if (cyc!=0) begin
cyc <= cyc + 1;
`ifdef TEST_VERBOSE
$display("cyc=%0d", cyc);
`endif
if (cyc==10) begin
$write("*-* All Finished *-*\n");
$finish;
end
end
end
endmodule
// Interface for data validation with coverage
interface data_valid_if (input logic clk);
logic enable_invalid_data_checks;
logic valid;
logic [7:0] data;
property dataIsKnownWhenValid;
@(posedge clk) enable_invalid_data_checks & valid |-> !$isunknown(data);
endproperty
assert_dataIsKnownWhenValid: assert property (dataIsKnownWhenValid)
else $error("Data contains unknown values when valid is asserted");
endinterface
module Test
(
input clk,
input integer cyc
);
logic rst_n;
// Instantiate the interface
data_valid_if dv_if(clk);
// Reset logic
initial begin
rst_n = 0;
dv_if.enable_invalid_data_checks = 0;
end
always @(posedge clk) begin
if (cyc == 1) begin
rst_n <= 1'b1;
end
end
// Stimulus: Enable checks after reset
always @(posedge clk) begin
if (cyc == 2) begin
dv_if.enable_invalid_data_checks <= 1'b1;
end
end
// Simulate data transactions
always @(posedge clk) begin
case (cyc)
3: begin
dv_if.valid <= 1'b0;
dv_if.data <= 8'h00;
end
4: begin
dv_if.valid <= 1'b1;
dv_if.data <= 8'hAA; // Valid data
end
5: begin
dv_if.valid <= 1'b1;
dv_if.data <= 8'h55; // Valid data
end
6: begin
dv_if.valid <= 1'b0;
dv_if.data <= 8'hxx; // Unknown OK when valid=0
end
7: begin
dv_if.valid <= 1'b1;
dv_if.data <= 8'hFF; // Valid data
end
8: begin
dv_if.valid <= 1'b0;
dv_if.data <= 8'h00;
end
default: begin
dv_if.valid <= 1'b0;
dv_if.data <= 8'h00;
end
endcase
end
endmodule