From d218f1746c7a6d07c8b0eb03fad130330f32851e Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Wed, 29 Jan 2020 21:16:44 -0500 Subject: [PATCH] Add warning on genvar in normal for loop, #2143. --- Changes | 2 ++ src/V3Unroll.cpp | 6 ++++++ test_regress/t/t_genvar_for_bad.out | 5 +++++ test_regress/t/t_genvar_for_bad.pl | 18 ++++++++++++++++++ test_regress/t/t_genvar_for_bad.v | 27 +++++++++++++++++++++++++++ 5 files changed, 58 insertions(+) create mode 100644 test_regress/t/t_genvar_for_bad.out create mode 100755 test_regress/t/t_genvar_for_bad.pl create mode 100644 test_regress/t/t_genvar_for_bad.v diff --git a/Changes b/Changes index cc2be8634..b62f845a3 100644 --- a/Changes +++ b/Changes @@ -31,6 +31,8 @@ The contributors that suggested a given feature are shown in []. Thanks! **** Add parameter to set maximum signal width, #2082. [Øyvind Harboe] +**** Add warning on genvar in normal for loop, #2143. [yurivict] + **** Fix VPI scope naming for public modules. [Nandu Raj] **** Fix FST tracing of enums inside structs. [fsiegle] diff --git a/src/V3Unroll.cpp b/src/V3Unroll.cpp index aa8b7e3f7..8888aed55 100644 --- a/src/V3Unroll.cpp +++ b/src/V3Unroll.cpp @@ -124,6 +124,12 @@ private: if (VN_IS(nodep, GenFor) && !m_forVarp->isGenVar()) { nodep->v3error("Non-genvar used in generate for: "<prettyNameQ()<isGenVar()) { + nodep->v3error("Genvar not legal in non-generate for (IEEE 2017 27.4): " + << m_forVarp->prettyNameQ() << endl + << nodep->warnMore() + << "... Suggest move for loop upwards to generate-level scope."); + } if (m_generate) V3Const::constifyParamsEdit(initAssp->rhsp()); // rhsp may change // This check shouldn't be needed when using V3Simulate diff --git a/test_regress/t/t_genvar_for_bad.out b/test_regress/t/t_genvar_for_bad.out new file mode 100644 index 000000000..bc1e2f800 --- /dev/null +++ b/test_regress/t/t_genvar_for_bad.out @@ -0,0 +1,5 @@ +%Error: t/t_genvar_for_bad.v:22: Genvar not legal in non-generate for (IEEE 2017 27.4): 't.i' + : ... Suggest move for loop upwards to generate-level scope. + for (i=0; i 1); + +lint( + fails => 1, + expect_filename => $Self->{golden_filename}, + ); + +ok(1); +1; diff --git a/test_regress/t/t_genvar_for_bad.v b/test_regress/t/t_genvar_for_bad.v new file mode 100644 index 000000000..846878bba --- /dev/null +++ b/test_regress/t/t_genvar_for_bad.v @@ -0,0 +1,27 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed into the Public Domain, for any use, +// without warranty, 2020 by Wilson Snyder. + +module t (/*AUTOARG*/ + // Outputs + ov, + // Inputs + clk, iv + ); + + parameter N = 4; + + input clk; + input [63:0] iv[N-1:0]; + output logic [63:0] ov[N-1:0]; + + genvar i; + generate + always @(posedge clk) begin + for (i=0; i