From bdeee35669847ae28433320114b422cb8d2cb0e0 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Wed, 26 Apr 2017 18:34:01 -0400 Subject: [PATCH] Add warning on mis-sized literal, bug1156. --- Changes | 1 + src/V3Number.cpp | 18 ++++++++++++------ src/V3Number.h | 2 +- test_regress/t/t_lint_literal_bad.pl | 20 ++++++++++++++++++++ test_regress/t/t_lint_literal_bad.v | 11 +++++++++++ 5 files changed, 45 insertions(+), 7 deletions(-) create mode 100755 test_regress/t/t_lint_literal_bad.pl create mode 100644 test_regress/t/t_lint_literal_bad.v diff --git a/Changes b/Changes index 354eb4e0d..006d757f3 100644 --- a/Changes +++ b/Changes @@ -5,6 +5,7 @@ The contributors that suggested a given feature are shown in []. Thanks! * Verilator 3.903 devel +**** Add warning on mis-sized literal, bug1156. [Todd Strader] * Verilator 3.902 2017-04-02 diff --git a/src/V3Number.cpp b/src/V3Number.cpp index 70ea2315f..f86597a27 100644 --- a/src/V3Number.cpp +++ b/src/V3Number.cpp @@ -48,7 +48,7 @@ V3Number::V3Number(VerilogStringLiteral, FileLine* fileline, const string& str) } } } - opCleanThis(); + opCleanThis(true); } V3Number::V3Number (FileLine* fileline, const char* sourcep) { @@ -254,7 +254,7 @@ V3Number::V3Number (FileLine* fileline, const char* sourcep) { setBit(obit, bitIs(obit-1)); obit++; } - opCleanThis(); + opCleanThis(true); //printf("Dump \"%s\" CP \"%s\" B '%c' %d W %d\n", sourcep, value_startp, base, width(), m_value[0]); } @@ -1587,10 +1587,16 @@ V3Number& V3Number::opClean (const V3Number& lhs, uint32_t bits) { return opSel(lhs, bits-1, 0); } -void V3Number::opCleanThis() { - // Clean in place number - m_value[words()-1] &= hiWordMask(); - m_valueX[words()-1] &= hiWordMask(); +void V3Number::opCleanThis(bool warnOnTruncation) { + // Clean MSB of number + uint32_t newValueMsb = m_value[words()-1] & hiWordMask(); + uint32_t newValueXMsb = m_valueX[words()-1] & hiWordMask(); + if (warnOnTruncation && (newValueMsb != m_value[words()-1] || newValueXMsb != m_valueX[words()-1])) { + // Displaying in decimal avoids hiWordMask truncation + m_fileline->v3warn(WIDTH,"Value too large for "<skip("Verilator only test") if !$Self->{vlt}; + +compile ( + fails=>1, + expect=> +'%Warning-WIDTH: t/t_lint_literal_bad.v:9: Value too large for 8 bit number: 256 +', + ); + +ok(1); +1; diff --git a/test_regress/t/t_lint_literal_bad.v b/test_regress/t/t_lint_literal_bad.v new file mode 100644 index 000000000..521bd10ef --- /dev/null +++ b/test_regress/t/t_lint_literal_bad.v @@ -0,0 +1,11 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed into the Public Domain, for any use, +// without warranty, 2017 by Todd Strader. + +module t ( +); + + localparam the_localparam = 8'd256; + +endmodule