Move coverage type field into page field, and add module name

This commit is contained in:
Wilson Snyder 2008-12-12 16:04:56 -05:00
parent 77405ddded
commit 74cf205bcf
5 changed files with 28 additions and 23 deletions

View File

@ -6,6 +6,7 @@ indicates the contributor was also the author of the fix; Thanks!
* Verilator 3.700***
** Add --coverage_toggle for toggle coverage analysis.
Running coverage now requires SystemPerl 1.301 or newer.
*** Add /*verilator coverage_on/_off */ to bracket coverage regions.

View File

@ -1011,15 +1011,15 @@ struct AstCoverDecl : public AstNodeStmt {
// Children: none
private:
AstCoverDecl* m_dataDeclp; // [After V3CoverageJoin] Pointer to duplicate declaration to get data from instead
string m_typeText;
string m_page;
string m_text;
string m_hier;
int m_column;
int m_binNum; // Set by V3EmitCSyms to tell final V3Emit what to increment
public:
AstCoverDecl(FileLine* fl, int column, const string& type, const string& comment)
AstCoverDecl(FileLine* fl, int column, const string& page, const string& comment)
: AstNodeStmt(fl) {
m_text = comment; m_typeText = type; m_column = column;
m_text = comment; m_page = page; m_column = column;
m_binNum = 0;
m_dataDeclp = NULL;
}
@ -1036,7 +1036,7 @@ public:
void binNum(int flag) { m_binNum = flag; }
int binNum() const { return m_binNum; }
const string& comment() const { return m_text; } // text to insert in code
const string& typeText() const { return m_typeText; }
const string& page() const { return m_page; }
const string& hier() const { return m_hier; }
void hier(const string& flag) { m_hier=flag; }
void comment(const string& flag) { m_text=flag; }

View File

@ -74,7 +74,7 @@ private:
}
AstCoverInc* newCoverInc(FileLine* fl, const string& hier,
const string& type, const string& comment) {
const string& page_prefix, const string& comment) {
int column = 0;
FileMap::iterator it = m_fileps.find(fl);
if (it == m_fileps.end()) {
@ -83,7 +83,11 @@ private:
column = (it->second)++;
}
AstCoverDecl* declp = new AstCoverDecl(fl, column, type, comment);
// We add the module name to the page.
// Someday the user might be allowed to specify a different page suffix
string page = page_prefix + "/" + m_modp->prettyName();
AstCoverDecl* declp = new AstCoverDecl(fl, column, page, comment);
declp->hier(hier);
m_modp->addStmtp(declp);
@ -207,7 +211,7 @@ private:
if (!nodep->backp()->castIf()
|| nodep->backp()->castIf()->elsesp()!=nodep) { // Ignore if else; did earlier
UINFO(4," COVER: "<<nodep<<endl);
nodep->addIfsp(newCoverInc(nodep->fileline(), "", "block", "if"));
nodep->addIfsp(newCoverInc(nodep->fileline(), "", "v_line", "if"));
}
}
// Don't do empty else's, only empty if/case's
@ -218,9 +222,9 @@ private:
&& nodep->fileline()->coverageOn() && v3Global.opt.coverageLine()) { // if a "else" branch didn't disable it
UINFO(4," COVER: "<<nodep<<endl);
if (nodep->elsesp()->castIf()) {
nodep->addElsesp(newCoverInc(nodep->elsesp()->fileline(), "", "block", "elsif"));
nodep->addElsesp(newCoverInc(nodep->elsesp()->fileline(), "", "v_line", "elsif"));
} else {
nodep->addElsesp(newCoverInc(nodep->elsesp()->fileline(), "", "block", "else"));
nodep->addElsesp(newCoverInc(nodep->elsesp()->fileline(), "", "v_line", "else"));
}
}
}
@ -234,7 +238,7 @@ private:
nodep->bodysp()->iterateAndNext(*this);
if (m_checkBlock) { // if the case body didn't disable it
UINFO(4," COVER: "<<nodep<<endl);
nodep->addBodysp(newCoverInc(nodep->fileline(), "", "block", "case"));
nodep->addBodysp(newCoverInc(nodep->fileline(), "", "v_line", "case"));
}
m_checkBlock = true; // Reset as a child may have cleared it
}
@ -245,7 +249,7 @@ private:
nodep->iterateChildren(*this);
if (!nodep->coverincp()) {
// Note the name may be overridden by V3Assert processing
nodep->coverincp(newCoverInc(nodep->fileline(), m_beginHier, "psl_cover", "cover"));
nodep->coverincp(newCoverInc(nodep->fileline(), m_beginHier, "v_user", "cover"));
}
m_checkBlock = true; // Reset as a child may have cleared it
}

View File

@ -202,7 +202,7 @@ public:
puts(", "); puts(cvtToStr(nodep->fileline()->lineno()));
puts(", "); puts(cvtToStr(nodep->column()));
puts(", \""); puts((nodep->hier()!=""?".":"")+nodep->hier()); puts("\"");
puts(", \""); puts(nodep->typeText()); puts("\"");
puts(", \""); puts(nodep->page()); puts("\"");
puts(", \""); puts(nodep->comment()); puts("\"");
puts(");\n");
}
@ -1199,8 +1199,8 @@ void EmitCImp::emitCoverageDecl(AstModule* modp) {
if (v3Global.opt.coverage()) {
ofp()->putsPrivate(true);
puts("// Coverage\n");
puts("void __vlCoverInsert(uint32_t* countp, bool enable, const char* filename, int lineno, int column,\n");
puts( "const char* hier, const char* type, const char* comment);\n");
puts("void __vlCoverInsert(uint32_t* countp, bool enable, const char* filenamep, int lineno, int column,\n");
puts( "const char* hierp, const char* pagep, const char* commentp);\n");
}
}
@ -1248,19 +1248,19 @@ void EmitCImp::emitCoverageImp(AstModule* modp) {
// This gets around gcc slowness constructing all of the template arguments
// SystemPerl 1.301 is much faster, but it's nice to remain back
// compatible, and have a common wrapper.
puts("void "+modClassName(m_modp)+"::__vlCoverInsert(uint32_t* countp, bool enable, const char* filename, int lineno, int column,\n");
puts( "const char* hier, const char* type, const char* comment) {\n");
puts("void "+modClassName(m_modp)+"::__vlCoverInsert(uint32_t* countp, bool enable, const char* filenamep, int lineno, int column,\n");
puts( "const char* hierp, const char* pagep, const char* commentp) {\n");
puts( "static uint32_t fake_zero_count = 0;\n");
puts( "if (!enable) countp = &fake_zero_count;\n"); // Used for second++ instantiation of identical bin
puts( "*countp = 0;\n");
puts( "SP_COVER_INSERT(countp,");
puts( " \"filename\",filename,");
puts( " \"filename\",filenamep,");
puts( " \"lineno\",lineno,");
puts( " \"column\",column,\n");
//puts( "\"hier\",string(__VlSymsp->name())+hier,"); // Need to move hier into scopes and back out if do this
puts( "\"hier\",string(name())+hier,");
puts( " \"type\",type,");
puts( " \"comment\",comment);\n");
//puts( "\"hier\",string(__VlSymsp->name())+hierp,"); // Need to move hier into scopes and back out if do this
puts( "\"hier\",string(name())+hierp,");
puts( " \"page\",pagep,");
puts( " \"comment\",commentp);\n");
puts("}\n");
}
}

View File

@ -20,7 +20,7 @@ export VERILATOR_ROOT
# Pick up PERL and other variable settings
include $(VERILATOR_ROOT)/include/verilated.mk
DEBUG_ON = --debug --trace-dups --output-split 100
DEBUG_ON = --debug --trace-dups
######################################################################
test_default: prep preproc compile run coverage
@ -31,7 +31,7 @@ V_FLAGS = -f $(VERILATOR_ROOT)/test_v/input.vc
# Note the --public --output-split-cfunc is here for testing only,
# Avoid using these settings in real application Makefiles!
VERILATOR_FLAGS = --public --output-split-cfuncs 100 --output-split 100 \
VERILATOR_FLAGS = --public --output-split-cfuncs 1000 --output-split 1000 \
--sp --coverage --stats --trace $(V_FLAGS) top.v
prep: