Fix vlSelf error on fork repeats (#5927).
This commit is contained in:
parent
e7adae6f81
commit
c3d1c3b952
1
Changes
1
Changes
|
|
@ -83,6 +83,7 @@ Verilator 5.035 devel
|
||||||
* Fix LATCH warning for automatic variables (#5918). [Yutetsu TAKATSUKASA]
|
* Fix LATCH warning for automatic variables (#5918). [Yutetsu TAKATSUKASA]
|
||||||
* Fix %% on elaboration severity tasks (#5922). [Ethan Sifferman]
|
* Fix %% on elaboration severity tasks (#5922). [Ethan Sifferman]
|
||||||
* Fix port default values with `--coverage-line` creating `0=0` (#5920). [Drew Ranck]
|
* Fix port default values with `--coverage-line` creating `0=0` (#5920). [Drew Ranck]
|
||||||
|
* Fix vlSelf error on fork repeats (#5927). [Drew Ranck]
|
||||||
* Fix missing C++ regeneration when Verilog files are updated (#5934). [Zhouyi Shen]
|
* Fix missing C++ regeneration when Verilog files are updated (#5934). [Zhouyi Shen]
|
||||||
* Fix stream expressions (#5938). [Ryszard Rozak, Antmicro Ltd.]
|
* Fix stream expressions (#5938). [Ryszard Rozak, Antmicro Ltd.]
|
||||||
* Fix packed selection using over 32-bit index (#5957).
|
* Fix packed selection using over 32-bit index (#5957).
|
||||||
|
|
|
||||||
|
|
@ -610,9 +610,10 @@ void EmitCFunc::emitSetVarConstant(const string& assignString, AstConst* constp)
|
||||||
void EmitCFunc::emitVarReset(AstVar* varp, bool constructing) {
|
void EmitCFunc::emitVarReset(AstVar* varp, bool constructing) {
|
||||||
// 'constructing' indicates that the object was just constructed, so no need to clear it also
|
// 'constructing' indicates that the object was just constructed, so no need to clear it also
|
||||||
AstNodeDType* const dtypep = varp->dtypep()->skipRefp();
|
AstNodeDType* const dtypep = varp->dtypep()->skipRefp();
|
||||||
|
const string vlSelf = VSelfPointerText::replaceThis(m_useSelfForThis, "this->");
|
||||||
const string varNameProtected = (VN_IS(m_modp, Class) || varp->isFuncLocal())
|
const string varNameProtected = (VN_IS(m_modp, Class) || varp->isFuncLocal())
|
||||||
? varp->nameProtect()
|
? varp->nameProtect()
|
||||||
: "vlSelf->" + varp->nameProtect();
|
: vlSelf + varp->nameProtect();
|
||||||
if (varp->isIO() && m_modp->isTop() && optSystemC()) {
|
if (varp->isIO() && m_modp->isTop() && optSystemC()) {
|
||||||
// System C top I/O doesn't need loading, as the lower level subinst code does it.}
|
// System C top I/O doesn't need loading, as the lower level subinst code does it.}
|
||||||
} else if (varp->isParam()) {
|
} else if (varp->isParam()) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2025 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=["--binary"])
|
||||||
|
|
||||||
|
test.execute()
|
||||||
|
|
||||||
|
test.passes()
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||||
|
// any use, without warranty, 2025 by Wilson Snyder.
|
||||||
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
|
module t;
|
||||||
|
|
||||||
|
logic clock;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
clock = '0;
|
||||||
|
forever begin
|
||||||
|
clock = #5ns ~clock;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
task static has_fork_task(input [31:0] address);
|
||||||
|
@(posedge clock);
|
||||||
|
fork
|
||||||
|
begin
|
||||||
|
repeat($urandom_range(9)) @(posedge clock);
|
||||||
|
end
|
||||||
|
join
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// Intentionally created a recursive task chain (that should be unreachable anyway):
|
||||||
|
// call_task()
|
||||||
|
// --> (unreachable) --> calls local_sub_task()
|
||||||
|
// --> calls call_task()
|
||||||
|
// --> ...
|
||||||
|
// --> (reachable) --> calls has_fork_task() done.
|
||||||
|
|
||||||
|
task static call_task(input [31:0] address);
|
||||||
|
if (1) begin
|
||||||
|
// Workaround1: Comment this out to pass the compile.
|
||||||
|
has_fork_task(address);
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
// Workaround2: Comment this out to pass the compile
|
||||||
|
// Should be unreachable anyway.
|
||||||
|
local_sub_task(.address(address));
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task static local_sub_task(input [31:0] address);
|
||||||
|
logic [63:0] req;
|
||||||
|
logic [39:0] resp;
|
||||||
|
req = '0;
|
||||||
|
call_task(.address(32'h0000_1234));
|
||||||
|
resp = '0;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
initial begin : main
|
||||||
|
#100ns;
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
Loading…
Reference in New Issue