Improve reusability of --dump-inputs output (#6812)
This commit is contained in:
parent
25f72e4305
commit
47a4f7fb9b
|
|
@ -285,6 +285,15 @@ or "`ifdef`"'s may break other tools.
|
||||||
(if appropriate :vlopt:`--coverage` flags are passed) after being
|
(if appropriate :vlopt:`--coverage` flags are passed) after being
|
||||||
disabled earlier with :option:`/*verilator&32;coverage_off*/`.
|
disabled earlier with :option:`/*verilator&32;coverage_off*/`.
|
||||||
|
|
||||||
|
.. option:: /*verilator&32;fargs <arguments>*/
|
||||||
|
|
||||||
|
For Verilator developers only. When a source file containing :option:`fargs`
|
||||||
|
metacomments is passed to Verilator on the command line via the :option:`-f`
|
||||||
|
or :option:`-F` option, the provided arguments will be added as if specified
|
||||||
|
on the command line. The source file is not preprocessed before parsing for
|
||||||
|
arguments, and all :option:`fargs` comment will take effect, even if placed
|
||||||
|
undef an inactive :option:`\`ifdef`.
|
||||||
|
|
||||||
.. option:: /*verilator&32;forceable*/
|
.. option:: /*verilator&32;forceable*/
|
||||||
|
|
||||||
Specifies that the signal (net or variable) should be made forceable from
|
Specifies that the signal (net or variable) should be made forceable from
|
||||||
|
|
|
||||||
|
|
@ -1769,10 +1769,20 @@ placed into the obj_dir, .vpp, .tree and .dot files.
|
||||||
Verilator creates a *{mod_prefix}*\ __inputs.vpp file containing all the
|
Verilator creates a *{mod_prefix}*\ __inputs.vpp file containing all the
|
||||||
files that were read, filtered by preprocessing. This file can be fed back
|
files that were read, filtered by preprocessing. This file can be fed back
|
||||||
into Verilator, replacing on the command line all of the previous input
|
into Verilator, replacing on the command line all of the previous input
|
||||||
files, to enable simplification of test cases.
|
files, to enable simplification of test cases. This file also contains most
|
||||||
|
command line arguments Verilator was invoked as `// verilator fargs``
|
||||||
|
metacomments, with and can be parsed by ``-f`. So to reproduce the run that
|
||||||
|
created the file, run:
|
||||||
|
|
||||||
|
::
|
||||||
|
verilator -f <prefix>__inputs.vpp <prefix>__inputs.vpp
|
||||||
|
|
||||||
|
The first `-f <prefix>__inputs.vpp` reads the command line arguments from
|
||||||
|
the file. The second `<prefix>__inputsl.vpp` adds the file as a normal
|
||||||
|
source file.
|
||||||
|
|
||||||
Verilator also creates .vpp files for each individual file passed on the
|
Verilator also creates .vpp files for each individual file passed on the
|
||||||
command line.
|
command line. These do not contain the command line argument metacomments.
|
||||||
|
|
||||||
|
|
||||||
.dot Output
|
.dot Output
|
||||||
|
|
|
||||||
|
|
@ -39,14 +39,23 @@ struct V3OptionParser::Impl final {
|
||||||
// Base class of actual action classes
|
// Base class of actual action classes
|
||||||
template <en N_Mode, bool N_Allow_Partial_Match = false>
|
template <en N_Mode, bool N_Allow_Partial_Match = false>
|
||||||
class ActionBase VL_NOT_FINAL : public ActionIfs {
|
class ActionBase VL_NOT_FINAL : public ActionIfs {
|
||||||
|
bool m_notForRerun = false; // This option is not needed for rerun with --dump-inputs
|
||||||
bool m_undocumented = false; // This option is not documented
|
bool m_undocumented = false; // This option is not documented
|
||||||
public:
|
public:
|
||||||
bool isValueNeeded() const override final { return N_Mode == en::VALUE; }
|
bool isValueNeeded() const override final { return N_Mode == en::VALUE; }
|
||||||
bool isFOnOffAllowed() const override final { return N_Mode == en::FONOFF; }
|
bool isFOnOffAllowed() const override final { return N_Mode == en::FONOFF; }
|
||||||
|
bool isNotForRerun() const override final { return m_notForRerun; }
|
||||||
bool isOnOffAllowed() const override final { return N_Mode == en::ONOFF; }
|
bool isOnOffAllowed() const override final { return N_Mode == en::ONOFF; }
|
||||||
bool isPartialMatchAllowed() const override final { return N_Allow_Partial_Match; }
|
bool isPartialMatchAllowed() const override final { return N_Allow_Partial_Match; }
|
||||||
bool isUndocumented() const override { return m_undocumented; }
|
bool isUndocumented() const override { return m_undocumented; }
|
||||||
void undocumented() override { m_undocumented = true; }
|
ActionIfs& undocumented() override {
|
||||||
|
m_undocumented = true;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
ActionIfs& notForRerun() override {
|
||||||
|
m_notForRerun = true;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Actual action classes
|
// Actual action classes
|
||||||
|
|
@ -195,20 +204,20 @@ bool V3OptionParser::hasPrefixNo(const char* strp) {
|
||||||
return VString::startsWith(strp, "-no");
|
return VString::startsWith(strp, "-no");
|
||||||
}
|
}
|
||||||
|
|
||||||
int V3OptionParser::parse(int idx, int argc, char* argv[]) {
|
std::pair<int, bool> V3OptionParser::parse(int idx, int argc, char* argv[]) {
|
||||||
UASSERT(m_pimpl->m_isFinalized, "finalize() must be called before parse()");
|
UASSERT(m_pimpl->m_isFinalized, "finalize() must be called before parse()");
|
||||||
const char* optp = argv[idx];
|
const char* optp = argv[idx];
|
||||||
if (optp[0] == '-' && optp[1] == '-') ++optp;
|
if (optp[0] == '-' && optp[1] == '-') ++optp;
|
||||||
ActionIfs* const actp = find(optp);
|
ActionIfs* const actp = find(optp);
|
||||||
if (!actp) return 0;
|
if (!actp) return {0, false};
|
||||||
if (!actp->isValueNeeded()) {
|
if (!actp->isValueNeeded()) {
|
||||||
actp->exec(optp, nullptr);
|
actp->exec(optp, nullptr);
|
||||||
return 1;
|
return {1, !actp->isNotForRerun()};
|
||||||
} else if (idx + 1 < argc) {
|
} else if (idx + 1 < argc) {
|
||||||
actp->exec(optp, argv[idx + 1]);
|
actp->exec(optp, argv[idx + 1]);
|
||||||
return 2;
|
return {2, !actp->isNotForRerun()};
|
||||||
}
|
}
|
||||||
return 0;
|
return {0, false};
|
||||||
}
|
}
|
||||||
|
|
||||||
string V3OptionParser::getSuggestion(const char* str) const {
|
string V3OptionParser::getSuggestion(const char* str) const {
|
||||||
|
|
|
||||||
|
|
@ -74,8 +74,9 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// METHODS
|
// METHODS
|
||||||
// Returns how many args are consumed. 0 means not match
|
// Returns how many args are consumed. 0 means not match.
|
||||||
int parse(int idx, int argc, char* argv[]) VL_MT_DISABLED;
|
// Also bool, true iff option is needed for rerun with --dump-inputs
|
||||||
|
std::pair<int, bool> parse(int idx, int argc, char* argv[]) VL_MT_DISABLED;
|
||||||
// Find the most similar option
|
// Find the most similar option
|
||||||
string getSuggestion(const char* str) const VL_MT_DISABLED;
|
string getSuggestion(const char* str) const VL_MT_DISABLED;
|
||||||
void addSuggestionCandidate(const string& s) VL_MT_DISABLED;
|
void addSuggestionCandidate(const string& s) VL_MT_DISABLED;
|
||||||
|
|
@ -93,13 +94,16 @@ public:
|
||||||
virtual ~ActionIfs() = default;
|
virtual ~ActionIfs() = default;
|
||||||
virtual bool isValueNeeded() const = 0; // Need val of "-opt val"
|
virtual bool isValueNeeded() const = 0; // Need val of "-opt val"
|
||||||
virtual bool isFOnOffAllowed() const = 0; // true if "-fno-opt" is allowed
|
virtual bool isFOnOffAllowed() const = 0; // true if "-fno-opt" is allowed
|
||||||
|
virtual bool isNotForRerun() const = 0; // Will not be dumped with --dump-inputs
|
||||||
virtual bool isOnOffAllowed() const = 0; // true if "-no-opt" is allowed
|
virtual bool isOnOffAllowed() const = 0; // true if "-no-opt" is allowed
|
||||||
virtual bool isPartialMatchAllowed() const = 0; // true if "-Wno-" matches "-Wno-fatal"
|
virtual bool isPartialMatchAllowed() const = 0; // true if "-Wno-" matches "-Wno-fatal"
|
||||||
virtual bool isUndocumented() const = 0; // Will not be suggested in typo
|
virtual bool isUndocumented() const = 0; // Will not be suggested in typo
|
||||||
// Set a value or run callback
|
// Set a value or run callback
|
||||||
virtual void exec(const char* optp, const char* valp) = 0;
|
virtual void exec(const char* optp, const char* valp) = 0;
|
||||||
// Mark this option undocumented. (Exclude this option from suggestion list).
|
// Mark this option undocumented. (Exclude this option from suggestion list).
|
||||||
virtual void undocumented() = 0;
|
virtual ActionIfs& undocumented() = 0;
|
||||||
|
// Mark this as not needed for rerunning with preprocessed sources
|
||||||
|
virtual ActionIfs& notForRerun() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// A helper class to register options
|
// A helper class to register options
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,8 @@ public:
|
||||||
|
|
||||||
// STATE
|
// STATE
|
||||||
std::list<string> m_lineArgs; // List of command line argument encountered
|
std::list<string> m_lineArgs; // List of command line argument encountered
|
||||||
std::list<string> m_allArgs; // List of every argument encountered
|
// List of arguments encounterd, and a bool in needed for rerunning --dump-inputs
|
||||||
|
std::list<std::pair<std::list<std::string>, bool>> m_allArgs;
|
||||||
std::list<string> m_incDirUsers; // Include directories (ordered)
|
std::list<string> m_incDirUsers; // Include directories (ordered)
|
||||||
std::set<string> m_incDirUserSet; // Include directories (for removing duplicates)
|
std::set<string> m_incDirUserSet; // Include directories (for removing duplicates)
|
||||||
std::list<string> m_incDirFallbacks; // Include directories (ordered)
|
std::list<string> m_incDirFallbacks; // Include directories (ordered)
|
||||||
|
|
@ -398,13 +399,31 @@ void V3Options::addForceInc(const string& filename) { m_forceIncs.push_back(file
|
||||||
|
|
||||||
void V3Options::addLineArg(const string& arg) { m_impp->m_lineArgs.push_back(arg); }
|
void V3Options::addLineArg(const string& arg) { m_impp->m_lineArgs.push_back(arg); }
|
||||||
|
|
||||||
void V3Options::addArg(const string& arg) { m_impp->m_allArgs.push_back(arg); }
|
void V3Options::addArg(char** argv, size_t count, bool isForRerun) {
|
||||||
|
m_impp->m_allArgs.emplace_back();
|
||||||
|
std::pair<std::list<std::string>, bool>& pair = m_impp->m_allArgs.back();
|
||||||
|
pair.second = isForRerun;
|
||||||
|
for (size_t n = 0; n < count; ++n) pair.first.emplace_back(argv[n]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void V3Options::addArg(const std::string& arg, bool isForRerun) {
|
||||||
|
m_impp->m_allArgs.emplace_back();
|
||||||
|
std::pair<std::list<std::string>, bool>& pair = m_impp->m_allArgs.back();
|
||||||
|
pair.second = isForRerun;
|
||||||
|
pair.first.emplace_back(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::list<std::pair<std::list<std::string>, bool>>& V3Options::allArgs() const {
|
||||||
|
return m_impp->m_allArgs;
|
||||||
|
}
|
||||||
|
|
||||||
string V3Options::allArgsString() const VL_MT_SAFE {
|
string V3Options::allArgsString() const VL_MT_SAFE {
|
||||||
string result;
|
string result;
|
||||||
for (const string& i : m_impp->m_allArgs) {
|
for (const auto& pair : m_impp->m_allArgs) {
|
||||||
if (result != "") result += " ";
|
for (const string& arg : pair.first) {
|
||||||
result += i;
|
if (!result.empty()) result += " ";
|
||||||
|
result += arg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -1165,9 +1184,6 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
// Parse parameters
|
// Parse parameters
|
||||||
// Note argc and argv DO NOT INCLUDE the filename in [0]!!!
|
// Note argc and argv DO NOT INCLUDE the filename in [0]!!!
|
||||||
// May be called recursively when there are -f files.
|
// May be called recursively when there are -f files.
|
||||||
for (int i = 0; i < argc; ++i) {
|
|
||||||
addArg(argv[i]); // -f's really should be inserted in the middle, but this is for debug
|
|
||||||
}
|
|
||||||
|
|
||||||
V3OptionParser parser;
|
V3OptionParser parser;
|
||||||
const V3OptionParser::AppendHelper DECL_OPTION{parser};
|
const V3OptionParser::AppendHelper DECL_OPTION{parser};
|
||||||
|
|
@ -1209,8 +1225,9 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
// (If DECL_OPTION is a macro, then lambda would be collapsed into a single line).
|
// (If DECL_OPTION is a macro, then lambda would be collapsed into a single line).
|
||||||
|
|
||||||
// Plus options
|
// Plus options
|
||||||
DECL_OPTION("+define+", CbPartialMatch,
|
DECL_OPTION("+define+", CbPartialMatch, [this](const char* optp) VL_MT_DISABLED {
|
||||||
[this](const char* optp) VL_MT_DISABLED { addDefine(optp, true); });
|
addDefine(optp, true);
|
||||||
|
}).notForRerun();
|
||||||
DECL_OPTION("+incdir+", CbPartialMatch, [this, &optdir](const char* optp) {
|
DECL_OPTION("+incdir+", CbPartialMatch, [this, &optdir](const char* optp) {
|
||||||
string dirs = optp;
|
string dirs = optp;
|
||||||
string::size_type pos;
|
string::size_type pos;
|
||||||
|
|
@ -1219,7 +1236,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
dirs = dirs.substr(pos + 1);
|
dirs = dirs.substr(pos + 1);
|
||||||
}
|
}
|
||||||
addIncDirUser(parseFileArg(optdir, dirs));
|
addIncDirUser(parseFileArg(optdir, dirs));
|
||||||
});
|
}).notForRerun();
|
||||||
DECL_OPTION("+libext+", CbPartialMatch, [this](const char* optp) {
|
DECL_OPTION("+libext+", CbPartialMatch, [this](const char* optp) {
|
||||||
string exts = optp;
|
string exts = optp;
|
||||||
string::size_type pos;
|
string::size_type pos;
|
||||||
|
|
@ -1228,31 +1245,42 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
exts = exts.substr(pos + 1);
|
exts = exts.substr(pos + 1);
|
||||||
}
|
}
|
||||||
addLibExtV(exts);
|
addLibExtV(exts);
|
||||||
});
|
}).notForRerun();
|
||||||
DECL_OPTION("+librescan", CbCall, []() {}); // NOP
|
DECL_OPTION("+librescan", CbCall, []() {}).notForRerun(); // NOP
|
||||||
DECL_OPTION("+notimingchecks", CbCall, []() {}); // NOP
|
DECL_OPTION("+notimingchecks", CbCall, []() {}).notForRerun(); // NOP
|
||||||
DECL_OPTION("+systemverilogext+", CbPartialMatch,
|
DECL_OPTION("+systemverilogext+", CbPartialMatch, [this](const char* optp) {
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1800_2017); });
|
addLangExt(optp, V3LangCode::L1800_2017);
|
||||||
DECL_OPTION("+verilog1995ext+", CbPartialMatch,
|
}).notForRerun();
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1364_1995); });
|
DECL_OPTION("+verilog1995ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
DECL_OPTION("+verilog2001ext+", CbPartialMatch,
|
addLangExt(optp, V3LangCode::L1364_1995);
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1364_2001); });
|
}).notForRerun();
|
||||||
DECL_OPTION("+1364-1995ext+", CbPartialMatch,
|
DECL_OPTION("+verilog2001ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1364_1995); });
|
addLangExt(optp, V3LangCode::L1364_2001);
|
||||||
DECL_OPTION("+1364-2001ext+", CbPartialMatch,
|
}).notForRerun();
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1364_2001); });
|
DECL_OPTION("+1364-1995ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
DECL_OPTION("+1364-2005ext+", CbPartialMatch,
|
addLangExt(optp, V3LangCode::L1364_1995);
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1364_2005); });
|
}).notForRerun();
|
||||||
DECL_OPTION("+1800-2005ext+", CbPartialMatch,
|
DECL_OPTION("+1364-2001ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1800_2005); });
|
addLangExt(optp, V3LangCode::L1364_2001);
|
||||||
DECL_OPTION("+1800-2009ext+", CbPartialMatch,
|
}).notForRerun();
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1800_2009); });
|
DECL_OPTION("+1364-2005ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
DECL_OPTION("+1800-2012ext+", CbPartialMatch,
|
addLangExt(optp, V3LangCode::L1364_2005);
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1800_2012); });
|
}).notForRerun();
|
||||||
DECL_OPTION("+1800-2017ext+", CbPartialMatch,
|
DECL_OPTION("+1800-2005ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1800_2017); });
|
addLangExt(optp, V3LangCode::L1800_2005);
|
||||||
DECL_OPTION("+1800-2023ext+", CbPartialMatch,
|
}).notForRerun();
|
||||||
[this](const char* optp) { addLangExt(optp, V3LangCode::L1800_2023); });
|
DECL_OPTION("+1800-2009ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
|
addLangExt(optp, V3LangCode::L1800_2009);
|
||||||
|
}).notForRerun();
|
||||||
|
DECL_OPTION("+1800-2012ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
|
addLangExt(optp, V3LangCode::L1800_2012);
|
||||||
|
}).notForRerun();
|
||||||
|
DECL_OPTION("+1800-2017ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
|
addLangExt(optp, V3LangCode::L1800_2017);
|
||||||
|
}).notForRerun();
|
||||||
|
DECL_OPTION("+1800-2023ext+", CbPartialMatch, [this](const char* optp) {
|
||||||
|
addLangExt(optp, V3LangCode::L1800_2023);
|
||||||
|
}).notForRerun();
|
||||||
|
|
||||||
// Minus options
|
// Minus options
|
||||||
DECL_OPTION("-aslr", CbOnOff, [](bool) {}); // Processed only in bin/verilator shell
|
DECL_OPTION("-aslr", CbOnOff, [](bool) {}); // Processed only in bin/verilator shell
|
||||||
|
|
@ -1333,10 +1361,11 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
DECL_OPTION("-coverage-underscore", OnOff, &m_coverageUnderscore);
|
DECL_OPTION("-coverage-underscore", OnOff, &m_coverageUnderscore);
|
||||||
DECL_OPTION("-coverage-user", OnOff, &m_coverageUser);
|
DECL_OPTION("-coverage-user", OnOff, &m_coverageUser);
|
||||||
|
|
||||||
DECL_OPTION("-D", CbPartialMatch,
|
DECL_OPTION("-D", CbPartialMatch, [this](const char* valp) VL_MT_DISABLED {
|
||||||
[this](const char* valp) VL_MT_DISABLED { addDefine(valp, false); });
|
addDefine(valp, false);
|
||||||
DECL_OPTION("-debug", CbCall, [this]() { setDebugMode(3); });
|
}).notForRerun();
|
||||||
DECL_OPTION("-debugi", CbVal, [this](int v) { setDebugMode(v); });
|
DECL_OPTION("-debug", CbCall, [this]() { setDebugMode(3); }).notForRerun();
|
||||||
|
DECL_OPTION("-debugi", CbVal, [this](int v) { setDebugMode(v); }).notForRerun();
|
||||||
DECL_OPTION("-debugi-", CbPartialMatchVal, [this](const char* optp, const char* valp) {
|
DECL_OPTION("-debugi-", CbPartialMatchVal, [this](const char* optp, const char* valp) {
|
||||||
m_debugLevel[optp] = std::atoi(valp);
|
m_debugLevel[optp] = std::atoi(valp);
|
||||||
});
|
});
|
||||||
|
|
@ -1370,11 +1399,15 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
m_diagnosticsSarif = true;
|
m_diagnosticsSarif = true;
|
||||||
});
|
});
|
||||||
DECL_OPTION("-dpi-hdr-only", OnOff, &m_dpiHdrOnly);
|
DECL_OPTION("-dpi-hdr-only", OnOff, &m_dpiHdrOnly);
|
||||||
DECL_OPTION("-dump-", CbPartialMatch, [this](const char* optp) { m_dumpLevel[optp] = 3; });
|
DECL_OPTION("-dump-", CbPartialMatch, [this](const char* optp) {
|
||||||
DECL_OPTION("-no-dump-", CbPartialMatch, [this](const char* optp) { m_dumpLevel[optp] = 0; });
|
m_dumpLevel[optp] = 3;
|
||||||
|
}).notForRerun();
|
||||||
|
DECL_OPTION("-no-dump-", CbPartialMatch, [this](const char* optp) {
|
||||||
|
m_dumpLevel[optp] = 0;
|
||||||
|
}).notForRerun();
|
||||||
DECL_OPTION("-dumpi-", CbPartialMatchVal, [this](const char* optp, const char* valp) {
|
DECL_OPTION("-dumpi-", CbPartialMatchVal, [this](const char* optp, const char* valp) {
|
||||||
m_dumpLevel[optp] = std::atoi(valp);
|
m_dumpLevel[optp] = std::atoi(valp);
|
||||||
});
|
}).notForRerun();
|
||||||
|
|
||||||
DECL_OPTION("-E", CbOnOff, [this](bool flag) {
|
DECL_OPTION("-E", CbOnOff, [this](bool flag) {
|
||||||
if (flag) {
|
if (flag) {
|
||||||
|
|
@ -1391,12 +1424,12 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
|
|
||||||
DECL_OPTION("-F", CbVal, [this, fl, &optdir](const char* valp) VL_MT_DISABLED {
|
DECL_OPTION("-F", CbVal, [this, fl, &optdir](const char* valp) VL_MT_DISABLED {
|
||||||
parseOptsFile(fl, parseFileArg(optdir, valp), true);
|
parseOptsFile(fl, parseFileArg(optdir, valp), true);
|
||||||
});
|
}).notForRerun();
|
||||||
DECL_OPTION("-FI", CbVal,
|
DECL_OPTION("-FI", CbVal,
|
||||||
[this, &optdir](const char* valp) { addForceInc(parseFileArg(optdir, valp)); });
|
[this, &optdir](const char* valp) { addForceInc(parseFileArg(optdir, valp)); });
|
||||||
DECL_OPTION("-f", CbVal, [this, fl, &optdir](const char* valp) VL_MT_DISABLED {
|
DECL_OPTION("-f", CbVal, [this, fl, &optdir](const char* valp) VL_MT_DISABLED {
|
||||||
parseOptsFile(fl, parseFileArg(optdir, valp), false);
|
parseOptsFile(fl, parseFileArg(optdir, valp), false);
|
||||||
});
|
}).notForRerun();
|
||||||
DECL_OPTION("-flatten", OnOff, &m_flatten);
|
DECL_OPTION("-flatten", OnOff, &m_flatten);
|
||||||
DECL_OPTION("-future0", CbVal, [this](const char* valp) { addFuture0(valp); });
|
DECL_OPTION("-future0", CbVal, [this](const char* valp) { addFuture0(valp); });
|
||||||
DECL_OPTION("-future1", CbVal, [this](const char* valp) { addFuture1(valp); });
|
DECL_OPTION("-future1", CbVal, [this](const char* valp) { addFuture1(valp); });
|
||||||
|
|
@ -1485,8 +1518,9 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
DECL_OPTION("-hierarchical-params-file", CbVal,
|
DECL_OPTION("-hierarchical-params-file", CbVal,
|
||||||
[this](const char* optp) { m_hierParamsFile.push_back({optp, work()}); });
|
[this](const char* optp) { m_hierParamsFile.push_back({optp, work()}); });
|
||||||
|
|
||||||
DECL_OPTION("-I", CbPartialMatch,
|
DECL_OPTION("-I", CbPartialMatch, [this, &optdir](const char* optp) {
|
||||||
[this, &optdir](const char* optp) { addIncDirUser(parseFileArg(optdir, optp)); });
|
addIncDirUser(parseFileArg(optdir, optp));
|
||||||
|
}).notForRerun();
|
||||||
DECL_OPTION("-if-depth", Set, &m_ifDepth);
|
DECL_OPTION("-if-depth", Set, &m_ifDepth);
|
||||||
DECL_OPTION("-ignc", OnOff, &m_ignc).undocumented();
|
DECL_OPTION("-ignc", OnOff, &m_ignc).undocumented();
|
||||||
DECL_OPTION("-inline-mult", Set, &m_inlineMult);
|
DECL_OPTION("-inline-mult", Set, &m_inlineMult);
|
||||||
|
|
@ -1523,8 +1557,8 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
fl->v3error("Unknown language specified: " << valp << spell.bestCandidateMsg(valp));
|
fl->v3error("Unknown language specified: " << valp << spell.bestCandidateMsg(valp));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
DECL_OPTION("-default-language", CbVal, setLang);
|
DECL_OPTION("-default-language", CbVal, setLang).notForRerun();
|
||||||
DECL_OPTION("-language", CbVal, setLang);
|
DECL_OPTION("-language", CbVal, setLang).notForRerun();
|
||||||
DECL_OPTION("-lib-create", CbVal, [this, fl](const char* valp) {
|
DECL_OPTION("-lib-create", CbVal, [this, fl](const char* valp) {
|
||||||
validateIdentifier(fl, valp, "--lib-create");
|
validateIdentifier(fl, valp, "--lib-create");
|
||||||
m_libCreate = valp;
|
m_libCreate = valp;
|
||||||
|
|
@ -1538,7 +1572,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
DECL_OPTION("-Mdir", CbVal, [this](const char* valp) {
|
DECL_OPTION("-Mdir", CbVal, [this](const char* valp) {
|
||||||
m_makeDir = valp;
|
m_makeDir = valp;
|
||||||
addIncDirFallback(m_makeDir); // Need to find generated files there too
|
addIncDirFallback(m_makeDir); // Need to find generated files there too
|
||||||
});
|
}).notForRerun();
|
||||||
DECL_OPTION("-main", OnOff, &m_main);
|
DECL_OPTION("-main", OnOff, &m_main);
|
||||||
DECL_OPTION("-main-top-name", Set, &m_mainTopName);
|
DECL_OPTION("-main-top-name", Set, &m_mainTopName);
|
||||||
DECL_OPTION("-make", CbVal, [this, fl](const char* valp) {
|
DECL_OPTION("-make", CbVal, [this, fl](const char* valp) {
|
||||||
|
|
@ -1943,56 +1977,77 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
|
|
||||||
DECL_OPTION("-y", CbVal, [this, &optdir](const char* valp) {
|
DECL_OPTION("-y", CbVal, [this, &optdir](const char* valp) {
|
||||||
addIncDirUser(parseFileArg(optdir, string{valp}));
|
addIncDirUser(parseFileArg(optdir, string{valp}));
|
||||||
});
|
}).notForRerun();
|
||||||
|
|
||||||
parser.finalize();
|
parser.finalize();
|
||||||
|
|
||||||
|
const std::string cwd = V3Os::filenameRealPath(".");
|
||||||
|
|
||||||
for (int i = 0; i < argc;) {
|
for (int i = 0; i < argc;) {
|
||||||
UINFO(9, " Option: " << argv[i]);
|
UINFO(9, " Option: " << argv[i]);
|
||||||
if (!std::strcmp(argv[i], "-j")
|
|
||||||
|| !std::strcmp(argv[i], "--j")) { // Allow gnu -- switches
|
// Option
|
||||||
++i;
|
if (argv[i][0] == '-' || argv[i][0] == '+') {
|
||||||
int val = 0;
|
const std::string argName = argv[i] + (argv[i][0] == argv[i][1] ? 2 : 1);
|
||||||
if (i < argc && std::isdigit(argv[i][0])) {
|
int consumed = 0;
|
||||||
val = std::atoi(argv[i]); // Can't be negative due to isdigit above
|
bool isForRerun = true;
|
||||||
if (val == 0) val = VlOs::getProcessDefaultParallelism();
|
|
||||||
++i;
|
// Special case for -j which has an optional argument
|
||||||
}
|
if (argv[i][0] == '-' && argName == "j") {
|
||||||
if (m_buildJobs == -1) m_buildJobs = val;
|
consumed = 1;
|
||||||
if (m_verilateJobs == -1) m_verilateJobs = val;
|
int val = 0;
|
||||||
if (m_outputGroups == -1) m_outputGroups = val;
|
if (i + 1 < argc && std::isdigit(argv[i + 1][0])) {
|
||||||
} else if (argv[i][0] == '-' || argv[i][0] == '+') {
|
val = std::atoi(argv[i + 1]); // Can't be negative due to isdigit above
|
||||||
const char* argvNoDashp = (argv[i][1] == '-') ? (argv[i] + 2) : (argv[i] + 1);
|
if (val == 0) val = VlOs::getProcessDefaultParallelism();
|
||||||
if (const int consumed = parser.parse(i, argc, argv)) {
|
consumed = 2;
|
||||||
i += consumed;
|
}
|
||||||
} else if (isFuture0(argvNoDashp)) {
|
if (m_buildJobs == -1) m_buildJobs = val;
|
||||||
++i;
|
if (m_verilateJobs == -1) m_verilateJobs = val;
|
||||||
} else if (isFuture1(argvNoDashp)) {
|
if (m_outputGroups == -1) m_outputGroups = val;
|
||||||
i += 2;
|
|
||||||
} else {
|
} else {
|
||||||
fl->v3fatal("Invalid option: " << argv[i] << parser.getSuggestion(argv[i]));
|
const auto pair = parser.parse(i, argc, argv);
|
||||||
++i; // LCOV_EXCL_LINE
|
consumed = pair.first;
|
||||||
|
isForRerun = pair.second;
|
||||||
|
if (consumed) {
|
||||||
|
// Already processed
|
||||||
|
} else if (isFuture0(argName)) {
|
||||||
|
consumed = 1;
|
||||||
|
} else if (isFuture1(argName)) {
|
||||||
|
consumed = 2;
|
||||||
|
} else {
|
||||||
|
fl->v3fatal("Invalid option: " << argv[i] << parser.getSuggestion(argv[i]));
|
||||||
|
consumed = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
UASSERT(consumed, "Failed to consume argument: " << argv[i]);
|
||||||
// Filename
|
// Record all arguments except for -f and -F (their contents will be recorded instead)
|
||||||
const string filename = parseFileArg(optdir, argv[i]);
|
if (argName != "f" && argName != "F") addArg(argv + i, consumed, isForRerun);
|
||||||
if (suffixed(filename, ".cpp") //
|
i += consumed;
|
||||||
|| suffixed(filename, ".cxx") //
|
continue;
|
||||||
|| suffixed(filename, ".cc") //
|
|
||||||
|| suffixed(filename, ".c") //
|
|
||||||
|| suffixed(filename, ".sp")) {
|
|
||||||
V3Options::addCppFile(filename);
|
|
||||||
} else if (suffixed(filename, ".a") //
|
|
||||||
|| suffixed(filename, ".o") //
|
|
||||||
|| suffixed(filename, ".so")) {
|
|
||||||
V3Options::addLdLibs(filename);
|
|
||||||
} else if (suffixed(filename, ".vlt")) {
|
|
||||||
V3Options::addVltFile(filename, work());
|
|
||||||
} else {
|
|
||||||
V3Options::addVFile(filename, work());
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Filename
|
||||||
|
const std::string filename = parseFileArg(optdir, argv[i]);
|
||||||
|
bool isForRerun = true;
|
||||||
|
if (suffixed(filename, ".cpp") //
|
||||||
|
|| suffixed(filename, ".cxx") //
|
||||||
|
|| suffixed(filename, ".cc") //
|
||||||
|
|| suffixed(filename, ".c") //
|
||||||
|
|| suffixed(filename, ".sp")) {
|
||||||
|
V3Options::addCppFile(filename);
|
||||||
|
} else if (suffixed(filename, ".a") //
|
||||||
|
|| suffixed(filename, ".o") //
|
||||||
|
|| suffixed(filename, ".so")) {
|
||||||
|
V3Options::addLdLibs(filename);
|
||||||
|
} else if (suffixed(filename, ".vlt")) {
|
||||||
|
V3Options::addVltFile(filename, work());
|
||||||
|
isForRerun = false;
|
||||||
|
} else {
|
||||||
|
V3Options::addVFile(filename, work());
|
||||||
|
isForRerun = false;
|
||||||
|
}
|
||||||
|
addArg(filename, isForRerun);
|
||||||
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_debugOptions) {
|
if (m_debugOptions) {
|
||||||
|
|
@ -2013,38 +2068,73 @@ void V3Options::parseOptsFile(FileLine* fl, const string& filename, bool rel) VL
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string whole_file;
|
// If we find any '// verilator fargs' line in the file, we will only use these,
|
||||||
bool inCmt = false;
|
// otherwise we will use the file contents. This enables rerunning the output
|
||||||
while (!ifp->eof()) {
|
// produced by --dump-inptus with:
|
||||||
const string line = V3Os::getline(*ifp);
|
// verilator -f <prefix>__inputs.vpp <prefix>__inputs.vpp
|
||||||
// Strip simple comments
|
bool has_fargs = false;
|
||||||
string oline;
|
std::string whole_file;
|
||||||
// cppcheck-suppress StlMissingComparison
|
|
||||||
char lastch = ' ';
|
// Parses a '// verilator fargs' or '/* verilator fargs */' comment
|
||||||
bool space_begin = true; // At beginning or leading spaces only
|
const auto parse_fargs_cmt = [&](const char* p) -> void {
|
||||||
for (string::const_iterator pos = line.begin(); pos != line.end(); lastch = *pos++) {
|
const bool blockCmt = p[1] == '*';
|
||||||
if (inCmt) {
|
p += 2;
|
||||||
if (*pos == '*' && *(pos + 1) == '/') {
|
while (std::isspace(*p)) ++p;
|
||||||
inCmt = false;
|
if (VString::startsWith(p, "verilator")) {
|
||||||
++pos;
|
p += std::strlen("verilator");
|
||||||
|
if (std::isspace(*p)) {
|
||||||
|
while (std::isspace(*p)) ++p;
|
||||||
|
if (VString::startsWith(p, "fargs")) {
|
||||||
|
p += std::strlen("fargs");
|
||||||
|
if (std::isspace(*p)) {
|
||||||
|
while (std::isspace(*p)) ++p;
|
||||||
|
if (!has_fargs) {
|
||||||
|
has_fargs = true;
|
||||||
|
whole_file.clear();
|
||||||
|
}
|
||||||
|
whole_file += p;
|
||||||
|
if (blockCmt) {
|
||||||
|
const std::string::size_type pos = whole_file.find("*/");
|
||||||
|
if (pos == std::string::npos) {
|
||||||
|
fl->v3fatal("/* verilator fargs */ must be on single line");
|
||||||
|
}
|
||||||
|
whole_file.resize(pos);
|
||||||
|
}
|
||||||
|
whole_file += ' ';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (*pos == '/' && *(pos + 1) == '/'
|
|
||||||
&& (pos == line.begin()
|
|
||||||
|| std::isspace(lastch))) { // But allow /file//path
|
|
||||||
break; // Ignore to EOL
|
|
||||||
} else if (*pos == '#' && space_begin) { // Only # at [spaced] begin of line
|
|
||||||
break; // Ignore to EOL
|
|
||||||
} else if (*pos == '/' && *(pos + 1) == '*') {
|
|
||||||
inCmt = true;
|
|
||||||
space_begin = false;
|
|
||||||
// cppcheck-suppress StlMissingComparison
|
|
||||||
++pos;
|
|
||||||
} else {
|
|
||||||
if (!std::isspace(*pos)) space_begin = false;
|
|
||||||
oline += *pos;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
whole_file += oline + " ";
|
};
|
||||||
|
|
||||||
|
bool inCmt = false;
|
||||||
|
while (!ifp->eof()) {
|
||||||
|
const std::string line = V3Os::getline(*ifp);
|
||||||
|
// Strip simple comments
|
||||||
|
char lastch = ' '; // 'std::isspace(lastch)' is true at the start of the line
|
||||||
|
bool space_begin = true; // At beginning or leading spaces only
|
||||||
|
for (const char* p = line.c_str(); *p; lastch = *p++) {
|
||||||
|
if (inCmt) {
|
||||||
|
if (p[0] == '*' && p[1] == '/') {
|
||||||
|
inCmt = false;
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
} else if (p[0] == '/' && p[1] == '/' && std::isspace(lastch)) { // Allow /file//path
|
||||||
|
parse_fargs_cmt(p);
|
||||||
|
break; // Ignore to EOL
|
||||||
|
} else if (p[0] == '#' && space_begin) { // Only # at [spaced] begin of line
|
||||||
|
break; // Ignore to EOL
|
||||||
|
} else if (p[0] == '/' && p[1] == '*') {
|
||||||
|
parse_fargs_cmt(p);
|
||||||
|
inCmt = true;
|
||||||
|
space_begin = false;
|
||||||
|
++p;
|
||||||
|
} else {
|
||||||
|
if (!std::isspace(*p)) space_begin = false;
|
||||||
|
if (!has_fargs) whole_file += *p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!has_fargs) whole_file += " ";
|
||||||
}
|
}
|
||||||
whole_file += "\n"; // So string match below is simplified
|
whole_file += "\n"; // So string match below is simplified
|
||||||
if (inCmt) fl->v3error("Unterminated /* comment inside -f file.");
|
if (inCmt) fl->v3error("Unterminated /* comment inside -f file.");
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
#include "V3Error.h"
|
#include "V3Error.h"
|
||||||
#include "V3LangCode.h"
|
#include "V3LangCode.h"
|
||||||
|
|
||||||
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
@ -427,8 +428,9 @@ private:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// METHODS
|
// METHODS
|
||||||
|
void addArg(char** argv, size_t count, bool isForRerun);
|
||||||
|
void addArg(const std::string& arg, bool isForRerun);
|
||||||
void addLineArg(const string& arg);
|
void addLineArg(const string& arg);
|
||||||
void addArg(const string& arg);
|
|
||||||
void addDefine(const string& defline, bool allowPlus) VL_MT_DISABLED;
|
void addDefine(const string& defline, bool allowPlus) VL_MT_DISABLED;
|
||||||
void addFuture(const string& flag);
|
void addFuture(const string& flag);
|
||||||
void addFuture0(const string& flag);
|
void addFuture0(const string& flag);
|
||||||
|
|
@ -758,6 +760,7 @@ public:
|
||||||
static string version() VL_PURE;
|
static string version() VL_PURE;
|
||||||
static string argString(int argc, char** argv); ///< Return list of arguments as simple string
|
static string argString(int argc, char** argv); ///< Return list of arguments as simple string
|
||||||
string allArgsString() const VL_MT_SAFE; ///< Return all passed arguments as simple string
|
string allArgsString() const VL_MT_SAFE; ///< Return all passed arguments as simple string
|
||||||
|
const std::list<std::pair<std::list<std::string>, bool>>& allArgs() const;
|
||||||
// Return options for child hierarchical blocks when forTop==false, otherwise returns args for
|
// Return options for child hierarchical blocks when forTop==false, otherwise returns args for
|
||||||
// the top module.
|
// the top module.
|
||||||
string allArgsStringForHierBlock(bool forTop) const;
|
string allArgsStringForHierBlock(bool forTop) const;
|
||||||
|
|
|
||||||
|
|
@ -373,8 +373,29 @@ void V3ParseImp::dumpInputsFile() {
|
||||||
*ofp << "// Blank lines and `line directives have been removed\n";
|
*ofp << "// Blank lines and `line directives have been removed\n";
|
||||||
*ofp << "//\n";
|
*ofp << "//\n";
|
||||||
V3Stats::infoHeader(*ofp, "// ");
|
V3Stats::infoHeader(*ofp, "// ");
|
||||||
|
*ofp << '\n';
|
||||||
|
for (const auto& pair : v3Global.opt.allArgs()) {
|
||||||
|
if (!pair.second) continue;
|
||||||
|
*ofp << "// verilator fargs";
|
||||||
|
for (const std::string& arg : pair.first) {
|
||||||
|
// Apply some quoting, pretty basic, update as needed ...
|
||||||
|
std::string quoted;
|
||||||
|
bool quoteIt = false;
|
||||||
|
for (const char c : arg) {
|
||||||
|
if (c == '"' || c == '\\') {
|
||||||
|
quoteIt = true;
|
||||||
|
quoted += '\\';
|
||||||
|
} else if (std::isspace(c)) {
|
||||||
|
quoteIt = true;
|
||||||
|
}
|
||||||
|
quoted += c;
|
||||||
|
}
|
||||||
|
*ofp << " " << (quoteIt ? '"' + quoted + '"' : arg);
|
||||||
|
}
|
||||||
|
*ofp << "\n";
|
||||||
|
}
|
||||||
|
*ofp << "\n";
|
||||||
}
|
}
|
||||||
*ofp << "\n";
|
|
||||||
preprocDumps(*ofp, true);
|
preprocDumps(*ofp, true);
|
||||||
ofp->close();
|
ofp->close();
|
||||||
VL_DO_DANGLING(delete ofp, ofp);
|
VL_DO_DANGLING(delete ofp, ofp);
|
||||||
|
|
|
||||||
|
|
@ -528,7 +528,11 @@ void V3PreProcImp::comment(const string& text) {
|
||||||
//}
|
//}
|
||||||
// else ignore the comment we don't recognize
|
// else ignore the comment we don't recognize
|
||||||
} // else no assertions
|
} // else no assertions
|
||||||
} else if (vlcomment && !(v3Global.opt.publicOff() && VString::startsWith(cmd, "public"))) {
|
} else if (vlcomment
|
||||||
|
// Drop 'public' if disabled on the command line
|
||||||
|
&& !(v3Global.opt.publicOff() && VString::startsWith(cmd, "public"))
|
||||||
|
// Drop 'fargs', they are handled separately during option parsing
|
||||||
|
&& !VString::startsWith(cmd, "fargs")) {
|
||||||
if (VString::startsWith(cmd, "public_flat_rw")) {
|
if (VString::startsWith(cmd, "public_flat_rw")) {
|
||||||
// "/*verilator public_flat_rw @(foo) */" -> "/*verilator public_flat_rw*/ @(foo)"
|
// "/*verilator public_flat_rw @(foo) */" -> "/*verilator public_flat_rw*/ @(foo)"
|
||||||
string::size_type endOfCmd = std::strlen("public_flat_rw");
|
string::size_type endOfCmd = std::strlen("public_flat_rw");
|
||||||
|
|
@ -1062,12 +1066,12 @@ int V3PreProcImp::getStateToken() {
|
||||||
string rtn;
|
string rtn;
|
||||||
rtn.assign(yyourtext(), yyourleng());
|
rtn.assign(yyourtext(), yyourleng());
|
||||||
comment(rtn);
|
comment(rtn);
|
||||||
// Need to ensure "foo/**/bar" becomes two tokens
|
// Need to ensure "foo/**/bar" becomes two tokens, not one 'foobar'
|
||||||
insertUnreadback(" ");
|
if (m_lineCmt.empty()) insertUnreadback(" ");
|
||||||
} else if (m_lexp->m_keepComments) {
|
} else if (m_lexp->m_keepComments) {
|
||||||
return tok;
|
return tok;
|
||||||
} else {
|
} else {
|
||||||
// Need to ensure "foo/**/bar" becomes two tokens
|
// Need to ensure "foo/**/bar" becomes two tokens, not one 'foobar'
|
||||||
insertUnreadback(" ");
|
insertUnreadback(" ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ void VlcOptions::parseOptsList(int argc, char** argv) {
|
||||||
for (int i = 0; i < argc;) {
|
for (int i = 0; i < argc;) {
|
||||||
UINFO(9, " Option: " << argv[i]);
|
UINFO(9, " Option: " << argv[i]);
|
||||||
if (argv[i][0] == '-') {
|
if (argv[i][0] == '-') {
|
||||||
if (const int consumed = parser.parse(i, argc, argv)) {
|
if (const int consumed = parser.parse(i, argc, argv).first) {
|
||||||
i += consumed;
|
i += consumed;
|
||||||
} else {
|
} else {
|
||||||
v3fatal("Invalid option: " << argv[i] << parser.getSuggestion(argv[i]));
|
v3fatal("Invalid option: " << argv[i] << parser.getSuggestion(argv[i]));
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
%Warning-DEPRECATED: t/t_clk_first_deprecated.v:12:14: sc_clock is ignored
|
%Warning-DEPRECATED: t/t_clk_first_deprecated.v:12:14: sc_clock is ignored
|
||||||
12 | input clk /*verilator sc_clock*/ ;
|
12 | input clk /*verilator sc_clock*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~
|
||||||
... For warning description see https://verilator.org/warn/DEPRECATED?v=latest
|
... For warning description see https://verilator.org/warn/DEPRECATED?v=latest
|
||||||
... Use "/* verilator lint_off DEPRECATED */" and lint_on around source to disable this message.
|
... Use "/* verilator lint_off DEPRECATED */" and lint_on around source to disable this message.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
%Error: t/t_dpi_display_bad.v:17:69: /*verilator sformat*/ can only be applied to last argument of a function
|
%Error: t/t_dpi_display_bad.v:17:68: /*verilator sformat*/ can only be applied to last argument of a function
|
||||||
17 | (input string formatted /*verilator sformat*/ , input string other_bad );
|
17 | (input string formatted /*verilator sformat*/, input string other_bad );
|
||||||
| ^~~~~~~~~
|
| ^~~~~~~~~
|
||||||
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
||||||
%Error: Exiting due to
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
#!/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('vlt')
|
||||||
|
|
||||||
|
|
||||||
|
def fixup(path):
|
||||||
|
lines = []
|
||||||
|
removeBeginKeywords = True
|
||||||
|
with open(path, "r", encoding="utf-8") as rfd:
|
||||||
|
for line in rfd:
|
||||||
|
# Remove "all arguments" line, which can differ
|
||||||
|
if line.startswith("// Arguments:"):
|
||||||
|
lines.append("// Arguments: <REDACTED>")
|
||||||
|
# Remove first `begin_keywords, which will be re-inserted on reruns
|
||||||
|
elif removeBeginKeywords and line.startswith("`begin_keywords"):
|
||||||
|
removeBeginKeywords = False
|
||||||
|
lines.append("// " + line)
|
||||||
|
else:
|
||||||
|
lines.append(line)
|
||||||
|
with open(path, "w", encoding="utf-8") as wfd:
|
||||||
|
for line in lines:
|
||||||
|
wfd.write(line)
|
||||||
|
|
||||||
|
|
||||||
|
obj_dir_1 = test.obj_dir + "/obj_dir_1"
|
||||||
|
test.mkdir_ok(obj_dir_1)
|
||||||
|
dump_1 = obj_dir_1 + "/Vprefix__inputs.vpp"
|
||||||
|
test.run(
|
||||||
|
logfile=obj_dir_1 + "/vlt_compile.log",
|
||||||
|
cmd=[
|
||||||
|
"perl",
|
||||||
|
os.environ["VERILATOR_ROOT"] + "/bin/verilator",
|
||||||
|
"-cc",
|
||||||
|
"-Mdir",
|
||||||
|
obj_dir_1,
|
||||||
|
"--prefix",
|
||||||
|
"Vprefix",
|
||||||
|
"--top-module",
|
||||||
|
"lpm_divide",
|
||||||
|
"--no-timing",
|
||||||
|
"-CFLAGS",
|
||||||
|
"'-O3 --foo'", # Argument with whitespace
|
||||||
|
"-CFLAGS",
|
||||||
|
"'-DDQUOTE=\"'", # Argument with quote
|
||||||
|
"--dump-inputs",
|
||||||
|
"t/t_altera_lpm.v",
|
||||||
|
"t/t_math_cond_huge.v"
|
||||||
|
])
|
||||||
|
fixup(dump_1)
|
||||||
|
|
||||||
|
obj_dir_2 = test.obj_dir + "/obj_dir_2"
|
||||||
|
test.mkdir_ok(obj_dir_2)
|
||||||
|
dump_2 = obj_dir_2 + "/Vprefix__inputs.vpp"
|
||||||
|
test.run(
|
||||||
|
logfile=obj_dir_2 + "/vlt_compile.log",
|
||||||
|
cmd=[
|
||||||
|
"perl",
|
||||||
|
os.environ["VERILATOR_ROOT"] + "/bin/verilator",
|
||||||
|
"-Mdir",
|
||||||
|
obj_dir_2,
|
||||||
|
"-f",
|
||||||
|
dump_1,
|
||||||
|
dump_1,
|
||||||
|
"--debug", # --debug also dumps the same way
|
||||||
|
"--debugi",
|
||||||
|
"1"
|
||||||
|
])
|
||||||
|
fixup(dump_2)
|
||||||
|
|
||||||
|
obj_dir_3 = test.obj_dir + "/obj_dir_3"
|
||||||
|
test.mkdir_ok(obj_dir_3)
|
||||||
|
dump_3 = obj_dir_3 + "/Vprefix__inputs.vpp"
|
||||||
|
test.run(logfile=obj_dir_3 + "/vlt_compile.log",
|
||||||
|
cmd=[
|
||||||
|
"perl",
|
||||||
|
os.environ["VERILATOR_ROOT"] + "/bin/verilator",
|
||||||
|
"-Mdir",
|
||||||
|
obj_dir_3,
|
||||||
|
"-f",
|
||||||
|
dump_2,
|
||||||
|
dump_2,
|
||||||
|
"--dump-inputs",
|
||||||
|
])
|
||||||
|
fixup(dump_3)
|
||||||
|
|
||||||
|
test.files_identical(dump_1, dump_2)
|
||||||
|
test.files_identical(dump_1, dump_3)
|
||||||
|
|
||||||
|
test.passes()
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
%Error: t/t_flag_future.v:8:7: Unknown verilator lint message code: 'FUTURE1', in '/*verilator lint_off FUTURE1*/'
|
%Error: t/t_flag_future.v:8:7: Unknown verilator lint message code: 'FUTURE1', in '/*verilator lint_off FUTURE1*/'
|
||||||
8 | /*verilator lint_off FUTURE1*/
|
8 | /*verilator lint_off FUTURE1*/
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
||||||
%Error-BADVLTPRAGMA: t/t_flag_future.v:11:7: Unknown verilator comment: '/*verilator FUTURE2*/'
|
%Error-BADVLTPRAGMA: t/t_flag_future.v:11:7: Unknown verilator comment: '/*verilator FUTURE2*/'
|
||||||
11 | /*verilator FUTURE2*/
|
11 | /*verilator FUTURE2*/
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~
|
||||||
... For error description see https://verilator.org/warn/BADVLTPRAGMA?v=latest
|
... For error description see https://verilator.org/warn/BADVLTPRAGMA?v=latest
|
||||||
%Error-BADVLTPRAGMA: t/t_flag_future.v:12:7: Unknown verilator comment: '/*verilator FUTURE2 blah blah*/'
|
%Error-BADVLTPRAGMA: t/t_flag_future.v:12:7: Unknown verilator comment: '/*verilator FUTURE2 blah blah*/'
|
||||||
12 | /*verilator FUTURE2 blah blah*/
|
12 | /*verilator FUTURE2 blah blah*/
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
%Error: Exiting due to
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,11 @@
|
||||||
... Use "/* verilator lint_off HIERBLOCK */" and lint_on around source to disable this message.
|
... Use "/* verilator lint_off HIERBLOCK */" and lint_on around source to disable this message.
|
||||||
%Error: t/t_hier_block1_bad.v:45:32: Modport cannot be used at the hierarchical block boundary
|
%Error: t/t_hier_block1_bad.v:45:32: Modport cannot be used at the hierarchical block boundary
|
||||||
: ... note: In instance 't.i_sub1'
|
: ... note: In instance 't.i_sub1'
|
||||||
45 | module sub1 (byte_ifs.receiver in, byte_ifs.sender out); /*verilator hier_block*/
|
45 | module sub1 (byte_ifs.receiver in, byte_ifs.sender out); /*verilator hier_block*/
|
||||||
| ^~
|
| ^~
|
||||||
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
||||||
%Error: t/t_hier_block1_bad.v:45:52: Modport cannot be used at the hierarchical block boundary
|
%Error: t/t_hier_block1_bad.v:45:52: Modport cannot be used at the hierarchical block boundary
|
||||||
: ... note: In instance 't.i_sub1'
|
: ... note: In instance 't.i_sub1'
|
||||||
45 | module sub1 (byte_ifs.receiver in, byte_ifs.sender out); /*verilator hier_block*/
|
45 | module sub1 (byte_ifs.receiver in, byte_ifs.sender out); /*verilator hier_block*/
|
||||||
| ^~~
|
| ^~~
|
||||||
%Error: Exiting due to
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
%Error: t/t_hier_block_threads_bad.v:23:8: Hierarchical blocks cannot be scheduled on more threads than in thread pool, threads = 4 hierarchical block threads = 8
|
%Error: t/t_hier_block_threads_bad.v:23:8: Hierarchical blocks cannot be scheduled on more threads than in thread pool, threads = 4 hierarchical block threads = 8
|
||||||
: ... note: In instance 't.genblk1[1].hierCore'
|
: ... note: In instance 't.genblk1[1].hierCore'
|
||||||
23 | module Core(input clk); /*verilator hier_block*/
|
23 | module Core(input clk); /*verilator hier_block*/
|
||||||
| ^~~~
|
| ^~~~
|
||||||
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
||||||
%Error-UNSUPPORTED: t/t_hier_block_threads_bad.vlt:9:1: Specifying workers for nested hierarchical blocks
|
%Error-UNSUPPORTED: t/t_hier_block_threads_bad.vlt:9:1: Specifying workers for nested hierarchical blocks
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
%Error-BADVLTPRAGMA: t/t_lint_badvltpragma_bad.v:7:3: Unknown verilator comment: '/*verilator lintt_off WIDTH <--- Warning (lint_off misspelled)*/'
|
%Error-BADVLTPRAGMA: t/t_lint_badvltpragma_bad.v:7:3: Unknown verilator comment: '/*verilator lintt_off WIDTH <--- Warning (lint_off misspelled)*/'
|
||||||
7 | /*verilator lintt_off WIDTH <--- Warning (lint_off misspelled)*/
|
7 | /*verilator lintt_off WIDTH <--- Warning (lint_off misspelled)*/
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
... For error description see https://verilator.org/warn/BADVLTPRAGMA?v=latest
|
... For error description see https://verilator.org/warn/BADVLTPRAGMA?v=latest
|
||||||
%Error: Exiting due to
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
%Error: t/t_lint_restore_prag_bad.v:10:4: /*verilator lint_restore*/ without matching save
|
%Error: t/t_lint_restore_prag_bad.v:10:4: /*verilator lint_restore*/ without matching save
|
||||||
10 | /*verilator lint_restore*/
|
10 | /*verilator lint_restore*/
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
||||||
%Error: Exiting due to
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/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('vlt')
|
||||||
|
|
||||||
|
test.compile(verilator_flags2=["-f", test.top_filename], make_main=False)
|
||||||
|
|
||||||
|
test.file_grep(test.stats, r'Tracing, Traced signals\s+(\d+)', 2)
|
||||||
|
|
||||||
|
test.execute()
|
||||||
|
|
||||||
|
test.passes()
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
// 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
|
||||||
|
|
||||||
|
// verilator fargs --binary -Wno-WIDTHEXPAND
|
||||||
|
/* verilator fargs -Wno-WIDTHTRUNC *//* verilator fargs --trace-vcd --stats */
|
||||||
|
|
||||||
|
module top;
|
||||||
|
|
||||||
|
bit clk = 0;
|
||||||
|
always #5 clk = ~clk;
|
||||||
|
reg [3:0] cyc = 0;
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
cyc <= cyc + 10'd1; // Intentional width warning
|
||||||
|
$display("%8t %1d", $time, cyc);
|
||||||
|
if (cyc == 3'd7) begin // Intentional width warning
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
%Error: /* verilator fargs */ must be on single line
|
||||||
|
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
||||||
|
|
@ -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('vlt')
|
||||||
|
|
||||||
|
test.compile(verilator_flags2=["-f", test.top_filename],
|
||||||
|
fails=True,
|
||||||
|
expect_filename=test.golden_filename)
|
||||||
|
|
||||||
|
test.passes()
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
// 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
|
||||||
|
|
||||||
|
/* verilator fargs --cc
|
||||||
|
*/
|
||||||
|
|
||||||
|
module t;
|
||||||
|
endmodule
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
%Warning-ASCRANGE: t/t_metacmt_onoff.v:8:8: Ascending bit range vector: left < right of bit range: [0:1]
|
%Warning-ASCRANGE: t/t_metacmt_onoff.v:8:8: Ascending bit range vector: left < right of bit range: [0:1]
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
8 | reg [0:1] show1; /*verilator lint_off ASCRANGE*/ reg [0:2] ign2; /*verilator lint_on ASCRANGE*/ reg [0:3] show3;
|
8 | reg [0:1] show1; /*verilator lint_off ASCRANGE*/ reg [0:2] ign2; /*verilator lint_on ASCRANGE*/ reg [0:3] show3;
|
||||||
| ^
|
| ^
|
||||||
... For warning description see https://verilator.org/warn/ASCRANGE?v=latest
|
... For warning description see https://verilator.org/warn/ASCRANGE?v=latest
|
||||||
... Use "/* verilator lint_off ASCRANGE */" and lint_on around source to disable this message.
|
... Use "/* verilator lint_off ASCRANGE */" and lint_on around source to disable this message.
|
||||||
%Warning-ASCRANGE: t/t_metacmt_onoff.v:8:107: Ascending bit range vector: left < right of bit range: [0:3]
|
%Warning-ASCRANGE: t/t_metacmt_onoff.v:8:105: Ascending bit range vector: left < right of bit range: [0:3]
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
8 | reg [0:1] show1; /*verilator lint_off ASCRANGE*/ reg [0:2] ign2; /*verilator lint_on ASCRANGE*/ reg [0:3] show3;
|
8 | reg [0:1] show1; /*verilator lint_off ASCRANGE*/ reg [0:2] ign2; /*verilator lint_on ASCRANGE*/ reg [0:3] show3;
|
||||||
| ^
|
| ^
|
||||||
%Error: Exiting due to
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
| ^~~~~~~
|
| ^~~~~~~
|
||||||
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
||||||
%Error: t/t_parse_sync_bad.v:25:14: syntax error, unexpected /*verilator clocker*/, expecting ',' or ';'
|
%Error: t/t_parse_sync_bad.v:25:14: syntax error, unexpected /*verilator clocker*/, expecting ',' or ';'
|
||||||
25 | logic clk /*verilator clocker*/ ;
|
25 | logic clk /*verilator clocker*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~
|
||||||
%Error: t/t_parse_sync_bad.v:29:1: syntax error, unexpected endmodule
|
%Error: t/t_parse_sync_bad.v:29:1: syntax error, unexpected endmodule
|
||||||
29 | endmodule
|
29 | endmodule
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
10 | case (1'b1) // synopsys_full_case
|
10 | case (1'b1) // synopsys_full_case
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~
|
||||||
%Error-BADVLTPRAGMA: t/t_pp_underline_bad.v:8:4: Unknown verilator comment: '/*verilator _no_inline_module*/'
|
%Error-BADVLTPRAGMA: t/t_pp_underline_bad.v:8:4: Unknown verilator comment: '/*verilator _no_inline_module*/'
|
||||||
8 | /*verilator _no_inline_module*/
|
8 | /*verilator _no_inline_module*/
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
... For error description see https://verilator.org/warn/BADVLTPRAGMA?v=latest
|
... For error description see https://verilator.org/warn/BADVLTPRAGMA?v=latest
|
||||||
%Error: Exiting due to
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -63,10 +63,10 @@ At file "t/t_preproc_inc2.vh" line 5
|
||||||
|
|
||||||
|
|
||||||
`line 15 "t/t_preproc.v" 0
|
`line 15 "t/t_preproc.v" 0
|
||||||
/*verilator pass_thru comment*/
|
/*verilator pass_thru comment*/
|
||||||
|
|
||||||
`line 17 "t/t_preproc.v" 0
|
`line 17 "t/t_preproc.v" 0
|
||||||
/*verilator pass_thru_comment2*/
|
/*verilator pass_thru_comment2*/
|
||||||
|
|
||||||
`line 19 "t/t_preproc.v" 0
|
`line 19 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -561,17 +561,17 @@ $display("bits %d %d", $bits(foo), 10);
|
||||||
|
|
||||||
|
|
||||||
`line 366 "t/t_preproc.v" 0
|
`line 366 "t/t_preproc.v" 0
|
||||||
1 /*verilator NOT IN DEFINE*/ (nodef)
|
1 /*verilator NOT IN DEFINE*/ (nodef)
|
||||||
2 /*verilator PART OF DEFINE*/ (hasdef)
|
2 /*verilator PART OF DEFINE*/ (hasdef)
|
||||||
3
|
3
|
||||||
`line 368 "t/t_preproc.v" 0
|
`line 368 "t/t_preproc.v" 0
|
||||||
/*verilator NOT PART
|
/*verilator NOT PART
|
||||||
OF DEFINE*/ (nodef)
|
OF DEFINE*/ (nodef)
|
||||||
`line 369 "t/t_preproc.v" 0
|
`line 369 "t/t_preproc.v" 0
|
||||||
4
|
4
|
||||||
`line 369 "t/t_preproc.v" 0
|
`line 369 "t/t_preproc.v" 0
|
||||||
/*verilator PART
|
/*verilator PART
|
||||||
OF DEFINE*/ (nodef)
|
OF DEFINE*/ (nodef)
|
||||||
`line 370 "t/t_preproc.v" 0
|
`line 370 "t/t_preproc.v" 0
|
||||||
5 also in
|
5 also in
|
||||||
`line 370 "t/t_preproc.v" 0
|
`line 370 "t/t_preproc.v" 0
|
||||||
|
|
|
||||||
|
|
@ -1,39 +1,39 @@
|
||||||
`line 1 "t/t_preproc.v" 1
|
`line 1 "t/t_preproc.v" 1
|
||||||
// DESCRIPTION: Verilator: Verilog Test module
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
// This file ONLY is placed under the Creative Commons Public Domain, for
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||||
// any use, without warranty, 2000-2011 by Wilson Snyder.
|
// any use, without warranty, 2000-2011 by Wilson Snyder.
|
||||||
// SPDX-License-Identifier: CC0-1.0
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
`line 6 "t/t_preproc.v" 0
|
`line 6 "t/t_preproc.v" 0
|
||||||
// This file intentionally includes some tabs
|
// This file intentionally includes some tabs
|
||||||
|
|
||||||
`line 8 "t/t_preproc.v" 0
|
`line 8 "t/t_preproc.v" 0
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
// Includes
|
// Includes
|
||||||
|
|
||||||
`line 10 "t/t_preproc.v" 0
|
`line 10 "t/t_preproc.v" 0
|
||||||
`line 1 "t/t_preproc_inc2.vh" 1
|
`line 1 "t/t_preproc_inc2.vh" 1
|
||||||
// DESCRIPTION: Verilog::Preproc: Example source code
|
// DESCRIPTION: Verilog::Preproc: Example source code
|
||||||
`line 2 "t/t_preproc_inc2.vh" 0
|
`line 2 "t/t_preproc_inc2.vh" 0
|
||||||
// This file ONLY is placed under the Creative Commons Public Domain, for
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||||
// any use, without warranty, 2000-2007 by Wilson Snyder.
|
// any use, without warranty, 2000-2007 by Wilson Snyder.
|
||||||
// SPDX-License-Identifier: CC0-1.0
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
At file "t/t_preproc_inc2.vh" line 5
|
At file "t/t_preproc_inc2.vh" line 5
|
||||||
|
|
||||||
|
|
||||||
`line 7 "t/t_preproc_inc2.vh" 0
|
`line 7 "t/t_preproc_inc2.vh" 0
|
||||||
`line 1 "t/t_preproc_inc3.vh" 1
|
`line 1 "t/t_preproc_inc3.vh" 1
|
||||||
// DESCRIPTION: Verilog::Preproc: Example source code
|
// DESCRIPTION: Verilog::Preproc: Example source code
|
||||||
`line 2 "t/t_preproc_inc3.vh" 0
|
`line 2 "t/t_preproc_inc3.vh" 0
|
||||||
// This file ONLY is placed under the Creative Commons Public Domain, for
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||||
// any use, without warranty, 2000-2007 by Wilson Snyder.
|
// any use, without warranty, 2000-2007 by Wilson Snyder.
|
||||||
// SPDX-License-Identifier: CC0-1.0
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
`line 6 "t/t_preproc_inc3.vh" 0
|
`line 6 "t/t_preproc_inc3.vh" 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// FOO
|
// FOO
|
||||||
At file "t/t_preproc_inc3.vh" line 10
|
At file "t/t_preproc_inc3.vh" line 10
|
||||||
`line 12 "inc3_a_filename_from_line_directive_with_LINE" 0
|
`line 12 "inc3_a_filename_from_line_directive_with_LINE" 0
|
||||||
At file "inc3_a_filename_from_line_directive_with_LINE" line 12
|
At file "inc3_a_filename_from_line_directive_with_LINE" line 12
|
||||||
|
|
@ -43,7 +43,7 @@ At file "t/t_preproc_inc2.vh" line 5
|
||||||
|
|
||||||
`line 103 "inc3_a_filename_from_line_directive" 0
|
`line 103 "inc3_a_filename_from_line_directive" 0
|
||||||
|
|
||||||
// guard
|
// guard
|
||||||
|
|
||||||
`line 106 "inc3_a_filename_from_line_directive" 0
|
`line 106 "inc3_a_filename_from_line_directive" 0
|
||||||
|
|
||||||
|
|
@ -59,23 +59,23 @@ At file "t/t_preproc_inc2.vh" line 5
|
||||||
|
|
||||||
|
|
||||||
`line 12 "t/t_preproc.v" 0
|
`line 12 "t/t_preproc.v" 0
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
// Comments
|
// Comments
|
||||||
|
|
||||||
`line 15 "t/t_preproc.v" 0
|
`line 15 "t/t_preproc.v" 0
|
||||||
/* verilator pass_thru comment */
|
/* verilator pass_thru comment */
|
||||||
|
|
||||||
`line 17 "t/t_preproc.v" 0
|
`line 17 "t/t_preproc.v" 0
|
||||||
// verilator pass_thru_comment2
|
// verilator pass_thru_comment2
|
||||||
|
|
||||||
`line 19 "t/t_preproc.v" 0
|
`line 19 "t/t_preproc.v" 0
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
// Defines
|
// Defines
|
||||||
|
|
||||||
`line 22 "t/t_preproc.v" 0
|
`line 22 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
||||||
// DEF_A0 set by command line
|
// DEF_A0 set by command line
|
||||||
wire [3:0] q = {
|
wire [3:0] q = {
|
||||||
1'b1 ,
|
1'b1 ,
|
||||||
1'b0 ,
|
1'b0 ,
|
||||||
|
|
@ -89,8 +89,8 @@ text.
|
||||||
`line 34 "t/t_preproc.v" 0
|
`line 34 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
||||||
foo /*this */ bar /* this too */
|
foo /*this */ bar /* this too */
|
||||||
foobar2 // but not
|
foobar2 // but not
|
||||||
|
|
||||||
`line 39 "t/t_preproc.v" 0
|
`line 39 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -104,7 +104,7 @@ foobar2 // but not
|
||||||
|
|
||||||
|
|
||||||
`line 48 "t/t_preproc.v" 0
|
`line 48 "t/t_preproc.v" 0
|
||||||
/*******COMMENT*****/
|
/*******COMMENT*****/
|
||||||
first part
|
first part
|
||||||
`line 49 "t/t_preproc.v" 0
|
`line 49 "t/t_preproc.v" 0
|
||||||
second part
|
second part
|
||||||
|
|
@ -120,7 +120,7 @@ first part
|
||||||
Line_Preproc_Check 51
|
Line_Preproc_Check 51
|
||||||
|
|
||||||
`line 53 "t/t_preproc.v" 0
|
`line 53 "t/t_preproc.v" 0
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
`line 55 "t/t_preproc.v" 0
|
`line 55 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -148,7 +148,7 @@ firstline comma","line LLZZ firstline comma","line
|
||||||
|
|
||||||
`line 74 "t/t_preproc.v" 0
|
`line 74 "t/t_preproc.v" 0
|
||||||
|
|
||||||
x y LLZZ "a" y // IEEE 1800-2023 clarified that "a" not to substitute
|
x y LLZZ "a" y // IEEE 1800-2023 clarified that "a" not to substitute
|
||||||
|
|
||||||
`line 77 "t/t_preproc.v" 0
|
`line 77 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -177,12 +177,12 @@ arg suffix_after_space
|
||||||
$c("Zap(\"","bug2","\");");;
|
$c("Zap(\"","bug2","\");");;
|
||||||
|
|
||||||
`line 94 "t/t_preproc.v" 0
|
`line 94 "t/t_preproc.v" 0
|
||||||
/* Define inside comment: `DEEPER and `WITHTICK */
|
/* Define inside comment: `DEEPER and `WITHTICK */
|
||||||
// More commentary: `zap(bug1); `zap("bug2");
|
// More commentary: `zap(bug1); `zap("bug2");
|
||||||
|
|
||||||
`line 97 "t/t_preproc.v" 0
|
`line 97 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// display passthru
|
// display passthru
|
||||||
|
|
||||||
`line 100 "t/t_preproc.v" 0
|
`line 100 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -192,7 +192,7 @@ arg suffix_after_space
|
||||||
|
|
||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
//$display(`msg( \`, \`)); // Illegal
|
//$display(`msg( \`, \`)); // Illegal
|
||||||
$display("pre thrupre thrumid thrupost post: \"right side\"");
|
$display("pre thrupre thrumid thrupost post: \"right side\"");
|
||||||
$display("left side: \"right side\"");
|
$display("left side: \"right side\"");
|
||||||
$display("left side: \"right side\"");
|
$display("left side: \"right side\"");
|
||||||
|
|
@ -200,26 +200,26 @@ arg suffix_after_space
|
||||||
$display("na: \"right_side\"");
|
$display("na: \"right_side\"");
|
||||||
$display("prep ( midp1 left_side midp2 ( outp ) ): \"right_side\"");
|
$display("prep ( midp1 left_side midp2 ( outp ) ): \"right_side\"");
|
||||||
$display("na: \"nana\"");
|
$display("na: \"nana\"");
|
||||||
$display("left_side right_side // Doesn't expand: \"left_side right_side // Doesn't expand\""); // Results vary between simulators
|
$display("left_side right_side // Doesn't expand: \"left_side right_side // Doesn't expand\""); // Results vary between simulators
|
||||||
$display(": \"\""); // Empty
|
$display(": \"\""); // Empty
|
||||||
$display("left side: \"right side\"");
|
$display("left side: \"right side\"");
|
||||||
$display("left side: \"right side\"");
|
$display("left side: \"right side\"");
|
||||||
$display("standalone");
|
$display("standalone");
|
||||||
|
|
||||||
`line 121 "t/t_preproc.v" 0
|
`line 121 "t/t_preproc.v" 0
|
||||||
// Unspecified when the stringification has multiple lines
|
// Unspecified when the stringification has multiple lines
|
||||||
|
|
||||||
|
|
||||||
$display("twoline: \"first second\"");
|
$display("twoline: \"first second\"");
|
||||||
//$display(`msg(left side, \ right side \ )); // Not sure \{space} is legal.
|
//$display(`msg(left side, \ right side \ )); // Not sure \{space} is legal.
|
||||||
$write("*-* All Finished *-*\n");
|
$write("*-* All Finished *-*\n");
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
`line 131 "t/t_preproc.v" 0
|
`line 131 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// rt.cpan.org bug34429
|
// rt.cpan.org bug34429
|
||||||
|
|
||||||
`line 134 "t/t_preproc.v" 0
|
`line 134 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -235,7 +235,7 @@ wire tmp_d1 = d1;
|
||||||
`line 140 "t/t_preproc.v" 0
|
`line 140 "t/t_preproc.v" 0
|
||||||
wire tmp_o1 = tmp_d1 + 1;
|
wire tmp_o1 = tmp_d1 + 1;
|
||||||
`line 140 "t/t_preproc.v" 0
|
`line 140 "t/t_preproc.v" 0
|
||||||
assign o1 = tmp_o1 ; // expansion is OK
|
assign o1 = tmp_o1 ; // expansion is OK
|
||||||
endmodule
|
endmodule
|
||||||
module add2 ( input wire d2, output wire o2);
|
module add2 ( input wire d2, output wire o2);
|
||||||
|
|
||||||
|
|
@ -244,7 +244,7 @@ wire tmp_d2 = d2;
|
||||||
`line 143 "t/t_preproc.v" 0
|
`line 143 "t/t_preproc.v" 0
|
||||||
wire tmp_o2 = tmp_d2 + 1;
|
wire tmp_o2 = tmp_d2 + 1;
|
||||||
`line 143 "t/t_preproc.v" 0
|
`line 143 "t/t_preproc.v" 0
|
||||||
assign o2 = tmp_o2 ; // expansion is bad
|
assign o2 = tmp_o2 ; // expansion is bad
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
`line 146 "t/t_preproc.v" 0
|
`line 146 "t/t_preproc.v" 0
|
||||||
|
|
@ -255,7 +255,7 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
`line 152 "t/t_preproc.v" 0
|
`line 152 "t/t_preproc.v" 0
|
||||||
// parameterized macro with arguments that are macros
|
// parameterized macro with arguments that are macros
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -269,11 +269,11 @@ endmodule
|
||||||
`line 157 "t/t_preproc.v" 0
|
`line 157 "t/t_preproc.v" 0
|
||||||
psl cover { ~m5k.f .ctl._ctl_mvldx_m1.d[i] & m5k.f .ctl._ctl_mvldx_m1.q[i] & !m5k.f .ctl._ctl_mvldx_m1.cond & ((m5k.f .ctl.alive & m5k.f .ctl.alive_m1))} report "fondNoFall: m5kc_fcl._ctl_mvldx_m1";
|
psl cover { ~m5k.f .ctl._ctl_mvldx_m1.d[i] & m5k.f .ctl._ctl_mvldx_m1.q[i] & !m5k.f .ctl._ctl_mvldx_m1.cond & ((m5k.f .ctl.alive & m5k.f .ctl.alive_m1))} report "fondNoFall: m5kc_fcl._ctl_mvldx_m1";
|
||||||
`line 157 "t/t_preproc.v" 0
|
`line 157 "t/t_preproc.v" 0
|
||||||
end endgenerate // ignorecmt
|
end endgenerate // ignorecmt
|
||||||
|
|
||||||
`line 159 "t/t_preproc.v" 0
|
`line 159 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Quotes are legal in protected blocks. Grr.
|
// Quotes are legal in protected blocks. Grr.
|
||||||
module prot();
|
module prot();
|
||||||
`protected
|
`protected
|
||||||
I!#r#e6<_Q{{E2+]I3<[3s)1@D|'E''i!O?]jD>Jo_![Cl)
|
I!#r#e6<_Q{{E2+]I3<[3s)1@D|'E''i!O?]jD>Jo_![Cl)
|
||||||
|
|
@ -281,11 +281,11 @@ module prot();
|
||||||
`line 165 "t/t_preproc.v" 0
|
`line 165 "t/t_preproc.v" 0
|
||||||
`endprotected
|
`endprotected
|
||||||
endmodule
|
endmodule
|
||||||
//"
|
//"
|
||||||
|
|
||||||
`line 169 "t/t_preproc.v" 0
|
`line 169 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Check IEEE 1800-2017 `pragma protect encrypted modules
|
// Check IEEE 1800-2017 `pragma protect encrypted modules
|
||||||
module t_lint_pragma_protected;
|
module t_lint_pragma_protected;
|
||||||
|
|
||||||
`line 173 "t/t_preproc.v" 0
|
`line 173 "t/t_preproc.v" 0
|
||||||
|
|
@ -337,7 +337,7 @@ ZCBXb3JrIGFzIG==
|
||||||
`pragma protect end_protected
|
`pragma protect end_protected
|
||||||
|
|
||||||
`line 216 "t/t_preproc.v" 0
|
`line 216 "t/t_preproc.v" 0
|
||||||
// encoding envelope
|
// encoding envelope
|
||||||
`pragma protect
|
`pragma protect
|
||||||
`pragma protect end
|
`pragma protect end
|
||||||
|
|
||||||
|
|
@ -345,8 +345,8 @@ ZCBXb3JrIGFzIG==
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
`line 222 "t/t_preproc.v" 0
|
`line 222 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// macro call with define that has comma
|
// macro call with define that has comma
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -361,17 +361,17 @@ begin addr <= ({regs[6], regs[7]} + 1); rd <= 1; end
|
||||||
begin addr <= ({regs[6], regs[7]}); wdata <= (rdata); wr <= 1; end more
|
begin addr <= ({regs[6], regs[7]}); wdata <= (rdata); wr <= 1; end more
|
||||||
|
|
||||||
`line 236 "t/t_preproc.v" 0
|
`line 236 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// include of parameterized file
|
// include of parameterized file
|
||||||
|
|
||||||
|
|
||||||
`line 239 "t/t_preproc.v" 0
|
`line 239 "t/t_preproc.v" 0
|
||||||
`line 1 "t/t_preproc_inc4.vh" 1
|
`line 1 "t/t_preproc_inc4.vh" 1
|
||||||
// DESCRIPTION: Verilog::Preproc: Example source code
|
// DESCRIPTION: Verilog::Preproc: Example source code
|
||||||
`line 2 "t/t_preproc_inc4.vh" 0
|
`line 2 "t/t_preproc_inc4.vh" 0
|
||||||
// This file ONLY is placed under the Creative Commons Public Domain, for
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||||
// any use, without warranty, 2000-2011 by Wilson Snyder.
|
// any use, without warranty, 2000-2011 by Wilson Snyder.
|
||||||
// SPDX-License-Identifier: CC0-1.0
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
`line 6 "t/t_preproc_inc4.vh" 0
|
`line 6 "t/t_preproc_inc4.vh" 0
|
||||||
|
|
||||||
|
|
@ -392,8 +392,8 @@ begin addr <= ({regs[6], regs[7]}); wdata <= (rdata); wr <= 1; end more
|
||||||
|
|
||||||
|
|
||||||
`line 249 "t/t_preproc.v" 0
|
`line 249 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// macro call with , in {}
|
// macro call with , in {}
|
||||||
|
|
||||||
`line 252 "t/t_preproc.v" 0
|
`line 252 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -403,8 +403,8 @@ $blah(this.logfile,vec[1,2,3]);
|
||||||
$blah(this.logfile,{blah.name(), " is not foo"});
|
$blah(this.logfile,{blah.name(), " is not foo"});
|
||||||
|
|
||||||
`line 258 "t/t_preproc.v" 0
|
`line 258 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// pragma/default net type
|
// pragma/default net type
|
||||||
|
|
||||||
`line 261 "t/t_preproc.v" 0
|
`line 261 "t/t_preproc.v" 0
|
||||||
`pragma foo = 1
|
`pragma foo = 1
|
||||||
|
|
@ -412,8 +412,8 @@ $blah(this.logfile,{blah.name(), " is not foo"});
|
||||||
`default_nettype uwire
|
`default_nettype uwire
|
||||||
|
|
||||||
`line 265 "t/t_preproc.v" 0
|
`line 265 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Ifdef
|
// Ifdef
|
||||||
|
|
||||||
`line 268 "t/t_preproc.v" 0
|
`line 268 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -424,11 +424,11 @@ $blah(this.logfile,{blah.name(), " is not foo"});
|
||||||
Line_Preproc_Check 272
|
Line_Preproc_Check 272
|
||||||
|
|
||||||
`line 274 "t/t_preproc.v" 0
|
`line 274 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// bug84
|
// bug84
|
||||||
|
|
||||||
`line 277 "t/t_preproc.v" 0
|
`line 277 "t/t_preproc.v" 0
|
||||||
// Hello, comments MIGHT not be legal /*more,,)cmts*/ // But newlines ARE legal... who speced THAT?
|
// Hello, comments MIGHT not be legal/*more,,)cmts*/// But newlines ARE legal... who speced THAT?
|
||||||
|
|
||||||
|
|
||||||
(p,q)
|
(p,q)
|
||||||
|
|
@ -436,25 +436,25 @@ Line_Preproc_Check 272
|
||||||
|
|
||||||
|
|
||||||
`line 284 "t/t_preproc.v" 0
|
`line 284 "t/t_preproc.v" 0
|
||||||
(//Here x,y //Too)
|
(//Here x,y //Too)
|
||||||
Line_Preproc_Check 285
|
Line_Preproc_Check 285
|
||||||
|
|
||||||
`line 287 "t/t_preproc.v" 0
|
`line 287 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// defines split arguments
|
// defines split arguments
|
||||||
|
|
||||||
`line 290 "t/t_preproc.v" 0
|
`line 290 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
beginend // 2001 spec doesn't require two tokens, so "beginend" ok
|
beginend // 2001 spec doesn't require two tokens, so "beginend" ok
|
||||||
beginend // 2001 spec doesn't require two tokens, so "beginend" ok
|
beginend // 2001 spec doesn't require two tokens, so "beginend" ok
|
||||||
"beginend" // No space "beginend"
|
"beginend" // No space "beginend"
|
||||||
|
|
||||||
`line 298 "t/t_preproc.v" 0
|
`line 298 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// bug106
|
// bug106
|
||||||
|
|
||||||
|
|
||||||
`\esc`def
|
`\esc`def
|
||||||
|
|
@ -463,8 +463,8 @@ beginend // 2001 spec doesn't require two tokens, so "beginend" ok
|
||||||
Not a \`define
|
Not a \`define
|
||||||
|
|
||||||
`line 306 "t/t_preproc.v" 0
|
`line 306 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// misparsed comma in submacro
|
// misparsed comma in submacro
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -472,14 +472,14 @@ Not a \`define
|
||||||
x,y)--bee submacro has comma paren
|
x,y)--bee submacro has comma paren
|
||||||
|
|
||||||
`line 314 "t/t_preproc.v" 0
|
`line 314 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// bug191
|
// bug191
|
||||||
|
|
||||||
$display("bits %d %d", $bits(foo), 10);
|
$display("bits %d %d", $bits(foo), 10);
|
||||||
|
|
||||||
`line 319 "t/t_preproc.v" 0
|
`line 319 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// 1800-2009
|
// 1800-2009
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -488,8 +488,8 @@ $display("bits %d %d", $bits(foo), 10);
|
||||||
|
|
||||||
|
|
||||||
`line 327 "t/t_preproc.v" 0
|
`line 327 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// bug202
|
// bug202
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -528,11 +528,11 @@ $display("bits %d %d", $bits(foo), 10);
|
||||||
`line 343 "t/t_preproc.v" 0
|
`line 343 "t/t_preproc.v" 0
|
||||||
|
|
||||||
/* multi \
|
/* multi \
|
||||||
line1*/ \
|
line1*/ \
|
||||||
`line 345 "t/t_preproc.v" 0
|
`line 345 "t/t_preproc.v" 0
|
||||||
|
|
||||||
/*multi \
|
/*multi \
|
||||||
line2*/
|
line2*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -544,13 +544,13 @@ $display("bits %d %d", $bits(foo), 10);
|
||||||
|
|
||||||
`line 352 "t/t_preproc.v" 0
|
`line 352 "t/t_preproc.v" 0
|
||||||
/* multi
|
/* multi
|
||||||
line 3*/
|
line 3*/
|
||||||
`line 352 "t/t_preproc.v" 0
|
`line 352 "t/t_preproc.v" 0
|
||||||
def i
|
def i
|
||||||
|
|
||||||
|
|
||||||
`line 354 "t/t_preproc.v" 0
|
`line 354 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
`line 356 "t/t_preproc.v" 0
|
`line 356 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -566,21 +566,21 @@ $display("bits %d %d", $bits(foo), 10);
|
||||||
|
|
||||||
|
|
||||||
`line 366 "t/t_preproc.v" 0
|
`line 366 "t/t_preproc.v" 0
|
||||||
1 // verilator NOT IN DEFINE (nodef)
|
1 // verilator NOT IN DEFINE (nodef)
|
||||||
2 /* verilator PART OF DEFINE */ (hasdef)
|
2 /* verilator PART OF DEFINE */ (hasdef)
|
||||||
3
|
3
|
||||||
`line 368 "t/t_preproc.v" 0
|
`line 368 "t/t_preproc.v" 0
|
||||||
/* verilator NOT PART
|
/* verilator NOT PART
|
||||||
OF DEFINE */ (nodef)
|
OF DEFINE */ (nodef)
|
||||||
`line 369 "t/t_preproc.v" 0
|
`line 369 "t/t_preproc.v" 0
|
||||||
4
|
4
|
||||||
`line 369 "t/t_preproc.v" 0
|
`line 369 "t/t_preproc.v" 0
|
||||||
/* verilator PART
|
/* verilator PART
|
||||||
OF DEFINE */ (nodef)
|
OF DEFINE */ (nodef)
|
||||||
`line 370 "t/t_preproc.v" 0
|
`line 370 "t/t_preproc.v" 0
|
||||||
5 also in
|
5 also in
|
||||||
`line 370 "t/t_preproc.v" 0
|
`line 370 "t/t_preproc.v" 0
|
||||||
also3 // CMT NOT (nodef)
|
also3 // CMT NOT (nodef)
|
||||||
|
|
||||||
|
|
||||||
HAS a NEW
|
HAS a NEW
|
||||||
|
|
@ -588,7 +588,7 @@ HAS a NEW
|
||||||
LINE
|
LINE
|
||||||
|
|
||||||
`line 375 "t/t_preproc.v" 0
|
`line 375 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
`line 377 "t/t_preproc.v" 0
|
`line 377 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -619,7 +619,7 @@ EXP: do if (start("verilog/inc1.v", 25)) begin message({"Blah-", "clx_scen", "
|
||||||
`line 399 "t/t_preproc.v" 0
|
`line 399 "t/t_preproc.v" 0
|
||||||
do
|
do
|
||||||
`line 399 "t/t_preproc.v" 0
|
`line 399 "t/t_preproc.v" 0
|
||||||
/* synopsys translate_off */
|
/* synopsys translate_off */
|
||||||
`line 399 "t/t_preproc.v" 0
|
`line 399 "t/t_preproc.v" 0
|
||||||
|
|
||||||
`line 399 "t/t_preproc.v" 0
|
`line 399 "t/t_preproc.v" 0
|
||||||
|
|
@ -635,12 +635,12 @@ EXP: do if (start("verilog/inc1.v", 25)) begin message({"Blah-", "clx_scen", "
|
||||||
`line 399 "t/t_preproc.v" 0
|
`line 399 "t/t_preproc.v" 0
|
||||||
end
|
end
|
||||||
`line 399 "t/t_preproc.v" 0
|
`line 399 "t/t_preproc.v" 0
|
||||||
/* synopsys translate_on */
|
/* synopsys translate_on */
|
||||||
`line 399 "t/t_preproc.v" 0
|
`line 399 "t/t_preproc.v" 0
|
||||||
while(0);
|
while(0);
|
||||||
|
|
||||||
`line 401 "t/t_preproc.v" 0
|
`line 401 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
`line 403 "t/t_preproc.v" 0
|
`line 403 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -655,19 +655,19 @@ EXP: do if (start("verilog/inc1.v", 25)) begin message({"Blah-", "clx_scen", "
|
||||||
|
|
||||||
`line 408 "t/t_preproc.v" 0
|
`line 408 "t/t_preproc.v" 0
|
||||||
|
|
||||||
//`ifndef def_fooed_2 `error "No def_fooed_2" `endif
|
//`ifndef def_fooed_2 `error "No def_fooed_2" `endif
|
||||||
EXP: This is fooed
|
EXP: This is fooed
|
||||||
This is fooed
|
This is fooed
|
||||||
EXP: This is fooed_2
|
EXP: This is fooed_2
|
||||||
This is fooed_2
|
This is fooed_2
|
||||||
|
|
||||||
`line 415 "t/t_preproc.v" 0
|
`line 415 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
np
|
np
|
||||||
np
|
np
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// It's unclear if the spec allows this; is text_macro_idenitfier before or after substitution?
|
// It's unclear if the spec allows this; is text_macro_idenitfier before or after substitution?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -678,8 +678,8 @@ np
|
||||||
|
|
||||||
|
|
||||||
`line 429 "t/t_preproc.v" 0
|
`line 429 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Metaprogramming
|
// Metaprogramming
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -694,18 +694,18 @@ np
|
||||||
`line 441 "t/t_preproc.v" 0
|
`line 441 "t/t_preproc.v" 0
|
||||||
hello3hello3hello3
|
hello3hello3hello3
|
||||||
hello4hello4hello4hello4
|
hello4hello4hello4hello4
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Include from stringification
|
// Include from stringification
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
`line 447 "t/t_preproc.v" 0
|
`line 447 "t/t_preproc.v" 0
|
||||||
`line 1 "t/t_preproc_inc4.vh" 1
|
`line 1 "t/t_preproc_inc4.vh" 1
|
||||||
// DESCRIPTION: Verilog::Preproc: Example source code
|
// DESCRIPTION: Verilog::Preproc: Example source code
|
||||||
`line 2 "t/t_preproc_inc4.vh" 0
|
`line 2 "t/t_preproc_inc4.vh" 0
|
||||||
// This file ONLY is placed under the Creative Commons Public Domain, for
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||||
// any use, without warranty, 2000-2011 by Wilson Snyder.
|
// any use, without warranty, 2000-2011 by Wilson Snyder.
|
||||||
// SPDX-License-Identifier: CC0-1.0
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
`line 6 "t/t_preproc_inc4.vh" 0
|
`line 6 "t/t_preproc_inc4.vh" 0
|
||||||
|
|
||||||
|
|
@ -715,9 +715,9 @@ hello4hello4hello4hello4
|
||||||
|
|
||||||
`line 448 "t/t_preproc.v" 0
|
`line 448 "t/t_preproc.v" 0
|
||||||
|
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Defines doing defines
|
// Defines doing defines
|
||||||
// Note the newline on the end - required to form the end of a define
|
// Note the newline on the end - required to form the end of a define
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -729,8 +729,8 @@ hello4hello4hello4hello4
|
||||||
|
|
||||||
|
|
||||||
Line_Preproc_Check 460
|
Line_Preproc_Check 460
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Quoted multiline - track line numbers, and ensure \\n gets propagated
|
// Quoted multiline - track line numbers, and ensure \\n gets propagated
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -741,14 +741,14 @@ Line_Preproc_Check 466
|
||||||
BAR "
|
BAR "
|
||||||
`line 469 "t/t_preproc.v" 0
|
`line 469 "t/t_preproc.v" 0
|
||||||
Line_Preproc_Check 469
|
Line_Preproc_Check 469
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// bug283
|
// bug283
|
||||||
|
|
||||||
`line 473 "t/t_preproc.v" 0
|
`line 473 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// EXP: abc
|
// EXP: abc
|
||||||
|
|
||||||
abc
|
abc
|
||||||
|
|
||||||
|
|
@ -767,14 +767,14 @@ sonet_frame
|
||||||
|
|
||||||
EXP: sonet_frame
|
EXP: sonet_frame
|
||||||
sonet_frame
|
sonet_frame
|
||||||
// This result varies between simulators
|
// This result varies between simulators
|
||||||
|
|
||||||
|
|
||||||
EXP: sonet_frame
|
EXP: sonet_frame
|
||||||
sonet_frame
|
sonet_frame
|
||||||
|
|
||||||
`line 499 "t/t_preproc.v" 0
|
`line 499 "t/t_preproc.v" 0
|
||||||
// The existance of non-existance of a base define can make a difference
|
// The existance of non-existance of a base define can make a difference
|
||||||
|
|
||||||
|
|
||||||
EXP: module zzz ; endmodule
|
EXP: module zzz ; endmodule
|
||||||
|
|
@ -788,95 +788,95 @@ module a_b ; endmodule
|
||||||
module a_b ; endmodule
|
module a_b ; endmodule
|
||||||
|
|
||||||
`line 511 "t/t_preproc.v" 0
|
`line 511 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// bug311
|
// bug311
|
||||||
integer/*NEED_SPACE*/ foo;
|
integer/*NEED_SPACE*/foo;
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// bug441
|
// bug441
|
||||||
module t;
|
module t;
|
||||||
//-----
|
//-----
|
||||||
// case provided
|
// case provided
|
||||||
// note this does NOT escape as suggested in the mail
|
// note this does NOT escape as suggested in the mail
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
initial begin : \`LEX_CAT(a[0],_assignment)
|
initial begin : \`LEX_CAT(a[0],_assignment)
|
||||||
`line 523 "t/t_preproc.v" 0
|
`line 523 "t/t_preproc.v" 0
|
||||||
$write("GOT%%m='%m' EXP='%s'\n", "t.\\`LEX_CAT(a[0],_assignment) "); end
|
$write("GOT%%m='%m' EXP='%s'\n", "t.\\`LEX_CAT(a[0],_assignment) "); end
|
||||||
//-----
|
//-----
|
||||||
// SHOULD(simulator-dependant): Backslash doesn't prevent arguments from
|
// SHOULD(simulator-dependant): Backslash doesn't prevent arguments from
|
||||||
// substituting and the \ staying in the expansion
|
// substituting and the \ staying in the expansion
|
||||||
// Note space after name is important so when substitute it has ending whitespace
|
// Note space after name is important so when substitute it has ending whitespace
|
||||||
|
|
||||||
|
|
||||||
initial begin : \a[0]_assignment_a[1]
|
initial begin : \a[0]_assignment_a[1]
|
||||||
`line 530 "t/t_preproc.v" 0
|
`line 530 "t/t_preproc.v" 0
|
||||||
$write("GOT%%m='%m' EXP='%s'\n", "t.\\a[0]_assignment_a[1] "); end
|
$write("GOT%%m='%m' EXP='%s'\n", "t.\\a[0]_assignment_a[1] "); end
|
||||||
|
|
||||||
//-----
|
//-----
|
||||||
|
|
||||||
|
|
||||||
// RULE: Ignoring backslash does NOT allow an additional expansion level
|
// RULE: Ignoring backslash does NOT allow an additional expansion level
|
||||||
// (Because ESC gets expanded then the \ has it's normal escape meaning)
|
// (Because ESC gets expanded then the \ has it's normal escape meaning)
|
||||||
initial begin : \`CAT(pp,suffix) $write("GOT%%m='%m' EXP='%s'\n", "t.\\`CAT(pp,suffix) "); end
|
initial begin : \`CAT(pp,suffix) $write("GOT%%m='%m' EXP='%s'\n", "t.\\`CAT(pp,suffix) "); end
|
||||||
|
|
||||||
//-----
|
//-----
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Similar to above; \ does not allow expansion after substitution
|
// Similar to above; \ does not allow expansion after substitution
|
||||||
initial begin : \`CAT(ff,bb)
|
initial begin : \`CAT(ff,bb)
|
||||||
`line 544 "t/t_preproc.v" 0
|
`line 544 "t/t_preproc.v" 0
|
||||||
$write("GOT%%m='%m' EXP='%s'\n", "t.\\`CAT(ff,bb) "); end
|
$write("GOT%%m='%m' EXP='%s'\n", "t.\\`CAT(ff,bb) "); end
|
||||||
|
|
||||||
//-----
|
//-----
|
||||||
|
|
||||||
|
|
||||||
// MUST: Unknown macro with backslash escape stays as escaped symbol name
|
// MUST: Unknown macro with backslash escape stays as escaped symbol name
|
||||||
initial begin : \`zzz
|
initial begin : \`zzz
|
||||||
`line 550 "t/t_preproc.v" 0
|
`line 550 "t/t_preproc.v" 0
|
||||||
$write("GOT%%m='%m' EXP='%s'\n", "t.\\`zzz "); end
|
$write("GOT%%m='%m' EXP='%s'\n", "t.\\`zzz "); end
|
||||||
|
|
||||||
//-----
|
//-----
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// SHOULD(simulator-dependant): Known macro with backslash escape expands
|
// SHOULD(simulator-dependant): Known macro with backslash escape expands
|
||||||
initial begin : \`FOO
|
initial begin : \`FOO
|
||||||
`line 557 "t/t_preproc.v" 0
|
`line 557 "t/t_preproc.v" 0
|
||||||
$write("GOT%%m='%m' OTHER_EXP='%s'\n OUR_EXP='%s'", "t.bar ","t.\\`FOO "); end
|
$write("GOT%%m='%m' OTHER_EXP='%s'\n OUR_EXP='%s'", "t.bar ","t.\\`FOO "); end
|
||||||
// SHOULD(simulator-dependant): Prefix breaks the above
|
// SHOULD(simulator-dependant): Prefix breaks the above
|
||||||
initial begin : \xx`FOO
|
initial begin : \xx`FOO
|
||||||
`line 559 "t/t_preproc.v" 0
|
`line 559 "t/t_preproc.v" 0
|
||||||
$write("GOT%%m='%m' EXP='%s'\n", "t.\\xx`FOO "); end
|
$write("GOT%%m='%m' EXP='%s'\n", "t.\\xx`FOO "); end
|
||||||
|
|
||||||
//-----
|
//-----
|
||||||
// MUST: Unknown macro not under call with backslash escape doesn't expand
|
// MUST: Unknown macro not under call with backslash escape doesn't expand
|
||||||
|
|
||||||
initial begin : \`UNKNOWN $write("GOT%%m='%m' EXP='%s'\n", "t.\\`UNKNOWN "); end
|
initial begin : \`UNKNOWN $write("GOT%%m='%m' EXP='%s'\n", "t.\\`UNKNOWN "); end
|
||||||
//-----
|
//-----
|
||||||
// MUST: Unknown macro not under call doesn't expand
|
// MUST: Unknown macro not under call doesn't expand
|
||||||
|
|
||||||
initial begin : \`DEF_NO_EXPAND $write("GOT%%m='%m' EXP='%s'\n", "t.\\`DEF_NO_EXPAND "); end
|
initial begin : \`DEF_NO_EXPAND $write("GOT%%m='%m' EXP='%s'\n", "t.\\`DEF_NO_EXPAND "); end
|
||||||
|
|
||||||
//-----
|
//-----
|
||||||
// bug441 derivative
|
// bug441 derivative
|
||||||
// Clarified in IEEE 1800-2023: Quotes prevent arguments from expanding
|
// Clarified in IEEE 1800-2023: Quotes prevent arguments from expanding
|
||||||
|
|
||||||
initial $write("GOT='%s' EXP='%s'\n", "foo name baz", "foo bar baz");
|
initial $write("GOT='%s' EXP='%s'\n", "foo name baz", "foo bar baz");
|
||||||
|
|
||||||
//-----
|
//-----
|
||||||
// RULE: Because there are quotes after substituting STR, the `A does NOT expand
|
// RULE: Because there are quotes after substituting STR, the `A does NOT expand
|
||||||
|
|
||||||
|
|
||||||
initial $write("GOT='%s' EXP='%s'\n", "foo name baz", "foo `A(bar) baz");
|
initial $write("GOT='%s' EXP='%s'\n", "foo name baz", "foo `A(bar) baz");
|
||||||
|
|
||||||
//----
|
//----
|
||||||
// bug845
|
// bug845
|
||||||
|
|
||||||
initial $write("Slashed=`%s'\n", "1//2.3");
|
initial $write("Slashed=`%s'\n", "1//2.3");
|
||||||
//----
|
//----
|
||||||
// bug915
|
// bug915
|
||||||
|
|
||||||
|
|
||||||
initial
|
initial
|
||||||
|
|
@ -885,8 +885,8 @@ module t;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
`line 593 "t/t_preproc.v" 0
|
`line 593 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
//bug1225
|
//bug1225
|
||||||
|
|
||||||
`line 596 "t/t_preproc.v" 0
|
`line 596 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -933,7 +933,7 @@ XYS_FAMILY = XYS_foo
|
||||||
|
|
||||||
|
|
||||||
`line 634 "t/t_preproc.v" 0
|
`line 634 "t/t_preproc.v" 0
|
||||||
//====
|
//====
|
||||||
|
|
||||||
`line 636 "t/t_preproc.v" 0
|
`line 636 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -972,16 +972,16 @@ XYS_FAMILY = XYS_foo
|
||||||
|
|
||||||
|
|
||||||
`line 667 "t/t_preproc.v" 0
|
`line 667 "t/t_preproc.v" 0
|
||||||
// NEVER
|
// NEVER
|
||||||
|
|
||||||
`line 669 "t/t_preproc.v" 0
|
`line 669 "t/t_preproc.v" 0
|
||||||
//bug1227
|
//bug1227
|
||||||
|
|
||||||
(.mySig (myInterface.pa5),
|
(.mySig (myInterface.pa5),
|
||||||
|
|
||||||
`line 673 "t/t_preproc.v" 0
|
`line 673 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Stringify bug
|
// Stringify bug
|
||||||
|
|
||||||
`line 676 "t/t_preproc.v" 0
|
`line 676 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -1012,13 +1012,13 @@ module pcc2_cfg;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
`line 693 "t/t_preproc.v" 0
|
`line 693 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Verilog-Perl bug1668
|
// Verilog-Perl bug1668
|
||||||
|
|
||||||
"`NOT_DEFINED_STR"
|
"`NOT_DEFINED_STR"
|
||||||
|
|
||||||
`line 698 "t/t_preproc.v" 0
|
`line 698 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
"""First line with "quoted"\nSecond line\
|
"""First line with "quoted"\nSecond line\
|
||||||
Third line"""
|
Third line"""
|
||||||
|
|
@ -1032,13 +1032,13 @@ Second line"""
|
||||||
"""QQQ defval"""
|
"""QQQ defval"""
|
||||||
|
|
||||||
`line 710 "t/t_preproc.v" 0
|
`line 710 "t/t_preproc.v" 0
|
||||||
// string concat bug
|
// string concat bug
|
||||||
|
|
||||||
"string argument"
|
"string argument"
|
||||||
|
|
||||||
`line 714 "t/t_preproc.v" 0
|
`line 714 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// See issue #5094 - IEEE 1800-2023 clarified proper behavior
|
// See issue #5094 - IEEE 1800-2023 clarified proper behavior
|
||||||
|
|
||||||
`line 717 "t/t_preproc.v" 0
|
`line 717 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -1047,9 +1047,9 @@ bar "foo foo foo" bar
|
||||||
bar """foo foo foo""" bar
|
bar """foo foo foo""" bar
|
||||||
|
|
||||||
`line 722 "t/t_preproc.v" 0
|
`line 722 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// IEEE mandated predefines
|
// IEEE mandated predefines
|
||||||
// undefineall should have no effect on these
|
// undefineall should have no effect on these
|
||||||
predef 0 0
|
predef 0 0
|
||||||
predef 1 1
|
predef 1 1
|
||||||
predef 2 2
|
predef 2 2
|
||||||
|
|
@ -1065,13 +1065,13 @@ predef -1 -1
|
||||||
predef 0 0
|
predef 0 0
|
||||||
predef 1 1
|
predef 1 1
|
||||||
predef 2 2
|
predef 2 2
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// After `undefineall above, for testing --dump-defines
|
// After `undefineall above, for testing --dump-defines
|
||||||
|
|
||||||
|
|
||||||
`line 744 "t/t_preproc.v" 0
|
`line 744 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Stringify in nested macro
|
// Stringify in nested macro
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1084,8 +1084,8 @@ string boo = "testx,ytest x x,y";
|
||||||
string boo = "testtest x,y xquux(test)";
|
string boo = "testtest x,y xquux(test)";
|
||||||
|
|
||||||
`line 757 "t/t_preproc.v" 0
|
`line 757 "t/t_preproc.v" 0
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// Define with --preproc-defines needs to keep backslashes
|
// Define with --preproc-defines needs to keep backslashes
|
||||||
|
|
||||||
`line 760 "t/t_preproc.v" 0
|
`line 760 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -73,10 +73,10 @@ At file "t/t_preproc_inc2.vh" line 5
|
||||||
|
|
||||||
|
|
||||||
`line 15 "t/t_preproc.v" 0
|
`line 15 "t/t_preproc.v" 0
|
||||||
/*verilator pass_thru comment*/
|
/*verilator pass_thru comment*/
|
||||||
|
|
||||||
`line 17 "t/t_preproc.v" 0
|
`line 17 "t/t_preproc.v" 0
|
||||||
/*verilator pass_thru_comment2*/
|
/*verilator pass_thru_comment2*/
|
||||||
|
|
||||||
`line 19 "t/t_preproc.v" 0
|
`line 19 "t/t_preproc.v" 0
|
||||||
|
|
||||||
|
|
@ -724,17 +724,17 @@ $display("bits %d %d", $bits(foo), 10);
|
||||||
`line 366 "t/t_preproc.v" 0
|
`line 366 "t/t_preproc.v" 0
|
||||||
|
|
||||||
`line 366 "t/t_preproc.v" 0
|
`line 366 "t/t_preproc.v" 0
|
||||||
1 /*verilator NOT IN DEFINE*/ (nodef)
|
1 /*verilator NOT IN DEFINE*/ (nodef)
|
||||||
2 /*verilator PART OF DEFINE*/ (hasdef)
|
2 /*verilator PART OF DEFINE*/ (hasdef)
|
||||||
3
|
3
|
||||||
`line 368 "t/t_preproc.v" 0
|
`line 368 "t/t_preproc.v" 0
|
||||||
/*verilator NOT PART
|
/*verilator NOT PART
|
||||||
OF DEFINE*/ (nodef)
|
OF DEFINE*/ (nodef)
|
||||||
`line 369 "t/t_preproc.v" 0
|
`line 369 "t/t_preproc.v" 0
|
||||||
4
|
4
|
||||||
`line 369 "t/t_preproc.v" 0
|
`line 369 "t/t_preproc.v" 0
|
||||||
/*verilator PART
|
/*verilator PART
|
||||||
OF DEFINE*/ (nodef)
|
OF DEFINE*/ (nodef)
|
||||||
`line 370 "t/t_preproc.v" 0
|
`line 370 "t/t_preproc.v" 0
|
||||||
5 also in
|
5 also in
|
||||||
`line 370 "t/t_preproc.v" 0
|
`line 370 "t/t_preproc.v" 0
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
},
|
},
|
||||||
"invocations": [
|
"invocations": [
|
||||||
{
|
{
|
||||||
"commandLine": "--prefix Vt_sarif --lint-only -Mdir obj_vlt/t_sarif --debug-check --x-assign unique -Wno-fatal --diagnostics-sarif --no-skip-identical -f input.vc +define+TEST_OBJ_DIR=obj_vlt/t_sarif +define+TEST_DUMPFILE=obj_vlt/t_sarif/simx.vcd t/t_sarif.v +librescan +notimingchecks +libext+.v -y t +incdir+t",
|
"commandLine": "--prefix Vt_sarif --lint-only -Mdir obj_vlt/t_sarif --debug-check --x-assign unique -Wno-fatal --diagnostics-sarif --no-skip-identical +librescan +notimingchecks +libext+.v -y t +incdir+t +define+TEST_OBJ_DIR=obj_vlt/t_sarif +define+TEST_DUMPFILE=obj_vlt/t_sarif/simx.vcd t/t_sarif.v",
|
||||||
"executionSuccessful": true
|
"executionSuccessful": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:7:13: 'should_show_warning_global0' has split_var metacomment, but will not be split because it is not declared in a module.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:7:13: 'should_show_warning_global0' has split_var metacomment, but will not be split because it is not declared in a module.
|
||||||
7 | logic [7:0] should_show_warning_global0 /*verilator split_var*/ ;
|
7 | logic [7:0] should_show_warning_global0 /*verilator split_var*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
... For warning description see https://verilator.org/warn/SPLITVAR?v=latest
|
... For warning description see https://verilator.org/warn/SPLITVAR?v=latest
|
||||||
... Use "/* verilator lint_off SPLITVAR */" and lint_on around source to disable this message.
|
... Use "/* verilator lint_off SPLITVAR */" and lint_on around source to disable this message.
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:8:13: 'should_show_warning_global1' has split_var metacomment, but will not be split because it is not declared in a module.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:8:13: 'should_show_warning_global1' has split_var metacomment, but will not be split because it is not declared in a module.
|
||||||
8 | logic [7:0] should_show_warning_global1 [1:0] /*verilator split_var*/ ;
|
8 | logic [7:0] should_show_warning_global1 [1:0] /*verilator split_var*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:11:16: 'should_show_warning_ifs0' has split_var metacomment, but will not be split because it is not declared in a module.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:11:16: 'should_show_warning_ifs0' has split_var metacomment, but will not be split because it is not declared in a module.
|
||||||
11 | logic [7:0] should_show_warning_ifs0 /*verilator split_var*/ ;
|
11 | logic [7:0] should_show_warning_ifs0 /*verilator split_var*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:12:16: 'should_show_warning_ifs1' has split_var metacomment, but will not be split because it is not declared in a module.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:12:16: 'should_show_warning_ifs1' has split_var metacomment, but will not be split because it is not declared in a module.
|
||||||
12 | logic [7:0] should_show_warning_ifs1 [1:0] /*verilator split_var*/ ;
|
12 | logic [7:0] should_show_warning_ifs1 [1:0] /*verilator split_var*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:40:14: 'cannot_split1' has split_var metacomment but will not be split because it is accessed from another module via a dot.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:40:14: 'cannot_split1' has split_var metacomment but will not be split because it is accessed from another module via a dot.
|
||||||
40 | i_sub0.cannot_split1[0] = 0;
|
40 | i_sub0.cannot_split1[0] = 0;
|
||||||
|
|
@ -42,40 +42,40 @@
|
||||||
| ^~
|
| ^~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:17:9: 'should_show_warning0' has split_var metacomment but will not be split because it is not an aggregate type of bit nor logic.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:17:9: 'should_show_warning0' has split_var metacomment but will not be split because it is not an aggregate type of bit nor logic.
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
17 | real should_show_warning0 /*verilator split_var*/ ;
|
17 | real should_show_warning0 /*verilator split_var*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:18:11: 'should_show_warning1' has split_var metacomment but will not be split because it is not an aggregate type of bit nor logic.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:18:11: 'should_show_warning1' has split_var metacomment but will not be split because it is not an aggregate type of bit nor logic.
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
18 | string should_show_warning1 /*verilator split_var*/ ;
|
18 | string should_show_warning1 /*verilator split_var*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:19:11: 'should_show_warning2' has split_var metacomment but will not be split because its bitwidth is 1.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:19:11: 'should_show_warning2' has split_var metacomment but will not be split because its bitwidth is 1.
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
19 | wire should_show_warning2 /*verilator split_var*/ ;
|
19 | wire should_show_warning2 /*verilator split_var*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:23:16: 'public_signal' has split_var metacomment but will not be split because it is public.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:23:16: 'public_signal' has split_var metacomment but will not be split because it is public.
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
23 | logic [1:0] public_signal /*verilator public*/ /*verilator split_var*/ ;
|
23 | logic [1:0] public_signal /*verilator public*/ /*verilator split_var*/;
|
||||||
| ^~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:31:44: 'inout_port' has split_var metacomment but will not be split because it is an inout port.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:31:44: 'inout_port' has split_var metacomment but will not be split because it is an inout port.
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
31 | function int bad_func(inout logic [3:0] inout_port /*verilator split_var*/ ,
|
31 | function int bad_func(inout logic [3:0] inout_port /*verilator split_var*/,
|
||||||
| ^~~~~~~~~~
|
| ^~~~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:32:42: 'ref_port' has split_var metacomment but will not be split because it is a ref argument.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:32:42: 'ref_port' has split_var metacomment but will not be split because it is a ref argument.
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
32 | ref logic [7:0] ref_port /*verilator split_var*/ );
|
32 | ref logic [7:0] ref_port /*verilator split_var*/);
|
||||||
| ^~~~~~~~
|
| ^~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:37:19: 'loop_idx' has split_var metacomment but will not be split because it is used as a loop variable.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:37:19: 'loop_idx' has split_var metacomment but will not be split because it is used as a loop variable.
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
37 | logic [7:0] loop_idx /*verilator split_var*/ ;
|
37 | logic [7:0] loop_idx /*verilator split_var*/;
|
||||||
| ^~~~~~~~
|
| ^~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:62:11: 'cannot_split_genvar' has split_var metacomment but will not be split because it is not an aggregate type of bit nor logic.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:62:11: 'cannot_split_genvar' has split_var metacomment but will not be split because it is not an aggregate type of bit nor logic.
|
||||||
: ... note: In instance 't.i_sub1'
|
: ... note: In instance 't.i_sub1'
|
||||||
62 | genvar cannot_split_genvar /*verilator split_var*/ ;
|
62 | genvar cannot_split_genvar /*verilator split_var*/;
|
||||||
| ^~~~~~~~~~~~~~~~~~~
|
| ^~~~~~~~~~~~~~~~~~~
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:65:72: 'cannot_split' has split_var metacomment but will not be split because its bit range cannot be determined statically.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:65:71: 'cannot_split' has split_var metacomment but will not be split because its bit range cannot be determined statically.
|
||||||
: ... note: In instance 't.i_sub1'
|
: ... note: In instance 't.i_sub1'
|
||||||
65 | static logic [8:0] rd_tmp /*verilator split_var*/ = cannot_split[addr];
|
65 | static logic [8:0] rd_tmp /*verilator split_var*/ = cannot_split[addr];
|
||||||
| ^
|
| ^
|
||||||
%Warning-SPLITVAR: t/t_split_var_1_bad.v:66:23: 'rd_tmp' has split_var metacomment but will not be split because its bit range cannot be determined statically.
|
%Warning-SPLITVAR: t/t_split_var_1_bad.v:66:23: 'rd_tmp' has split_var metacomment but will not be split because its bit range cannot be determined statically.
|
||||||
: ... note: In instance 't.i_sub1'
|
: ... note: In instance 't.i_sub1'
|
||||||
66 | rd_data = rd_tmp[{3'b0, addr[0]}+:8];
|
66 | rd_data = rd_tmp[{3'b0, addr[0]}+:8];
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,6 @@
|
||||||
... Use "/* verilator lint_off SYMRSVDWORD */" and lint_on around source to disable this message.
|
... Use "/* verilator lint_off SYMRSVDWORD */" and lint_on around source to disable this message.
|
||||||
%Warning-SYMRSVDWORD: t/t_var_rsvd_port.v:15:9: Symbol matches C++ keyword: 'switch'
|
%Warning-SYMRSVDWORD: t/t_var_rsvd_port.v:15:9: Symbol matches C++ keyword: 'switch'
|
||||||
: ... note: In instance 't'
|
: ... note: In instance 't'
|
||||||
15 | reg switch /*verilator public*/ ;
|
15 | reg switch /*verilator public*/;
|
||||||
| ^~~~~~
|
| ^~~~~~
|
||||||
%Error: Exiting due to
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue