verilator/test_regress/t/t_assign_automatic_bad.v

64 lines
2.3 KiB
Systemverilog
Raw Normal View History

// 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
// 6.21 Scope and lifetime
// Automatic variables and elements of dynamically sized array variables shall
// not be written with nonblocking, continuous, or procedural continuous
// assignments. Non-static class properties shall not be written with continuous
// or procedural continuous assignments.
class Cls;
static int s_ok1;
static int s_ok2;
static int s_dyn[];
int m_bad1;
int m_bad2;
endclass
module t(clk);
input clk;
Cls c;
int bad_dyn5[];
int bad_dyn6[];
int empty_dyn[];
int empty_queue[$];
int empty_assoc[int];
int bad_queue[$];
int bad_assoc[int];
Cls clist[1];
assign bad_dyn5[0] = empty_dyn; // <--- Error: continuous dynarray element
assign bad_dyn5 = empty_dyn; // <--- OK: continuous dynarray assignment, not to its element
assign c.m_bad1 = 2; // <--- Error: continuous class non-static
// Only one simulator fails on this, probably not legal
// assign Cls::s_ok1 = 2; // OK: continuous class static
logic ok_7;
task mt(output o); // OK: function output
o <= 1;
endtask
always @(posedge clk) begin
bad_dyn6[0] <= 2; // <--- Error: nonblocking dynarray element
bad_dyn6 <= empty_dyn; // <--- OK: nonblocking dynarray assignment, not to its element
bad_queue[0] <= 2; // Error: nonblocking queue element assignment
bad_queue <= empty_queue; // OK: nonblocking assignment to queue itself, not to its element
bad_assoc[0] <= 2; // Error: nonblocking associative array element assignment
bad_assoc <= empty_assoc; // OK: nonblocking assignment to associative array itself, not to its element
Cls::s_ok2 <= 2; // OK: nonblocking class static
c.m_bad2 <= 2; // <--- Error: nonblocking class automatic
Cls::s_dyn <= 2; // OK: nonblocking class static dynarray assignment, not to its element
Cls::s_dyn[0] <= 2; // Error: nonblocking class static dynarray element
clist[bad_dyn6[0]++].s_dyn <= '1; // OK: direct nonblocking assignment to dynamically-sized array
clist[bad_dyn6[0]++].s_dyn[0] <= '1; // Error: nonblocking assigment to dynamically-sized array element
mt(ok_7);
$stop;
end
endmodule