Version bump
git-svn-id: file://localhost/svn/verilator/trunk/verilator@928 77ca24e4-aefa-0310-84f0-b9a241c72d87
This commit is contained in:
parent
72832a2810
commit
bb9ae89049
2
Changes
2
Changes
|
|
@ -3,7 +3,7 @@ Revision history for Verilator
|
||||||
The contributors that suggested a given feature are shown in []. [by ...]
|
The contributors that suggested a given feature are shown in []. [by ...]
|
||||||
indicates the contributor was also the author of the fix; Thanks!
|
indicates the contributor was also the author of the fix; Thanks!
|
||||||
|
|
||||||
* Verilator 3.65**
|
* Verilator 3.651 5/22/2007
|
||||||
|
|
||||||
*** Added verilator_profcfunc utility. [Gene Weber]
|
*** Added verilator_profcfunc utility. [Gene Weber]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1434,6 +1434,14 @@ This section describes specific limitations for each language keyword.
|
||||||
|
|
||||||
=over 4
|
=over 4
|
||||||
|
|
||||||
|
=item `__FILE__, `__LINE__, `begin_keywords, `begin_keywords, `begin_keywords,
|
||||||
|
`begin_keywords, `begin_keywords, `define, `else, `elsif, `end_keywords,
|
||||||
|
`endif, `error, `ifdef, `ifndef, `include, `line, `systemc_ctor,
|
||||||
|
`systemc_dtor, `systemc_header, `systemc_imp_header,
|
||||||
|
`systemc_implementation, `systemc_interface, `timescale, `undef, `verilog
|
||||||
|
|
||||||
|
Fully supported.
|
||||||
|
|
||||||
=item always, always_comb, always_ff, always_latch, and, assign, begin,
|
=item always, always_comb, always_ff, always_latch, and, assign, begin,
|
||||||
buf, case, casex, casez, default, defparam, do-while, else, end, endcase,
|
buf, case, casex, casez, default, defparam, do-while, else, end, endcase,
|
||||||
endfunction, endgenerate, endmodule, endspecify, endtask, final, for,
|
endfunction, endgenerate, endmodule, endspecify, endtask, final, for,
|
||||||
|
|
@ -1453,8 +1461,9 @@ All specify blocks and timing checks are ignored.
|
||||||
Verilator does not perform warning checking on uwires, it treats the uwire
|
Verilator does not perform warning checking on uwires, it treats the uwire
|
||||||
keyword as if it were the normal wire keyword.
|
keyword as if it were the normal wire keyword.
|
||||||
|
|
||||||
=item $bits, $countones, $finish, $isunknown, $onehot, $onehot0, $readmemb,
|
=item $bits, $countones, $error, $fatal, $finish, $info, $isunknown,
|
||||||
$readmemh, $signed, $stop, $time, $unsigned
|
$onehot, $onehot0, $readmemb, $readmemh, $signed, $stop, $time, $unsigned,
|
||||||
|
$warning.
|
||||||
|
|
||||||
Generally supported.
|
Generally supported.
|
||||||
|
|
||||||
|
|
@ -2069,7 +2078,7 @@ Communications, Sun Microsystems, Nauticus Networks, and SiCortex.
|
||||||
|
|
||||||
The people who have contributed code or other major functionality are Paul
|
The people who have contributed code or other major functionality are Paul
|
||||||
Wasson, Duane Galbi, and Wilson Snyder. Major testers include Jeff Dutton,
|
Wasson, Duane Galbi, and Wilson Snyder. Major testers include Jeff Dutton,
|
||||||
Ralf Karge and Wim Michiels.
|
Ralf Karge, David Hewson, Wim Michiels, and Gene Weber.
|
||||||
|
|
||||||
Some of the people who have provided ideas and feedback for Verilator
|
Some of the people who have provided ideas and feedback for Verilator
|
||||||
include Hans Van Antwerpen, Jens Arm, David Black, Gregg Bouchard, Chris
|
include Hans Van Antwerpen, Jens Arm, David Black, Gregg Bouchard, Chris
|
||||||
|
|
|
||||||
|
|
@ -78,29 +78,78 @@ sub profcfunc {
|
||||||
my %funcs;
|
my %funcs;
|
||||||
|
|
||||||
while (defined (my $line=$fh->getline())) {
|
while (defined (my $line=$fh->getline())) {
|
||||||
if ($line =~ /^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+([0-9.]+)\s+.*__PROF__([a-zA-Z_0-9]+)__([0-9]+)\(/) {
|
if ($line =~ /^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+([0-9.]+)\s+.*\s+(\S+)\s*$/) {
|
||||||
my $fileline = sprintf("%s:%d", $4, $5);
|
my $pct=$1; my $sec=$2; my $calls=$3; my $func=$4;
|
||||||
$funcs{$fileline}{pct} += $1;
|
$funcs{$func}{pct} += $pct;
|
||||||
$funcs{$fileline}{sec} += $2;
|
$funcs{$func}{sec} += $sec;
|
||||||
$funcs{$fileline}{calls} += $3;
|
$funcs{$func}{calls} += $calls;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$fh->close;
|
$fh->close;
|
||||||
|
|
||||||
|
# Find modules
|
||||||
|
my %verilated_mods;
|
||||||
|
foreach my $func (keys %funcs) {
|
||||||
|
if ($func =~ /(.*)::_eval\(.*__Syms.*\)$/) {
|
||||||
|
$verilated_mods{$1} = qr/^$1/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Resort by Verilog name
|
||||||
|
my %vfuncs;
|
||||||
|
my %groups;
|
||||||
|
foreach my $func (keys %funcs) {
|
||||||
|
my $vfunc = $func;
|
||||||
|
my $design;
|
||||||
|
foreach my $vde (keys %verilated_mods) {
|
||||||
|
if ($func =~ /$verilated_mods{$vde}/) {
|
||||||
|
$design=$vde;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($vfunc =~ /__PROF__([a-zA-Z_0-9]+)__([0-9]+)\(/) {
|
||||||
|
$vfunc = sprintf("VBlock %s:%d", $1, $2);
|
||||||
|
$groups{"Verilog Blocks under $design"} += $funcs{$func}{pct};
|
||||||
|
} else {
|
||||||
|
if ($design) {
|
||||||
|
$vfunc = sprintf("VCommon %s", $func);
|
||||||
|
$groups{"Common code under $design"} += $funcs{$func}{pct};
|
||||||
|
} else {
|
||||||
|
$vfunc = sprintf("C++ %s", $func);
|
||||||
|
$groups{'C++'} += $funcs{$func}{pct};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$vfuncs{$vfunc} = $funcs{$func};
|
||||||
|
}
|
||||||
|
|
||||||
|
print("Overall summary:\n");
|
||||||
|
print(" % time\n");
|
||||||
|
foreach (sort (keys %groups)) {
|
||||||
|
printf(" %6.2f In all %s\n", $groups{$_}, $_);
|
||||||
|
}
|
||||||
|
print("\n");
|
||||||
|
|
||||||
|
|
||||||
|
print("Verilog code profile:\n");
|
||||||
|
print(" These are split into three categories:\n");
|
||||||
|
print(" C++: Time in non-Verilated C++ code\n");
|
||||||
|
print(" VBlock: Time attributable to a block in a Verilog file and line\n");
|
||||||
|
print(" VCommon: Time in a Verilated module, due to all parts of the design\n");
|
||||||
|
print("\n");
|
||||||
|
|
||||||
print("Verilog code profile\n");
|
|
||||||
print(" % cumulative self \n");
|
print(" % cumulative self \n");
|
||||||
print(" time seconds seconds calls filename and line number\n");
|
print(" time seconds seconds calls type filename and line number\n");
|
||||||
|
|
||||||
my $cume = 0;
|
my $cume = 0;
|
||||||
foreach my $fileline (sort {$funcs{$b}{sec} <=> $funcs{$a}{sec}
|
foreach my $func (sort {$vfuncs{$b}{sec} <=> $vfuncs{$a}{sec}
|
||||||
|| $a cmp $b}
|
|| $a cmp $b}
|
||||||
(keys %funcs)) {
|
(keys %vfuncs)) {
|
||||||
$cume += $funcs{$fileline}{sec};
|
$cume += $vfuncs{$func}{sec};
|
||||||
printf +("%6.2f %9.2f %8.2f %8d %s\n", $funcs{$fileline}{pct},
|
printf +("%6.2f %9.2f %8.2f %8d %s\n",
|
||||||
$cume, $funcs{$fileline}{sec},
|
$vfuncs{$func}{pct},
|
||||||
$funcs{$fileline}{calls},
|
$cume, $vfuncs{$func}{sec},
|
||||||
$fileline);
|
$vfuncs{$func}{calls},
|
||||||
|
$func);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -999,7 +999,7 @@ private:
|
||||||
AstNodeFTask* m_taskp; // [AfterLink] Pointer to task referenced
|
AstNodeFTask* m_taskp; // [AfterLink] Pointer to task referenced
|
||||||
string m_name; // Name of variable
|
string m_name; // Name of variable
|
||||||
string m_dotted; // Dotted part of scope to task or ""
|
string m_dotted; // Dotted part of scope to task or ""
|
||||||
string m_inlinedDots; // Dotted hiearchy flattened out
|
string m_inlinedDots; // Dotted hierarchy flattened out
|
||||||
public:
|
public:
|
||||||
AstNodeFTaskRef(FileLine* fl, AstNode* namep, AstNode* pinsp)
|
AstNodeFTaskRef(FileLine* fl, AstNode* namep, AstNode* pinsp)
|
||||||
:AstNode(fl)
|
:AstNode(fl)
|
||||||
|
|
|
||||||
|
|
@ -421,7 +421,7 @@ struct AstScope : public AstNode {
|
||||||
private:
|
private:
|
||||||
string m_name; // Name
|
string m_name; // Name
|
||||||
AstScope* m_aboveScopep; // Scope above this one in the hierarchy (NULL if top)
|
AstScope* m_aboveScopep; // Scope above this one in the hierarchy (NULL if top)
|
||||||
AstCell* m_aboveCellp; // Cell above this in the hiearchy (NULL if top)
|
AstCell* m_aboveCellp; // Cell above this in the hierarchy (NULL if top)
|
||||||
AstModule* m_modp; // Module scope corresponds to
|
AstModule* m_modp; // Module scope corresponds to
|
||||||
public:
|
public:
|
||||||
AstScope(FileLine* fl, AstModule* modp, const string& name,
|
AstScope(FileLine* fl, AstModule* modp, const string& name,
|
||||||
|
|
@ -540,7 +540,7 @@ struct AstVarXRef : public AstNodeVarRef {
|
||||||
// Includes pin on a cell, as part of a ASSIGN statement to connect I/Os until AstScope
|
// Includes pin on a cell, as part of a ASSIGN statement to connect I/Os until AstScope
|
||||||
private:
|
private:
|
||||||
string m_dotted; // Scope name to connected to
|
string m_dotted; // Scope name to connected to
|
||||||
string m_inlinedDots; // Dotted hiearchy flattened out
|
string m_inlinedDots; // Dotted hierarchy flattened out
|
||||||
public:
|
public:
|
||||||
AstVarXRef(FileLine* fl, const string& name, const string& dotted, bool lvalue)
|
AstVarXRef(FileLine* fl, const string& name, const string& dotted, bool lvalue)
|
||||||
:AstNodeVarRef(fl, name, NULL, lvalue)
|
:AstNodeVarRef(fl, name, NULL, lvalue)
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
// LinkDot TRANSFORMATIONS:
|
// LinkDot TRANSFORMATIONS:
|
||||||
// Top-down traversal
|
// Top-down traversal
|
||||||
// Cells:
|
// Cells:
|
||||||
// Make graph of cell hiearchy
|
// Make graph of cell hierarchy
|
||||||
// Var/Funcs's:
|
// Var/Funcs's:
|
||||||
// Collect all names into symtable under appropriate cell
|
// Collect all names into symtable under appropriate cell
|
||||||
// Top-down traversal
|
// Top-down traversal
|
||||||
|
|
@ -180,7 +180,7 @@ private:
|
||||||
// TYPES
|
// TYPES
|
||||||
typedef std::multimap<string,LinkDotCellVertex*> NameScopeMap;
|
typedef std::multimap<string,LinkDotCellVertex*> NameScopeMap;
|
||||||
// MEMBERS
|
// MEMBERS
|
||||||
LinkDotGraph m_graph; // Graph of hiearchy
|
LinkDotGraph m_graph; // Graph of hierarchy
|
||||||
NameScopeMap m_nameScopeMap; // Hash of scope referenced by non-pretty textual name
|
NameScopeMap m_nameScopeMap; // Hash of scope referenced by non-pretty textual name
|
||||||
bool m_forPrearray; // Compress cell__[array] refs
|
bool m_forPrearray; // Compress cell__[array] refs
|
||||||
bool m_forScopeCreation; // Remove VarXRefs for V3Scope
|
bool m_forScopeCreation; // Remove VarXRefs for V3Scope
|
||||||
|
|
@ -277,7 +277,7 @@ private:
|
||||||
public:
|
public:
|
||||||
LinkDotBaseVertex* findDotted(LinkDotBaseVertex* cellVxp, const string& dotname,
|
LinkDotBaseVertex* findDotted(LinkDotBaseVertex* cellVxp, const string& dotname,
|
||||||
string& baddot, LinkDotBaseVertex*& okVxp) {
|
string& baddot, LinkDotBaseVertex*& okVxp) {
|
||||||
// Given a dotted hiearchy name, return where in scope it is
|
// Given a dotted hierarchy name, return where in scope it is
|
||||||
// Note when dotname=="" we just fall through and return cellVxp
|
// Note when dotname=="" we just fall through and return cellVxp
|
||||||
UINFO(8," dottedFind "<<dotname<<endl);
|
UINFO(8," dottedFind "<<dotname<<endl);
|
||||||
bool firstId = true;
|
bool firstId = true;
|
||||||
|
|
@ -520,8 +520,8 @@ private:
|
||||||
virtual void visit(AstScope* nodep, AstNUser*) {
|
virtual void visit(AstScope* nodep, AstNUser*) {
|
||||||
UINFO(8," SCOPE "<<nodep<<endl);
|
UINFO(8," SCOPE "<<nodep<<endl);
|
||||||
if (!m_statep->forScopeCreation()) v3fatalSrc("Scopes should only exist right after V3Scope");
|
if (!m_statep->forScopeCreation()) v3fatalSrc("Scopes should only exist right after V3Scope");
|
||||||
// Using the CELL names, we created all hiearchy. We now need to match this Scope
|
// Using the CELL names, we created all hierarchy. We now need to match this Scope
|
||||||
// up with the hiearchy created by the CELL names.
|
// up with the hierarchy created by the CELL names.
|
||||||
m_cellVxp = m_statep->findScope(nodep);
|
m_cellVxp = m_statep->findScope(nodep);
|
||||||
nodep->iterateChildren(*this);
|
nodep->iterateChildren(*this);
|
||||||
m_cellVxp = NULL;
|
m_cellVxp = NULL;
|
||||||
|
|
@ -610,7 +610,7 @@ private:
|
||||||
UINFO(8," "<<nodep<<endl);
|
UINFO(8," "<<nodep<<endl);
|
||||||
if (!m_cellVxp) {
|
if (!m_cellVxp) {
|
||||||
UINFO(9,"Dead module for "<<nodep<<endl);
|
UINFO(9,"Dead module for "<<nodep<<endl);
|
||||||
nodep->varp(NULL); // Module that is not in hiearchy. We'll be dead code eliminating it later.
|
nodep->varp(NULL); // Module that is not in hierarchy. We'll be dead code eliminating it later.
|
||||||
} else {
|
} else {
|
||||||
string baddot;
|
string baddot;
|
||||||
LinkDotBaseVertex* okVxp;
|
LinkDotBaseVertex* okVxp;
|
||||||
|
|
@ -657,7 +657,7 @@ private:
|
||||||
UINFO(8," "<<nodep<<endl);
|
UINFO(8," "<<nodep<<endl);
|
||||||
if (!m_cellVxp) {
|
if (!m_cellVxp) {
|
||||||
UINFO(9,"Dead module for "<<nodep<<endl);
|
UINFO(9,"Dead module for "<<nodep<<endl);
|
||||||
nodep->taskp(NULL); // Module that is not in hiearchy. We'll be dead code eliminating it later.
|
nodep->taskp(NULL); // Module that is not in hierarchy. We'll be dead code eliminating it later.
|
||||||
} else {
|
} else {
|
||||||
string baddot;
|
string baddot;
|
||||||
LinkDotBaseVertex* okVxp;
|
LinkDotBaseVertex* okVxp;
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
//**********************************************************************
|
//**********************************************************************
|
||||||
//**** Version and host name
|
//**** Version and host name
|
||||||
|
|
||||||
#define DTVERSION "Verilator 3.650 4/20/2007"
|
#define DTVERSION "Verilator 3.651 4/20/2007"
|
||||||
|
|
||||||
//**********************************************************************
|
//**********************************************************************
|
||||||
//**** Functions
|
//**** Functions
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue