231 lines
6.7 KiB
Systemverilog
231 lines
6.7 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain.
|
|
// SPDX-FileCopyrightText: 2026 Antmicro
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
// verilog_format: off
|
|
`define stop $stop
|
|
`define checkd(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0d exp=%0d (%s !== %s)\n", `__FILE__,`__LINE__, (gotv), (expv), `"gotv`", `"expv`"); `stop; end while(0);
|
|
// verilog_format: on
|
|
|
|
module t;
|
|
bit clk;
|
|
int cyc;
|
|
|
|
always #1 clk = !clk;
|
|
|
|
bit rst_mod;
|
|
int before_mod_false;
|
|
int before_mod_gen_false;
|
|
int before_gen_default_false;
|
|
int before_gen_child_default_false;
|
|
int prog_false_count;
|
|
|
|
always_comb rst_mod = (cyc < 3);
|
|
|
|
// The default declaration appears later in the module, but still applies here.
|
|
assert property (@(posedge clk) 0)
|
|
else before_mod_false++;
|
|
|
|
generate
|
|
begin : g_before_mod_default
|
|
// Inherits the module default declaration that appears later in this module.
|
|
assert property (@(posedge clk) 0)
|
|
else before_mod_gen_false++;
|
|
end
|
|
|
|
begin : g_before_local_default
|
|
// The generate-local default declaration appears later in the block.
|
|
assert property (@(posedge clk) 0)
|
|
else before_gen_default_false++;
|
|
|
|
begin : g_child_inherit
|
|
// Inherits the generate-local default declaration that appears later.
|
|
assert property (@(posedge clk) 0)
|
|
else before_gen_child_default_false++;
|
|
end
|
|
default disable iff (cyc < 7);
|
|
end
|
|
endgenerate
|
|
|
|
default disable iff (rst_mod);
|
|
|
|
generate
|
|
begin : g_override
|
|
bit rst_gen;
|
|
int override_false;
|
|
|
|
always_comb rst_gen = (cyc < 5);
|
|
|
|
default disable iff (rst_gen);
|
|
|
|
assert property (@(posedge clk) 0)
|
|
else override_false++;
|
|
end
|
|
|
|
begin : g_inherit
|
|
bit rst_mod;
|
|
int inherit_false;
|
|
|
|
always_comb rst_mod = (cyc < 8);
|
|
|
|
// Inherits the module default, whose rst_mod was resolved in module scope.
|
|
assert property (@(posedge clk) 0)
|
|
else inherit_false++;
|
|
end
|
|
endgenerate
|
|
|
|
if_scope u_if (.clk(clk), .cyc(cyc));
|
|
p_scope u_prog (.clk(clk), .cyc(cyc), .false_count(prog_false_count));
|
|
examples_with_default_count u_with (.clk(clk), .cyc(cyc));
|
|
examples_without_default_count u_without (.clk(clk), .cyc(cyc));
|
|
examples_with_default u_ieee_with (.a(1'b0), .b(1'b0), .clk(clk), .rst(1'b0), .rst1(1'b0));
|
|
examples_without_default u_ieee_without (.a(1'b0), .b(1'b0), .clk(clk), .rst(1'b0));
|
|
m_override u_m_override (.clk(clk), .cyc(cyc));
|
|
|
|
// The disable iff expression is unsampled, so same-edge updates race in MT simulation.
|
|
// Change clk on negedge while the properties are sampled on posedge to avoid races.
|
|
always @(negedge clk) begin
|
|
cyc++;
|
|
if (cyc == 12) begin
|
|
`checkd(before_mod_false, 9);
|
|
`checkd(before_mod_gen_false, 9);
|
|
`checkd(before_gen_default_false, 5);
|
|
`checkd(before_gen_child_default_false, 5);
|
|
`checkd(g_inherit.inherit_false, 9);
|
|
`checkd(g_override.override_false, 7);
|
|
`checkd(u_if.false_count, 6);
|
|
`checkd(u_if.g_inherit.false_count, 6);
|
|
`checkd(prog_false_count, 4);
|
|
`checkd(u_with.explicit_assert_false, 5);
|
|
`checkd(u_with.explicit_property_false, 5);
|
|
`checkd(u_with.inferred_default_false, 9);
|
|
`checkd(u_without.explicit_assert_false, 9);
|
|
`checkd(u_without.explicit_property_false, 9);
|
|
`checkd(u_m_override.false_count, 7);
|
|
`checkd(u_m_override.g_inherit_from_module.false_count, 7);
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
end
|
|
endmodule
|
|
|
|
module examples_with_default (input logic a, b, clk, rst, rst1);
|
|
default disable iff rst;
|
|
property p1;
|
|
disable iff (rst1) a |=> b;
|
|
endproperty
|
|
// Disable condition is rst1 - explicitly specified within a1
|
|
a1 : assert property (@(posedge clk) disable iff (rst1) a |=> b);
|
|
// Disable condition is rst1 - explicitly specified within p1
|
|
a2 : assert property (@(posedge clk) p1);
|
|
// Disable condition is rst - no explicit specification, inferred from
|
|
// default disable iff declaration
|
|
a3 : assert property (@(posedge clk) a |=> b);
|
|
// Disable condition is 1'b0. This is the only way to
|
|
// cancel the effect of default disable.
|
|
a4 : assert property (@(posedge clk) disable iff (1'b0) a |=> b);
|
|
endmodule
|
|
|
|
module examples_without_default (input logic a, b, clk, rst);
|
|
property p2;
|
|
disable iff (rst) a |=> b;
|
|
endproperty
|
|
// Disable condition is rst - explicitly specified within a5
|
|
a5 : assert property (@(posedge clk) disable iff (rst) a |=> b);
|
|
// Disable condition is rst - explicitly specified within p2
|
|
a6 : assert property (@ (posedge clk) p2);
|
|
// No disable condition
|
|
a7 : assert property (@ (posedge clk) a |=> b);
|
|
endmodule
|
|
|
|
module examples_with_default_count(input bit clk, input int cyc);
|
|
int explicit_assert_false;
|
|
int explicit_property_false;
|
|
int inferred_default_false;
|
|
|
|
default disable iff (cyc < 3);
|
|
|
|
property p1;
|
|
disable iff (cyc < 7) 0;
|
|
endproperty
|
|
|
|
// Disable condition is explicit in the assertion.
|
|
assert property (@(posedge clk) disable iff (cyc < 7) 0)
|
|
else explicit_assert_false++;
|
|
|
|
// Disable condition is explicit in the property.
|
|
assert property (@(posedge clk) p1)
|
|
else explicit_property_false++;
|
|
|
|
// Disable condition is inferred from the default.
|
|
assert property (@(posedge clk) 0)
|
|
else inferred_default_false++;
|
|
|
|
endmodule
|
|
|
|
module examples_without_default_count(input bit clk, input int cyc);
|
|
int explicit_assert_false;
|
|
int explicit_property_false;
|
|
|
|
property p2;
|
|
disable iff (cyc < 3) 0;
|
|
endproperty
|
|
|
|
// Disable condition is explicit in the assertion.
|
|
assert property (@(posedge clk) disable iff (cyc < 3) 0)
|
|
else explicit_assert_false++;
|
|
|
|
// Disable condition is explicit in the property.
|
|
assert property (@(posedge clk) p2)
|
|
else explicit_property_false++;
|
|
|
|
endmodule
|
|
|
|
module m_override(input bit clk, input int cyc);
|
|
bit rst2;
|
|
int false_count;
|
|
|
|
always_comb rst2 = (cyc < 5);
|
|
default disable iff (rst2);
|
|
|
|
assert property (@(posedge clk) 0)
|
|
else false_count++;
|
|
|
|
generate
|
|
begin : g_inherit_from_module
|
|
int false_count;
|
|
assert property (@(posedge clk) 0)
|
|
else false_count++;
|
|
end
|
|
endgenerate
|
|
endmodule
|
|
|
|
interface if_scope(input bit clk, input int cyc);
|
|
bit rst_if;
|
|
int false_count;
|
|
|
|
always_comb rst_if = (cyc < 6);
|
|
default disable iff (rst_if);
|
|
|
|
assert property (@(posedge clk) 0)
|
|
else false_count++;
|
|
|
|
generate
|
|
begin : g_inherit
|
|
int false_count;
|
|
assert property (@(posedge clk) 0)
|
|
else false_count++;
|
|
end
|
|
endgenerate
|
|
endinterface
|
|
|
|
program p_scope(input bit clk, input int cyc,
|
|
output int false_count);
|
|
default disable iff (cyc < 8);
|
|
|
|
assert property (@(posedge clk) 0)
|
|
else false_count++;
|
|
endprogram
|