Commentary: Changes update

This commit is contained in:
Wilson Snyder 2026-08-08 12:58:32 -04:00
parent 7e80ea6577
commit 18844537bd
22 changed files with 223 additions and 161 deletions

37
Changes
View File

@ -22,14 +22,18 @@ Verilator 5.051 devel
* Add error when scalar is passed to array task argument (#7948). [Pawel Klopotek] * Add error when scalar is passed to array task argument (#7948). [Pawel Klopotek]
* Add MULTIDRIVENPROC warning for signals driven by multiple plain always blocks (#7968). [Aisha] * Add MULTIDRIVENPROC warning for signals driven by multiple plain always blocks (#7968). [Aisha]
* Add FSM arc and state coverage to verilator_coverage .info output (#7972) (#7973). [Igor Zaworski, Antmicro Ltd.] * Add FSM arc and state coverage to verilator_coverage .info output (#7972) (#7973). [Igor Zaworski, Antmicro Ltd.]
* Support embedded covergroup member references (#7749) (#8015). [Marco Bartoli]
* Support a sequence used as an event control (#7797) (#7846). [Yilou Wang] * Support a sequence used as an event control (#7797) (#7846). [Yilou Wang]
* Support `[\*N:$]` consecutive repetition (#7940). [Artur Bieniek, Antmicro Ltd.] * Support `[\*N:$]` consecutive repetition (#7940). [Artur Bieniek, Antmicro Ltd.]
* Support dynamic containers in unique constraints (#7947). [Adam Kostrzewski, Antmicro Ltd.] * Support dynamic containers in unique constraints (#7947). [Adam Kostrzewski, Antmicro Ltd.]
* Support delayed tristate gates (#7960) (#7961). [Patrick Creighton] * Support delayed tristate gates (#7960) (#7961). [Patrick Creighton]
* Support `default clocking` (#7984). [Kamil Danecki, Antmicro Ltd.]
* Support `weak`/`strong` keywords in property expressions (#8054). [Artur Bieniek, Antmicro Ltd.]
* Optimize random initialization. [Geza Lore, Testorrent USA, Inc.] * Optimize random initialization. [Geza Lore, Testorrent USA, Inc.]
* Optimize more always blocks in DFG (#7775). [Geza Lore, Testorrent USA, Inc.] * Optimize more always blocks in DFG (#7775). [Geza Lore, Testorrent USA, Inc.]
* Optimize assertion NFAs using bit-vector ring buffers (#7885). [Artur Bieniek, Antmicro Ltd.] * Optimize assertion NFAs using bit-vector ring buffers (#7885). [Artur Bieniek, Antmicro Ltd.]
* Optimize VPI symbol registration and scope construction (#7936). [Nick Brereton] * Optimize VPI symbol registration and scope construction (#7936). [Nick Brereton]
* Fix $finish continuing event loop (#7267) (#7950). [Artur Bieniek, Antmicro Ltd.]
* Fix $display accepting streaming concat arguments (#7663) (#7890). [Jaeuk Lee] * Fix $display accepting streaming concat arguments (#7663) (#7890). [Jaeuk Lee]
* Fix DFG misoptimizing bound checks (#7755). [Jakub Michalski] * Fix DFG misoptimizing bound checks (#7755). [Jakub Michalski]
* Fix unique0 case side effects (#7787). [Pawel Klopotek] * Fix unique0 case side effects (#7787). [Pawel Klopotek]
@ -37,6 +41,8 @@ Verilator 5.051 devel
* Fix cleaning purity cache after assertions. [Geza Lore, Testorrent USA, Inc.] * Fix cleaning purity cache after assertions. [Geza Lore, Testorrent USA, Inc.]
* Fix uncaught type error leading to invalid C++ output (#7814). [Geza Lore, Testorrent USA, Inc.] * Fix uncaught type error leading to invalid C++ output (#7814). [Geza Lore, Testorrent USA, Inc.]
* Fix internal error for coverpoints that reference a covergroup formal parameter (#7853 partial) (#7889). [Matthew Ballance] * Fix internal error for coverpoints that reference a covergroup formal parameter (#7853 partial) (#7889). [Matthew Ballance]
* Fix immediate disable of fork join branches (#7856) (#7931). [Marco Bartoli]
* Fix self-disable of named blocks with forks (Part of #7857) (#7996) (#8006). [Marco Bartoli]
* Fix clang++ ambiguous overload of '==' operator (#7863). [Pawel Kojma, Antmicro Ltd.] * Fix clang++ ambiguous overload of '==' operator (#7863). [Pawel Kojma, Antmicro Ltd.]
* Fix heap-use-after-free in `VlRNG::VlRNG()` (#7865). [Dragon-Git] * Fix heap-use-after-free in `VlRNG::VlRNG()` (#7865). [Dragon-Git]
* Fix mixed-width inside and dist range bounds failing randomization (#7875). [Yilou Wang] * Fix mixed-width inside and dist range bounds failing randomization (#7875). [Yilou Wang]
@ -60,14 +66,41 @@ Verilator 5.051 devel
* Fix unlinked error with function call in derived class parameter (#7923). [Mateusz Gancarz, Antmicro Ltd.] * Fix unlinked error with function call in derived class parameter (#7923). [Mateusz Gancarz, Antmicro Ltd.]
* Fix class parameter resolution (#7935). * Fix class parameter resolution (#7935).
* Fix FSM detection of coverage-only branches (#7941) (#7942). [Patrick Creighton] * Fix FSM detection of coverage-only branches (#7941) (#7942). [Patrick Creighton]
* Fix use-after-free in V3LinkDotIfaceCapture (#7943). [Nick Brereton]
* Fix sampled-value clocks in repeated assertions (#7944). [Artur Bieniek, Antmicro Ltd.] * Fix sampled-value clocks in repeated assertions (#7944). [Artur Bieniek, Antmicro Ltd.]
* Fix queued $finish/$stop request thread ordering (#7946 prep) (#7952). [Yilou Wang]
* Fix DFG nested shifts with overflowing shift amount (#7955) (#7977).
* Fix timing controls in interface tasks called via virtual interface (#7959). [Yilou Wang]
* Fix lambda parameter types in queue min and max (#7962). [Bartosz Skorowski] * Fix lambda parameter types in queue min and max (#7962). [Bartosz Skorowski]
* Fix solve-before dropping all soft constraints in randomize() (#7963). [Yilou Wang] * Fix solve-before dropping all soft constraints in randomize() (#7963). [Yilou Wang]
* Fix generic interface param resolution in module/cell parameterization (#7970) (#7971). [David Garau]
* Fix lost writes when select width exceeds variable width (#7975). [Bartosz Skorowski] * Fix lost writes when select width exceeds variable width (#7975). [Bartosz Skorowski]
* Fix variable scope in unique on dynamic array (#7981). [Kornel Uriasz, Antmicro Ltd.]
* Fix table optimization causing not contextually convertible to bool error (#7983). [Jakub Michalski]
* Fix $fgets being mis-optimized away (#7976). [G-A. Kamendje] * Fix $fgets being mis-optimized away (#7976). [G-A. Kamendje]
* Fix SYNCASYNCNET false positive with changed non-edge logic (#7980). [Oron Port] * Fix SYNCASYNCNET false positive with changed non-edge logic (#7980). [Oron Port]
* Fix variable scope in unique on dynamic array (#7981). [Kornel Uriasz, Antmicro Ltd.]
* Fix table optimization causing not contextually convertible to bool error (#7983). [Jakub Michalski]
* Fix wait fork trigger temporary split across generated functions (#7985) (#7986). [Marco Brambilla]
* Fix randomize() with a user variable named 'item' (#7993) (#7994).
* Fix UNSATCONSTR reporting constraint indices above 9 (#7995). [Yilou Wang]
* Fix MULTIDRIVEN/PROC warning suppression via lint_off (#8000). [Gilberto Abram]
* Fix force not substituted into an unpacked array index (#8002).
* Fix dist weights ignored when an item is not a literal (#8003).
* Fix error when forcing an array element read at a run-time index (#8004).
* Fix missing verilator_coverage in cmake install (#8008) (#8011).
* Fix dist inside a foreach nested in a constraint if (#8016).
* Fix gcov dump on warnings discarding later coverage counts (#8017). [Yilou Wang]
* Fix unique constraint crash, guards, and size (#8018).
* Fix assignment pattern key constant expressions (#8029) (#8030). [Josep Sans]
* Fix skipping optimization for unpacked data types (#8031). [Kornel Uriasz, Antmicro Ltd.]
* Fix gate deduplication with function arguments (#8038). [JOTEGO]
* Fix conditional expression with parameterized classes (#8039). [Pawel Klopotek, Antmicro Ltd.]
* Fix array size references in constraints (#8040). [Kornel Uriasz, Antmicro Ltd.]
* Fix mid-range consecutive repetition rejects (#8041). [Artur Bieniek, Antmicro Ltd.]
* Fix write access to dynamic arrays (#8043). [Bartosz Skorowski, Antmicro Ltd.]
* Fix nondeterminism in trace stage (#8046). [Sumanth Kadiyala]
* Fix force helpers in multiply instantiated modules (#8047). [Artur Bieniek, Antmicro Ltd.]
* Fix pin to non-existent port with PINNOTFOUND suppressed (#8051) (#8052). [Nikolai Kumar]
* Fix wildcard equality against a 4-state constant in an assertion (#8056) (#8057). [Nikolai Kumar]
Verilator 5.050 2026-07-01 Verilator 5.050 2026-07-01

View File

@ -709,6 +709,7 @@ de
dearray dearray
deassign deassign
debugi debugi
deduplication
defenv defenv
defname defname
defparam defparam
@ -1177,6 +1178,7 @@ tcmalloc
tcmalloc tcmalloc
tenghtt tenghtt
testbench testbench
testbenches
threadsafe threadsafe
threashold threashold
timeInc timeInc

View File

@ -10,7 +10,7 @@
// verilog_format: on // verilog_format: on
module t ( module t (
input logic clk input logic clk
); );
localparam OP_UNTYPED = 3'b000; localparam OP_UNTYPED = 3'b000;

View File

@ -5,8 +5,8 @@
// SPDX-License-Identifier: CC0-1.0 // SPDX-License-Identifier: CC0-1.0
module t ( module t (
input clk input clk
); );
clocking cb1 @(posedge clk); clocking cb1 @(posedge clk);
endclocking endclocking

View File

@ -5,10 +5,10 @@
// SPDX-License-Identifier: CC0-1.0 // SPDX-License-Identifier: CC0-1.0
module t ( module t (
input clk input clk
); );
initial begin: foo initial begin : foo
end end
default clocking cb_nonexistent; default clocking cb_nonexistent;

View File

@ -5,16 +5,16 @@
// SPDX-License-Identifier: CC0-1.0 // SPDX-License-Identifier: CC0-1.0
module t ( module t (
input clk input clk
); );
int cyc = 0; int cyc = 0;
always @(negedge clk) begin // negedge so there is nothing after $finish always @(negedge clk) begin // negedge so there is nothing after $finish
cyc <= cyc + 1; cyc <= cyc + 1;
if (cyc == 12) begin if (cyc == 12) begin
$write("*-* All Finished *-*\n"); $write("*-* All Finished *-*\n");
$finish; $finish;
end end
end end
clocking cb @(posedge clk); clocking cb @(posedge clk);
@ -22,11 +22,11 @@ module t (
default clocking cb; default clocking cb;
initial begin initial begin
## 2; ##2;
if ($time != 20) $stop; if ($time != 20) $stop;
## 5; ##5;
if ($time != 70) $stop; if ($time != 70) $stop;
## 3; ##3;
if ($time != 100) $stop; if ($time != 100) $stop;
end end
endmodule endmodule

View File

@ -17,7 +17,7 @@ class Indep;
Sub s[]; Sub s[];
function new(); function new();
s = new [10]; s = new[10];
endfunction endfunction
endclass endclass

View File

@ -4,25 +4,25 @@
// SPDX-FileCopyrightText: 2026 Antmicro // SPDX-FileCopyrightText: 2026 Antmicro
// SPDX-License-Identifier: CC0-1.0 // SPDX-License-Identifier: CC0-1.0
/*verilator lint_off*/ // verilator lint_off
// verilog_format: off
`define stop $stop `define stop $stop
`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0); `define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
`define check_range(gotv,minv,maxv) do if ((gotv) < (minv) || (gotv) > (maxv)) begin $write("%%Error: %s:%0d: got=%0d exp=%0d-%0d\n", `__FILE__,`__LINE__, (gotv), (minv), (maxv)); `stop; end while(0); `define check_range(gotv, minv, maxv) do if ((gotv) < (minv) || (gotv) > (maxv)) begin $write("%%Error: %s:%0d: got=%0d exp=%0d-%0d\n", `__FILE__,`__LINE__, (gotv), (minv), (maxv)); `stop; end while(0);
/*verilator lint_on*/ // verilog_format: on
// verilator lint_on
class SubSubClass; class SubSubClass;
rand int subVal; rand int subVal;
rand int subArr[]; rand int subArr[];
constraint c{ constraint c {subArr.size < 10;}
subArr.size < 10;
}
endclass endclass
class SubClass; class SubClass;
rand int subVal; rand int subVal;
rand int subArr[]; rand int subArr[];
rand int assocArr[string] = '{ "test": 1, "test2" : 2 }; rand int assocArr[string] = '{"test": 1, "test2" : 2};
SubSubClass ssc; SubSubClass ssc;
function new(); function new();
@ -48,7 +48,8 @@ class BaseClass;
constraint bc { constraint bc {
arr.size < 10; arr.size < 10;
arr.size > 5; arr.size > 5;
}; }
;
endclass endclass
class ExtClass0 extends BaseClass; class ExtClass0 extends BaseClass;
@ -56,24 +57,18 @@ class ExtClass0 extends BaseClass;
return (cls.randomize() with { return (cls.randomize() with {
// If with arr.size on array, that's a field of class // If with arr.size on array, that's a field of class
// calling randomize() with // calling randomize() with
if (arr.size > 0) { if (arr.size > 0) {val0 inside {arr};}
val0 inside {arr};
}
// If with arr.size on array thats a field inside subclass // If with arr.size on array thats a field inside subclass
// chain // chain
if (cls.sc.ssc.subArr.size > 0 ) { if (cls.sc.ssc.subArr.size > 0) {val1 == 'hDEADBEEF;}
val1 == 'hDEADBEEF;
}
// Randomizable array size // Randomizable array size
sc.subArr.size > 25; sc.subArr.size > 25;
sc.subArr.size < 50; sc.subArr.size < 50;
// If with associative array size // If with associative array size
if (sc.assocArr.size > 0) { if (sc.assocArr.size > 0) {val2 == 'hCAFEBABE;}
val2 == 'hCAFEBABE;
}
}); });
endfunction endfunction
endclass endclass
@ -81,10 +76,8 @@ endclass
class ExtClass1 extends BaseClass; class ExtClass1 extends BaseClass;
// Class that extends BaseClass and uses arr.size variable // Class that extends BaseClass and uses arr.size variable
constraint c { constraint c {
unique{arr}; unique {arr};
foreach(arr[i]) { foreach (arr[i]) {arr[i] != 0;}
arr[i] != 0;
}
} }
endclass endclass
@ -97,7 +90,7 @@ module t;
indep = new; indep = new;
ext0 = new; ext0 = new;
ext1 = new; ext1 = new;
repeat(10) begin repeat (10) begin
`checkh(ext0.randomize(), 1); `checkh(ext0.randomize(), 1);
`checkh(ext0.randomize(), 1); `checkh(ext0.randomize(), 1);
`checkh(ext0.randomize_gpr(indep), 1); `checkh(ext0.randomize_gpr(indep), 1);
@ -122,7 +115,7 @@ module t;
end end
end end
$write("*-* All Finished *-*\n"); $write("*-* All Finished *-*\n");
$finish(); $finish();
end end
endmodule endmodule

View File

@ -28,11 +28,11 @@ class QueueHolder;
endtask endtask
endclass endclass
module child( module child (
input bit do_disable, input bit do_disable,
output bit survived_a, output bit survived_a,
output bit survived_b, output bit survived_b,
output bit done output bit done
); );
initial begin initial begin
@ -42,7 +42,8 @@ module child(
#1; #1;
disable fork_blk; disable fork_blk;
$stop; $stop;
end else begin end
else begin
#6; #6;
survived_a = 1'b1; survived_a = 1'b1;
end end
@ -50,7 +51,8 @@ module child(
begin begin
if (do_disable) begin if (do_disable) begin
#5 $stop; #5 $stop;
end else begin end
else begin
#6; #6;
survived_b = 1'b1; survived_b = 1'b1;
end end
@ -72,18 +74,18 @@ module t;
bit done1; bit done1;
QueueHolder holder; QueueHolder holder;
child child0( child child0 (
.do_disable(do_disable0), .do_disable(do_disable0),
.survived_a(survived_a0), .survived_a(survived_a0),
.survived_b(survived_b0), .survived_b(survived_b0),
.done(done0) .done(done0)
); );
child child1( child child1 (
.do_disable(do_disable1), .do_disable(do_disable1),
.survived_a(survived_a1), .survived_a(survived_a1),
.survived_b(survived_b1), .survived_b(survived_b1),
.done(done1) .done(done1)
); );
initial begin initial begin

View File

@ -24,7 +24,7 @@ module t;
gen = new; gen = new;
arr = new[1]; arr = new[1];
arr[0][gen.get_num(3)] = 1'b1; arr[0][gen.get_num(3)] = 1'b1;
`checkh(arr[0][3],1'b1); `checkh(arr[0][3], 1'b1);
$finish; $finish;
end end
endmodule endmodule

View File

@ -4,7 +4,7 @@
// SPDX-FileCopyrightText: 2026 Jose Tejada // SPDX-FileCopyrightText: 2026 Jose Tejada
// SPDX-License-Identifier: CC0-1.0 // SPDX-License-Identifier: CC0-1.0
module jtcop_bac06( module jtcop_bac06 (
input rst, input rst,
input clk, input clk,
input [15:0] cpu_dout, input [15:0] cpu_dout,
@ -31,29 +31,40 @@ module jtcop_bac06(
end end
function [15:0] combine(input [15:0] din); function [15:0] combine(input [15:0] din);
combine = {cpu_dsn[1] ? din[15:8] : cpu_dout[15:8], combine = {cpu_dsn[1] ? din[15:8] : cpu_dout[15:8], cpu_dsn[0] ? din[7:0] : cpu_dout[7:0]};
cpu_dsn[0] ? din[7:0] : cpu_dout[7:0]};
endfunction endfunction
always @(posedge clk) begin always @(posedge clk) begin
if (rst) vscr <= {def_cfg[7], def_cfg[6]}; if (rst) vscr <= {def_cfg[7], def_cfg[6]};
else case (cpu_addr[2:1]) else
0: hscr <= combine(hscr); case (cpu_addr[2:1])
1: vscr <= combine(vscr); 0: hscr <= combine(hscr);
2: colscr_sh <= cpu_dout[3:0]; 1: vscr <= combine(vscr);
3: rowscr_sh <= cpu_dout[3:0]; 2: colscr_sh <= cpu_dout[3:0];
endcase 3: rowscr_sh <= cpu_dout[3:0];
endcase
end end
endmodule endmodule
module jtcop_game(input clk, output [7:0] st_dout); module jtcop_game (
input clk,
output [7:0] st_dout
);
wire [12:1] cpu_addr; wire [12:1] cpu_addr;
jtcop_main u_main(.cpu_addr(cpu_addr)); jtcop_main u_main (.cpu_addr(cpu_addr));
jtcop_bac06 u_ba2(.rst(rst), .clk(clk), .cpu_dout(ba2_din), jtcop_bac06 u_ba2 (
.cpu_addr(cpu_addr), .cpu_dsn(ba2_dsn), .st_addr(st_addr), .rst(rst),
.st_dout(st_dout)); .clk(clk),
.cpu_dout(ba2_din),
.cpu_addr(cpu_addr),
.cpu_dsn(ba2_dsn),
.st_addr(st_addr),
.st_dout(st_dout)
);
endmodule endmodule
module jtcop_main(output [12:1] cpu_addr); module jtcop_main (
output [12:1] cpu_addr
);
assign cpu_addr = '0; assign cpu_addr = '0;
endmodule endmodule

View File

@ -42,7 +42,10 @@ module t;
for (genvar g = 0; g < 2; ++g) begin : gen_block for (genvar g = 0; g < 2; ++g) begin : gen_block
avmm_if #(.DW(32 * (g + 1))) m_if (); avmm_if #(.DW(32 * (g + 1))) m_if ();
avmm_if #(.DW(32 * (g + 1))) s_if (); avmm_if #(.DW(32 * (g + 1))) s_if ();
avmm_autopipeline pipe (.master(m_if), .slave(s_if)); avmm_autopipeline pipe (
.master(m_if),
.slave(s_if)
);
end end
initial begin initial begin

View File

@ -10,7 +10,5 @@ module child ();
endmodule endmodule
module t; module t;
child u_child ( child u_child (.missing_port(1'b0));
.missing_port (1'b0)
);
endmodule endmodule

View File

@ -8,7 +8,7 @@
// expression when trying to optimise bit operations. // expression when trying to optimise bit operations.
module t; module t;
class Cls; class Cls;
endclass; endclass
class subCls; class subCls;
bit val = 1'b1; bit val = 1'b1;
@ -20,7 +20,7 @@ module t;
$stop(); $stop();
end end
endfunction endfunction
endclass; endclass
subCls sc; subCls sc;

View File

@ -10,14 +10,18 @@ endclass
typedef Base Base_t; typedef Base Base_t;
class SubA #(type T = int) extends Base_t; class SubA #(
type T = int
) extends Base_t;
endclass endclass
class SubB #(type T = int) extends Base_t; class SubB #(
type T = int
) extends Base_t;
endclass endclass
typedef SubA #(int) SubAInt_t; typedef SubA#(int) SubAInt_t;
typedef SubB #(int) SubBInt_t; typedef SubB#(int) SubBInt_t;
class Container; class Container;
local SubAInt_t a; local SubAInt_t a;

View File

@ -1,47 +1,47 @@
%Error: t/t_prop_bad.v:14:40: syntax error, unexpected s_eventually, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:14:41: syntax error, unexpected s_eventually, expecting IDENTIFIER-for-type
14 | assert property (@(posedge clk) weak(s_eventually a)); 14 | assert property (@(posedge clk) weak (s_eventually a));
| ^~~~~~~~~~~~ | ^~~~~~~~~~~~
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance. ... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
%Error: t/t_prop_bad.v:15:40: syntax error, unexpected s_always, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:15:41: syntax error, unexpected s_always, expecting IDENTIFIER-for-type
15 | assert property (@(posedge clk) weak(s_always [1:2] a)); 15 | assert property (@(posedge clk) weak (s_always[1: 2] a));
| ^~~~~~~~ | ^~~~~~~~
%Error: t/t_prop_bad.v:16:40: syntax error, unexpected nexttime, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:16:41: syntax error, unexpected nexttime, expecting IDENTIFIER-for-type
16 | assert property (@(posedge clk) weak(nexttime a)); 16 | assert property (@(posedge clk) weak (nexttime a));
| ^~~~~~~~ | ^~~~~~~~
%Error: t/t_prop_bad.v:17:40: syntax error, unexpected s_nexttime, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:17:41: syntax error, unexpected s_nexttime, expecting IDENTIFIER-for-type
17 | assert property (@(posedge clk) weak(s_nexttime a)); 17 | assert property (@(posedge clk) weak (s_nexttime a));
| ^~~~~~~~~~ | ^~~~~~~~~~
%Error: t/t_prop_bad.v:18:40: syntax error, unexpected always, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:18:41: syntax error, unexpected always, expecting IDENTIFIER-for-type
18 | assert property (@(posedge clk) weak(always a)); 18 | assert property (@(posedge clk) weak (always a));
| ^~~~~~ | ^~~~~~
%Error: t/t_prop_bad.v:19:40: syntax error, unexpected eventually, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:19:41: syntax error, unexpected eventually, expecting IDENTIFIER-for-type
19 | assert property (@(posedge clk) weak(eventually [1:2] a)); 19 | assert property (@(posedge clk) weak (eventually[1: 2] a));
| ^~~~~~~~~~ | ^~~~~~~~~~
%Error: t/t_prop_bad.v:20:42: syntax error, unexpected |-> %Error: t/t_prop_bad.v:20:43: syntax error, unexpected |->
20 | assert property (@(posedge clk) weak(a |-> b)); 20 | assert property (@(posedge clk) weak (a |-> b));
| ^~~ | ^~~
%Error: t/t_prop_bad.v:21:42: syntax error, unexpected |=> %Error: t/t_prop_bad.v:21:43: syntax error, unexpected |=>
21 | assert property (@(posedge clk) weak(a |=> b)); 21 | assert property (@(posedge clk) weak (a |=> b));
| ^~~ | ^~~
%Error: t/t_prop_bad.v:22:42: syntax error, unexpected implies %Error: t/t_prop_bad.v:22:43: syntax error, unexpected implies
22 | assert property (@(posedge clk) weak(a implies b)); 22 | assert property (@(posedge clk) weak (a implies b));
| ^~~~~~~ | ^~~~~~~
%Error: t/t_prop_bad.v:23:42: syntax error, unexpected iff %Error: t/t_prop_bad.v:23:43: syntax error, unexpected iff
23 | assert property (@(posedge clk) weak(a iff b)); 23 | assert property (@(posedge clk) weak (a iff b));
| ^~~ | ^~~
%Error: t/t_prop_bad.v:24:40: syntax error, unexpected accept_on, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:24:41: syntax error, unexpected accept_on, expecting IDENTIFIER-for-type
24 | assert property (@(posedge clk) weak(accept_on (a) b)); 24 | assert property (@(posedge clk) weak (accept_on (a) b));
| ^~~~~~~~~ | ^~~~~~~~~
%Error: t/t_prop_bad.v:25:40: syntax error, unexpected reject_on, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:25:41: syntax error, unexpected reject_on, expecting IDENTIFIER-for-type
25 | assert property (@(posedge clk) weak(reject_on (a) b)); 25 | assert property (@(posedge clk) weak (reject_on (a) b));
| ^~~~~~~~~ | ^~~~~~~~~
%Error: t/t_prop_bad.v:26:40: syntax error, unexpected if, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:26:40: syntax error, unexpected if, expecting IDENTIFIER-for-type
26 | assert property (@(posedge clk) weak(if (a) b else c)); 26 | assert property (@(posedge clk) weak(if (a) b else c));
| ^~ | ^~
%Error: t/t_prop_bad.v:27:40: syntax error, unexpected strong, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:27:41: syntax error, unexpected strong, expecting IDENTIFIER-for-type
27 | assert property (@(posedge clk) weak(strong(a))); 27 | assert property (@(posedge clk) weak (strong (a)));
| ^~~~~~ | ^~~~~~
%Error: t/t_prop_bad.v:28:42: syntax error, unexpected weak, expecting IDENTIFIER-for-type %Error: t/t_prop_bad.v:28:43: syntax error, unexpected weak, expecting IDENTIFIER-for-type
28 | assert property (@(posedge clk) strong(weak(a))); 28 | assert property (@(posedge clk) strong (weak (a)));
| ^~~~ | ^~~~
%Error: Exiting due to %Error: Exiting due to

View File

@ -11,19 +11,19 @@ module t (
logic b = 1'b1; logic b = 1'b1;
logic c = 1'b1; logic c = 1'b1;
assert property (@(posedge clk) weak(s_eventually a)); assert property (@(posedge clk) weak (s_eventually a));
assert property (@(posedge clk) weak(s_always [1:2] a)); assert property (@(posedge clk) weak (s_always[1: 2] a));
assert property (@(posedge clk) weak(nexttime a)); assert property (@(posedge clk) weak (nexttime a));
assert property (@(posedge clk) weak(s_nexttime a)); assert property (@(posedge clk) weak (s_nexttime a));
assert property (@(posedge clk) weak(always a)); assert property (@(posedge clk) weak (always a));
assert property (@(posedge clk) weak(eventually [1:2] a)); assert property (@(posedge clk) weak (eventually[1: 2] a));
assert property (@(posedge clk) weak(a |-> b)); assert property (@(posedge clk) weak (a |-> b));
assert property (@(posedge clk) weak(a |=> b)); assert property (@(posedge clk) weak (a |=> b));
assert property (@(posedge clk) weak(a implies b)); assert property (@(posedge clk) weak (a implies b));
assert property (@(posedge clk) weak(a iff b)); assert property (@(posedge clk) weak (a iff b));
assert property (@(posedge clk) weak(accept_on (a) b)); assert property (@(posedge clk) weak (accept_on (a) b));
assert property (@(posedge clk) weak(reject_on (a) b)); assert property (@(posedge clk) weak (reject_on (a) b));
assert property (@(posedge clk) weak(if (a) b else c)); assert property (@(posedge clk) weak(if (a) b else c));
assert property (@(posedge clk) weak(strong(a))); assert property (@(posedge clk) weak (strong (a)));
assert property (@(posedge clk) strong(weak(a))); assert property (@(posedge clk) strong (weak (a)));
endmodule endmodule

View File

@ -1,6 +1,6 @@
%Error-UNSUPPORTED: t/t_prop_strong_unsup.v:12:20: Unsupported: strong property in assume. %Error-UNSUPPORTED: t/t_prop_strong_unsup.v:12:20: Unsupported: strong property in assume.
: ... note: In instance 't' : ... note: In instance 't'
12 | assume property (@(posedge clk) strong(a ##1 a)); 12 | assume property (@(posedge clk) strong (a ##1 a));
| ^ | ^
... For error description see https://verilator.org/warn/UNSUPPORTED?v=latest ... For error description see https://verilator.org/warn/UNSUPPORTED?v=latest
%Error: Exiting due to %Error: Exiting due to

View File

@ -9,5 +9,5 @@ module t (
); );
logic a = 1'b1; logic a = 1'b1;
assume property (@(posedge clk) strong(a ##1 a)); assume property (@(posedge clk) strong (a ##1 a));
endmodule endmodule

View File

@ -10,6 +10,6 @@ module t (
logic a = 1'b1; logic a = 1'b1;
property p_unused_strong; property p_unused_strong;
@(posedge clk) strong(a); @(posedge clk) strong (a);
endproperty endproperty
endmodule endmodule

View File

@ -21,37 +21,42 @@ module t (
++cyc; ++cyc;
if (cyc < 5) begin if (cyc < 5) begin
->e; ->e;
end else begin end
else begin
`checkd(hit, 'b1111111); `checkd(hit, 'b1111111);
$write("*-* All Finished *-*\n"); $write("*-* All Finished *-*\n");
$finish; $finish;
end end
end end
assert property (@(e) weak(##1 1 ##1 1)); assert property (@(e) weak (##1 1 ##1 1));
assert property (@(e) weak(1 ##1 1 ##1 1)); assert property (@(e) weak (1 ##1 1 ##1 1));
assert property (@(e) weak(1 ##1 1)); assert property (@(e) weak (1 ##1 1));
assert property (@(e) weak(##1 1 ##1 1)) begin assert property (@(e) weak (##1 1 ##1 1)) begin
hit |= 'b1; hit |= 'b1;
end end
assert property (@(e) weak(1 ##1 1 ##1 1)) begin assert property (@(e) weak (1 ##1 1 ##1 1)) begin
hit |= 'b10; hit |= 'b10;
end end
assert property (@(e) weak(1 ##1 1)) begin assert property (@(e) weak (1 ##1 1)) begin
hit |= 'b100; hit |= 'b100;
end end
assert property (@(e) weak(##1 1 ##1 0)) else begin assert property (@(e) weak (##1 1 ##1 0))
else begin
hit |= 'b1000; hit |= 'b1000;
end end
assert property (@(e) weak(##1 0)) else begin assert property (@(e) weak (##1 0))
else begin
hit |= 'b10000; hit |= 'b10000;
end end
assert property (@(e) weak(1 ##1 1 ##1 0)) else begin assert property (@(e) weak (1 ##1 1 ##1 0))
else begin
hit |= 'b100000; hit |= 'b100000;
end end
assert property (@(e) weak(1 ##1 0)) else begin assert property (@(e) weak (1 ##1 0))
else begin
hit |= 'b1000000; hit |= 'b1000000;
end end

View File

@ -11,23 +11,34 @@
module t; module t;
logic clk = 1'b0; logic clk = 1'b0;
int cnt = 0; int cnt = 0;
always #5 clk = ~clk; always #5 clk = ~clk;
task automatic phase(int n); task automatic phase(int n);
fork begin @(posedge clk); cnt += n; end join_none fork
begin
@(posedge clk);
cnt += n;
end
join_none
wait fork; wait fork;
endtask endtask
initial begin initial begin
fork @(posedge clk); join_none fork
@(posedge clk);
join_none
wait fork; wait fork;
phase(1); phase(1);
fork @(negedge clk); join_none fork
@(negedge clk);
join_none
wait fork; wait fork;
phase(2); phase(2);
fork @(posedge clk); join_none fork
@(posedge clk);
join_none
wait fork; wait fork;
phase(4); phase(4);
if (cnt != 7) begin if (cnt != 7) begin