Commentary: Changes update
This commit is contained in:
parent
afad8db672
commit
f3a86bacdd
14
Changes
14
Changes
|
|
@ -30,7 +30,9 @@ Verilator 5.049 devel
|
|||
* Support followed-by operators `#-#` and `#=#` in properties (#7523). [Yilou Wang]
|
||||
* Support expression coverage on assign statements (#7542) (#7543). [Thomas Brown]
|
||||
* Support TERMUX (#7559). [Laurent CHARRIER]
|
||||
* Support NBAs in initial blocks with delay/event controls (#7566) (#7600). [Muzaffer Kal]
|
||||
* Support SVA goto repetition with range `[->M:N]` (#7569). [Yilou Wang]
|
||||
* Support property abort operators (accept_on, reject_on) (#7578). [Yilou Wang]
|
||||
* Support procedural concurrent assertions with inferred clock (#7581). [Yilou Wang]
|
||||
* Support calling interface functions without parens (#7584). [Krzysztof Bieganski, Antmicro Ltd.]
|
||||
* Add peak memory usage to `--stats`. [Geza Lore, Testorrent USA, Inc.]
|
||||
|
|
@ -40,10 +42,12 @@ Verilator 5.049 devel
|
|||
* Change JSON to include parameter constant mnemonics for FSM Coverage (#7531). [Yogish Sekhar]
|
||||
* Optimize emitting to_string() for compiler speedup (#7468). [Jakub Michalski, Antmicro Ltd.]
|
||||
* Optimize additional DFG peephole cases (#7553). [Varun Koyyalagunta, Testorrent USA, Inc.]
|
||||
* Optimize forced signal handling (#7554 partial) (#7572) (#7504_. [Krzysztof Bieganski, Artur Bieniek, Antmicro Ltd.]
|
||||
* Optimize forced signal handling (#7554 partial) (#7572) (#7594) (#7596). [Krzysztof Bieganski, Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix inlining static initializer in V3Gate (#5381) (#7503). [Andrew Nolte] [Geza Lore, Testorrent USA, Inc.]
|
||||
* Fix segmentation fault when using --trace with --lib-create (#7299) (#7518). [anonkey]
|
||||
* Fix destructive event state before dynamic waits (#7340). [Nick Brereton]
|
||||
* Fix array pattern concatenation (#7401) (#7402). [Greg Davill]
|
||||
* Fix fairness in `std::semaphore` (#7435) (#7605). [Krzysztof Bieganski, Antmicro Ltd.]
|
||||
* Fix generic interface port forwarded to a nested instance (#7454) (#7457). [Yilou Wang]
|
||||
* Fix internal error on multi-cycle SVA under default clocking (#7472) (#7506). [Yilou Wang]
|
||||
* Fix internal error instead of missing prototype error (#7485). [Alex Solomatnikov]
|
||||
|
|
@ -56,15 +60,23 @@ Verilator 5.049 devel
|
|||
* Fix $bits on local struct with chained-interface (#7515) (#7517).
|
||||
* Fix array indexing side effects in compound assignments (#7519) (#7540) (#7544). [Kamil Danecki, Antmicro Ltd.]
|
||||
* Fix class::localparam during elaboration (#7524) (#7534).
|
||||
* Fix nested parameterized class typedef chain (#7538). [Michael Rogenmoser]
|
||||
* Fix events in observed region (#7546). [Todd Strader]
|
||||
* Fix regression rejecting boolean `!x` inside sequence expressions (#7549) (#7551). [Yilou Wang]
|
||||
* Fix exponential expansion in V3Gate (#7550). [Geza Lore, Testorrent USA, Inc.]
|
||||
* Fix internal error on consecutive repetition with N > 256 (#7552) (#7603). [Yilou Wang]
|
||||
* Fix display of %m in non-first argument (#7574).
|
||||
* Fix floating point compile warning on min/max delays.
|
||||
* Fix force of unpacked arrays (#7579) (#7580). [Zubin Jain]
|
||||
* Fix property argument retaining type of the previous variable (#7582). [Jakub Michalski]
|
||||
* Fix NBA to whole arrays (#7583) (#7575). [Geza Lore, Testorrent USA, Inc.]
|
||||
* Fix interface instance name collision (#7591) (#7593). [Stuart Morris]
|
||||
* Fix process comparison compile error with `--public-flat-rw` (#7592).
|
||||
* Fix CPU pinning when no 'core id' present (#7599). [Geza Lore, Testorrent USA, Inc.]
|
||||
* Fix clocking-block sample of unpacked array (#7612) (#7613). [Nikolai Kumar]
|
||||
* Fix type parameters order (#7615). [Kamil Danecki, Antmicro Ltd.]
|
||||
* Fix unique_index method on assoc arrays with values differing from the keys (#7616). [Pawel Klopotek]
|
||||
* Fix wide equality comparison in unpacked structs (#7618). [Geza Lore, Testorrent USA, Inc.]
|
||||
|
||||
|
||||
Verilator 5.048 2026-04-26
|
||||
|
|
|
|||
|
|
@ -66,7 +66,9 @@ module t ( /*AUTOARG*/);
|
|||
// Keyed pattern where values are indexed from another array param
|
||||
// the key determines position, not the source array's element count.
|
||||
localparam logic [31:0] KEYED_FROM_ARR[3] = '{
|
||||
0: BASE_ADDRS[2], 1: BASE_ADDRS[0], 2: BASE_ADDRS[1]
|
||||
0: BASE_ADDRS[2],
|
||||
1: BASE_ADDRS[0],
|
||||
2: BASE_ADDRS[1]
|
||||
};
|
||||
|
||||
// Package-scoped array as a positional pattern member
|
||||
|
|
|
|||
|
|
@ -36,7 +36,8 @@ module t (
|
|||
crc <= {crc[62:0], crc[63] ^ crc[2] ^ crc[0]};
|
||||
if (cyc == 0) begin
|
||||
crc <= 64'h5aef0c8d_d70a4497;
|
||||
end else if (cyc == 99) begin
|
||||
end
|
||||
else if (cyc == 99) begin
|
||||
`checkh(crc, 64'hc77bb9b3784ea091);
|
||||
`checkd(count_fail_257, 0);
|
||||
// Questa: 31 -- pre-existing ~26.5% NFA reject gap on |-> ##1 [*N]
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
%Error: t/t_assert_consec_rep_unroll_limit_bad.v:12:37: Concurrent assertion repetition count 25700000 exceeds --assert-unroll-limit (1024); raise '--assert-unroll-limit' to compile
|
||||
%Error: t/t_assert_consec_rep_unroll_limit_bad.v:14:37: Concurrent assertion repetition count 25700000 exceeds --assert-unroll-limit (1024); raise '--assert-unroll-limit' to compile
|
||||
: ... note: In instance 't'
|
||||
12 | assert property (@(posedge clk) a [* 25700000] |-> b);
|
||||
14 | assert property (@(posedge clk) a [* 25700000] |-> b);
|
||||
| ^~
|
||||
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
||||
%Error: Exiting due to
|
||||
|
|
|
|||
|
|
@ -4,7 +4,9 @@
|
|||
// SPDX-FileCopyrightText: 2026 PlanV GmbH
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
module t (input clk);
|
||||
module t (
|
||||
input clk
|
||||
);
|
||||
logic a, b;
|
||||
|
||||
// Repetition count exceeds --assert-unroll-limit; pre-fix this hung the
|
||||
|
|
|
|||
|
|
@ -18,16 +18,24 @@
|
|||
// verilog_format: on
|
||||
|
||||
package pkg;
|
||||
class rand_master #(parameter int AW = 32, parameter int DW = 32);
|
||||
class rand_master #(
|
||||
parameter int AW = 32,
|
||||
parameter int DW = 32
|
||||
);
|
||||
typedef logic [AW-1:0] addr_t;
|
||||
endclass
|
||||
endpackage
|
||||
|
||||
module t #(parameter int unused = 1);
|
||||
module t #(
|
||||
parameter int unused = 1
|
||||
);
|
||||
// AW and DW are both overridden to non-default values so that a regression
|
||||
// in parameter propagation through the typedef chain shows up as a width
|
||||
// mismatch instead of silently succeeding.
|
||||
typedef pkg::rand_master #(.AW(17), .DW(64)) rand_master_t;
|
||||
typedef pkg::rand_master#(
|
||||
.AW(17),
|
||||
.DW(64)
|
||||
) rand_master_t;
|
||||
typedef rand_master_t::addr_t addr_t;
|
||||
initial begin
|
||||
static addr_t a = '0;
|
||||
|
|
|
|||
|
|
@ -25,12 +25,16 @@
|
|||
|
||||
package pkg;
|
||||
|
||||
class beat #(parameter int IW = 8);
|
||||
class beat #(
|
||||
parameter int IW = 8
|
||||
);
|
||||
logic [IW-1:0] id;
|
||||
endclass
|
||||
|
||||
class driver #(parameter int IW = 8);
|
||||
typedef beat #(.IW(IW)) beat_t;
|
||||
class driver #(
|
||||
parameter int IW = 8
|
||||
);
|
||||
typedef beat#(.IW(IW)) beat_t;
|
||||
// Verify the beat handed to us has the IW we were specialized for.
|
||||
task send(input beat_t b);
|
||||
`checkd($bits(b.id), IW);
|
||||
|
|
@ -38,12 +42,16 @@ package pkg;
|
|||
endtask
|
||||
endclass
|
||||
|
||||
class master #(parameter int IW = 8);
|
||||
typedef driver #(.IW(IW)) driver_t;
|
||||
typedef driver_t::beat_t beat_t;
|
||||
class master #(
|
||||
parameter int IW = 8
|
||||
);
|
||||
typedef driver#(.IW(IW)) driver_t;
|
||||
typedef driver_t::beat_t beat_t;
|
||||
|
||||
driver_t drv;
|
||||
function new(driver_t d); drv = d; endfunction
|
||||
function new(driver_t d);
|
||||
drv = d;
|
||||
endfunction
|
||||
|
||||
task run();
|
||||
automatic beat_t b = new;
|
||||
|
|
@ -64,8 +72,12 @@ module t;
|
|||
pkg::driver #(.IW(5)) da;
|
||||
pkg::driver #(.IW(6)) db;
|
||||
initial begin
|
||||
da = new; ma = new(da); ma.run();
|
||||
db = new; mb = new(db); mb.run();
|
||||
da = new;
|
||||
ma = new(da);
|
||||
ma.run();
|
||||
db = new;
|
||||
mb = new(db);
|
||||
mb.run();
|
||||
$write("*-* All Finished *-*\n");
|
||||
$finish;
|
||||
end
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ module t;
|
|||
data[1] = 2'd2;
|
||||
@(posedge clk);
|
||||
@(posedge clk);
|
||||
if (snap[0] !== 2'd1 || snap[1] !==2'd2) $stop;
|
||||
if (snap[0] !== 2'd1 || snap[1] !== 2'd2) $stop;
|
||||
$write("*-* All Finished *-*\n");
|
||||
$finish;
|
||||
end
|
||||
|
|
|
|||
|
|
@ -16,34 +16,34 @@ interface avst_interface;
|
|||
logic ready;
|
||||
logic valid;
|
||||
|
||||
modport sink_mp (output ready, input valid);
|
||||
modport sink_mp(output ready, input valid);
|
||||
endinterface
|
||||
|
||||
module child (
|
||||
output logic ready_out
|
||||
output logic ready_out
|
||||
);
|
||||
avst_interface my_avst_if();
|
||||
avst_interface my_avst_if ();
|
||||
|
||||
assign ready_out = my_avst_if.ready;
|
||||
assign my_avst_if.ready = 1'b1; // drives child.my_avst_if.ready only
|
||||
assign my_avst_if.ready = 1'b1; // drives child.my_avst_if.ready only
|
||||
endmodule
|
||||
|
||||
module wrapper (
|
||||
avst_interface.sink_mp my_avst_if
|
||||
avst_interface.sink_mp my_avst_if
|
||||
);
|
||||
child child_inst (
|
||||
.ready_out (my_avst_if.ready) // sole driver of outer my_avst_if.ready
|
||||
.ready_out(my_avst_if.ready) // sole driver of outer my_avst_if.ready
|
||||
);
|
||||
endmodule
|
||||
|
||||
module top (
|
||||
input logic in_valid,
|
||||
output logic out_ready
|
||||
input logic in_valid,
|
||||
output logic out_ready
|
||||
);
|
||||
avst_interface my_avst_if();
|
||||
avst_interface my_avst_if ();
|
||||
|
||||
assign my_avst_if.valid = in_valid;
|
||||
assign out_ready = my_avst_if.ready;
|
||||
|
||||
wrapper wrapper_inst (.my_avst_if (my_avst_if));
|
||||
wrapper wrapper_inst (.my_avst_if(my_avst_if));
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -12,9 +12,9 @@
|
|||
class obj;
|
||||
endclass
|
||||
class TypeParams #(
|
||||
type T1 = obj,
|
||||
type T2 = obj,
|
||||
type T3 = obj
|
||||
type T1 = obj,
|
||||
type T2 = obj,
|
||||
type T3 = obj
|
||||
);
|
||||
T1 t1;
|
||||
T2 t2;
|
||||
|
|
@ -22,48 +22,48 @@ class TypeParams #(
|
|||
endclass
|
||||
|
||||
class ValueParams #(
|
||||
int P1 = 1,
|
||||
int P2 = 1,
|
||||
int P3 = 1
|
||||
int P1 = 1,
|
||||
int P2 = 1,
|
||||
int P3 = 1
|
||||
);
|
||||
logic[P1:0] x1;
|
||||
logic[P2:0] x2;
|
||||
logic[P3:0] x3;
|
||||
logic [P1:0] x1;
|
||||
logic [P2:0] x2;
|
||||
logic [P3:0] x3;
|
||||
endclass
|
||||
|
||||
class Mixed #(
|
||||
type T1 = obj,
|
||||
int P1 = 1,
|
||||
type T2 = obj,
|
||||
int P2 = 1,
|
||||
type T3 = obj,
|
||||
int P3 = 1
|
||||
type T1 = obj,
|
||||
int P1 = 1,
|
||||
type T2 = obj,
|
||||
int P2 = 1,
|
||||
type T3 = obj,
|
||||
int P3 = 1
|
||||
);
|
||||
T1 t1;
|
||||
T2 t2;
|
||||
T3 t3;
|
||||
logic[P1:0] x1;
|
||||
logic[P2:0] x2;
|
||||
logic[P3:0] x3;
|
||||
logic [P1:0] x1;
|
||||
logic [P2:0] x2;
|
||||
logic [P3:0] x3;
|
||||
endclass
|
||||
|
||||
module t;
|
||||
TypeParams #(
|
||||
.T2 (int),
|
||||
.T3 (logic)
|
||||
.T2(int),
|
||||
.T3(logic)
|
||||
) t;
|
||||
obj o;
|
||||
|
||||
ValueParams #(
|
||||
.P3 (5),
|
||||
.P2 (2)
|
||||
.P3(5),
|
||||
.P2(2)
|
||||
) v;
|
||||
|
||||
Mixed #(
|
||||
.P3 (3),
|
||||
.T1 (logic),
|
||||
.T3 (int),
|
||||
.P2 (7)
|
||||
.P3(3),
|
||||
.T1(logic),
|
||||
.T3(int),
|
||||
.P2(7)
|
||||
) m;
|
||||
initial begin
|
||||
o = new;
|
||||
|
|
|
|||
|
|
@ -94,15 +94,15 @@ module t (
|
|||
end
|
||||
else if (cyc == 99) begin
|
||||
`checkh(crc, 64'hc77bb9b3784ea091);
|
||||
`checkd(count_fail1, 29); // Questa: 14
|
||||
`checkd(count_fail2, 65); // Questa: 64
|
||||
`checkd(count_fail3, 29); // Questa: 14
|
||||
`checkd(count_fail4, 65); // Questa: 64
|
||||
`checkd(count_fail5, 46); // Questa: 31
|
||||
`checkd(count_fail6, 65); // Questa: 59
|
||||
`checkd(count_fail7, 29); // Questa: 14
|
||||
`checkd(count_fail8, 14); // Questa: 10
|
||||
`checkd(count_fail9, 29); // Questa: 14
|
||||
`checkd(count_fail1, 29); // Questa: 14
|
||||
`checkd(count_fail2, 65); // Questa: 64
|
||||
`checkd(count_fail3, 29); // Questa: 14
|
||||
`checkd(count_fail4, 65); // Questa: 64
|
||||
`checkd(count_fail5, 46); // Questa: 31
|
||||
`checkd(count_fail6, 65); // Questa: 59
|
||||
`checkd(count_fail7, 29); // Questa: 14
|
||||
`checkd(count_fail8, 14); // Questa: 10
|
||||
`checkd(count_fail9, 29); // Questa: 14
|
||||
`checkd(count_fail10, 29); // Questa: 14
|
||||
$write("*-* All Finished *-*\n");
|
||||
$finish;
|
||||
|
|
|
|||
|
|
@ -11,24 +11,28 @@ module t;
|
|||
initial begin
|
||||
fork
|
||||
begin
|
||||
#1 sem.get(4);
|
||||
#1;
|
||||
sem.get(4);
|
||||
$write("[%0t] A got 4\n", $time);
|
||||
#1
|
||||
#1;
|
||||
sem.put(3);
|
||||
$write("[%0t] A put 3\n", $time);
|
||||
end
|
||||
begin
|
||||
#2 sem.get(3);
|
||||
#2;
|
||||
sem.get(3);
|
||||
$write("[%0t] B got 3\n", $time);
|
||||
end
|
||||
begin
|
||||
#3 sem.get(1);
|
||||
#3;
|
||||
sem.get(1);
|
||||
$write("[%0t] C got 1\n", $time);
|
||||
sem.put(1);
|
||||
$write("[%0t] C put 1\n", $time);
|
||||
end
|
||||
begin
|
||||
#4 sem.put(2);
|
||||
#4;
|
||||
sem.put(2);
|
||||
$write("[%0t] D put 2\n", $time);
|
||||
end
|
||||
join
|
||||
|
|
|
|||
Loading…
Reference in New Issue