From da833d55fe689dcce2a3d45cbf4baaf46b0a9cb9 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Wed, 1 Sep 2021 21:08:17 -0400 Subject: [PATCH 01/65] devel release --- Changes | 4 ++++ configure.ac | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 82fe61b54..611e8d679 100644 --- a/Changes +++ b/Changes @@ -8,6 +8,10 @@ The changes in each Verilator version are described below. The contributors that suggested a given feature are shown in []. Thanks! +Verilator 4.213 devel +========================== + + Verilator 4.212 2021-09-01 ========================== diff --git a/configure.ac b/configure.ac index 720f03e4c..ddc3bca1b 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ #AC_INIT([Verilator],[#.### YYYY-MM-DD]) #AC_INIT([Verilator],[#.### devel]) -AC_INIT([Verilator],[4.212 2021-09-01], +AC_INIT([Verilator],[4.213 devel], [https://verilator.org], [verilator],[https://verilator.org]) # When releasing, also update header of Changes file From 6d97fea2f5e983816e0237635a179f709fcf2f36 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Wed, 1 Sep 2021 22:15:38 -0400 Subject: [PATCH 02/65] Internals: Cleanup some const, etc. No functional change. --- src/verilog.y | 128 +++++++++++++++++++++++++++----------------------- 1 file changed, 68 insertions(+), 60 deletions(-) diff --git a/src/verilog.y b/src/verilog.y index 2d56fa9a7..8f69e21fe 100644 --- a/src/verilog.y +++ b/src/verilog.y @@ -103,7 +103,7 @@ public: return nodep; } AstNode* createGatePin(AstNode* exprp) { - AstRange* rangep = m_gateRangep; + AstRange* const rangep = m_gateRangep; if (!rangep) { return exprp; } else { @@ -112,14 +112,14 @@ public: } AstNode* createTypedef(FileLine* fl, const string& name, AstNode* attrsp, AstNodeDType* basep, AstNodeRange* rangep) { - AstNode* nodep = new AstTypedef(fl, name, attrsp, VFlagChildDType(), - GRAMMARP->createArray(basep, rangep, false)); + AstNode* const nodep = new AstTypedef{fl, name, attrsp, VFlagChildDType{}, + GRAMMARP->createArray(basep, rangep, false)}; SYMP->reinsert(nodep); PARSEP->tagNodep(nodep); return nodep; } AstNode* createTypedefFwd(FileLine* fl, const string& name) { - AstNode* nodep = new AstTypedefFwd(fl, name); + AstNode* const nodep = new AstTypedefFwd{fl, name}; SYMP->reinsert(nodep); PARSEP->tagNodep(nodep); return nodep; @@ -166,12 +166,12 @@ public: finalp->unlinkFrBack(); rangearraysp = rangesp; } - if (AstRange* finalRangep = VN_CAST(finalp, Range)) { // not an UnsizedRange + if (AstRange* const finalRangep = VN_CAST(finalp, Range)) { // not an UnsizedRange if (dtypep->implicit()) { // It's no longer implicit but a wire logic type - AstBasicDType* newp = new AstBasicDType( + AstBasicDType* const newp = new AstBasicDType{ dtypep->fileline(), AstBasicDTypeKwd::LOGIC, dtypep->numeric(), - dtypep->width(), dtypep->widthMin()); + dtypep->width(), dtypep->widthMin()}; VL_DO_DANGLING(dtypep->deleteTree(), dtypep); dtypep = newp; } @@ -261,7 +261,7 @@ int V3ParseGrammar::s_modTypeImpNum = 0; static void ERRSVKWD(FileLine* fileline, const string& tokname) { static int toldonce = 0; fileline->v3error( - string("Unexpected '") + tokname + "': '" + tokname + std::string{"Unexpected '"} + tokname + "': '" + tokname + "' is a SystemVerilog keyword misused as an identifier." + (!toldonce++ ? "\n" + V3Error::warnMore() + "... Suggest modify the Verilog-2001 code to avoid SV keywords," @@ -1127,7 +1127,7 @@ package_import_itemList: package_import_item: // ==IEEE: package_import_item idCC/*package_identifier*/ yP_COLONCOLON package_import_itemObj { - if (!VN_CAST($1, Package)) { + if (!VN_IS($1, Package)) { $$ = nullptr; $1->v3error("Importing from missing package '" << *$1 << "'"); } else { @@ -1137,8 +1137,8 @@ package_import_item: // ==IEEE: package_import_item ; package_import_itemObj: // IEEE: part of package_import_item - idAny/*package_identifier*/ { $$=$1; $$=$1; } - | '*' { $$=$1; static string star="*"; $$=☆ } + idAny/*package_identifier*/ { $$ = $1; $$ = $1; } + | '*' { $$ = $1; static string star = "*"; $$ = ☆ } ; package_export_declaration: // IEEE: package_export_declaration @@ -1166,7 +1166,8 @@ module_declaration: // ==IEEE: module_declaration modFront importsAndParametersE portsStarE ';' /*cont*/ module_itemListE yENDMODULE endLabelE { $1->modTrace(GRAMMARP->allTracingOn($1->fileline())); // Stash for implicit wires, etc - if ($2) $1->addStmtp($2); if ($3) $1->addStmtp($3); + if ($2) $1->addStmtp($2); + if ($3) $1->addStmtp($3); if ($5) $1->addStmtp($5); GRAMMARP->m_modp = nullptr; SYMP->popScope($1); @@ -1174,7 +1175,8 @@ module_declaration: // ==IEEE: module_declaration | udpFront parameter_port_listE portsStarE ';' /*cont*/ module_itemListE yENDPRIMITIVE endLabelE { $1->modTrace(false); // Stash for implicit wires, etc - if ($2) $1->addStmtp($2); if ($3) $1->addStmtp($3); + if ($2) $1->addStmtp($2); + if ($3) $1->addStmtp($3); if ($5) $1->addStmtp($5); GRAMMARP->m_tracingParse = true; GRAMMARP->m_modp = nullptr; @@ -1285,7 +1287,7 @@ list_of_ports: // IEEE: list_of_ports + list_of_port_declarations portAndTagE: /* empty */ { int p = PINNUMINC(); - const string name = "__pinNumber" + cvtToStr(p); + const string name = "__pinNumber" + cvtToStr(p); $$ = new AstPort{CRELINE(), p, name}; AstVar* varp = new AstVar{CRELINE(), AstVarType::PORT, name, VFlagChildDType{}, new AstBasicDType{CRELINE(), LOGIC_IMPLICIT}}; @@ -1474,7 +1476,7 @@ interface_or_generate_item: // ==IEEE: interface_or_generate_item anonymous_program: // ==IEEE: anonymous_program // // See the spec - this doesn't change the scope, items still go up "top" yPROGRAM ';' anonymous_program_itemListE yENDPROGRAM - { BBUNSUP($1, "Unsupported: Anonymous programs"); $$ = nullptr; } + { $$ = nullptr; BBUNSUP($1, "Unsupported: Anonymous programs"); } ; anonymous_program_itemListE: // IEEE: { anonymous_program_item } @@ -1501,7 +1503,8 @@ program_declaration: // IEEE: program_declaration + program_nonansi_header + pr pgmFront parameter_port_listE portsStarE ';' /*cont*/ program_itemListE yENDPROGRAM endLabelE { $1->modTrace(GRAMMARP->allTracingOn($1->fileline())); // Stash for implicit wires, etc - if ($2) $1->addStmtp($2); if ($3) $1->addStmtp($3); + if ($2) $1->addStmtp($2); + if ($3) $1->addStmtp($3); if ($5) $1->addStmtp($5); GRAMMARP->m_modp = nullptr; SYMP->popScope($1); @@ -1628,7 +1631,8 @@ list_of_genvar_identifiers: // IEEE: list_of_genvar_identifiers (for decl genvar_identifierDecl: // IEEE: genvar_identifier (for declaration) id/*new-genvar_identifier*/ sigAttrListE - { VARRESET_NONLIST(GENVAR); VARDTYPE(new AstBasicDType($1,AstBasicDTypeKwd::INTEGER)); + { VARRESET_NONLIST(GENVAR); + VARDTYPE(new AstBasicDType($1, AstBasicDTypeKwd::INTEGER)); $$ = VARDONEA($1, *$1, nullptr, $2); } ; @@ -1826,7 +1830,7 @@ simple_type: // ==IEEE: simple_type // // Even though we looked up the type and have a AstNode* to it, // // we can't fully resolve it because it may have been just a forward definition. | packageClassScopeE idType - { AstRefDType* refp = new AstRefDType($2, *$2, $1, nullptr); + { AstRefDType* const refp = new AstRefDType{$2, *$2, $1, nullptr}; $$ = refp; } // // // { generate_block_identifer ... } '.' @@ -1844,10 +1848,10 @@ data_type: // ==IEEE: data_type // // IEEE: ps_covergroup_identifier // // Don't distinguish between types and classes so all these combined | packageClassScopeE idType packed_dimensionListE - { AstRefDType* refp = new AstRefDType($2, *$2, $1, nullptr); + { AstRefDType* const refp = new AstRefDType{$2, *$2, $1, nullptr}; $$ = GRAMMARP->createArray(refp, $3, true); } | packageClassScopeE idType parameter_value_assignmentClass packed_dimensionListE - { AstRefDType* refp = new AstRefDType($2, *$2, $1, $3); + { AstRefDType* const refp = new AstRefDType{$2, *$2, $1, $3}; $$ = GRAMMARP->createArray(refp, $4, true); } ; @@ -2493,13 +2497,14 @@ loop_generate_construct: // ==IEEE: loop_generate_construct AstBegin* lowerBegp = VN_CAST($9, Begin); UASSERT_OBJ(!($9 && !lowerBegp), $9, "Child of GENFOR should have been begin"); - if (!lowerBegp) lowerBegp = new AstBegin($1, "", nullptr, true, false); // Empty body - AstNode* lowerNoBegp = lowerBegp->stmtsp(); + if (!lowerBegp) lowerBegp = new AstBegin{$1, "", nullptr, true, false}; // Empty body + AstNode* const lowerNoBegp = lowerBegp->stmtsp(); if (lowerNoBegp) lowerNoBegp->unlinkFrBackWithNext(); // - AstBegin* blkp = new AstBegin($1, lowerBegp->name(), nullptr, true, true); + AstBegin* const blkp = new AstBegin{$1, lowerBegp->name(), nullptr, true, true}; // V3LinkDot detects BEGIN(GENFOR(...)) as a special case - AstNode* initp = $3; AstNode* varp = $3; + AstNode* initp = $3; + AstNode* const varp = $3; if (VN_IS(varp, Var)) { // Genvar initp = varp->nextp(); initp->unlinkFrBackWithNext(); // Detach 2nd from varp, make 1st init @@ -2712,12 +2717,13 @@ param_assignment: // ==IEEE: param_assignment id/*new-parameter*/ variable_dimensionListE sigAttrListE exprOrDataTypeEqE { // To handle #(type A=int, B=A) and properly imply B // as a type (for parsing) we need to detect "A" is a type - if (AstNodeDType* refp = VN_CAST($4, NodeDType)) { - if (VSymEnt* foundp = SYMP->symCurrentp()->findIdFallback(refp->name())) { + if (AstNodeDType* const refp = VN_CAST($4, NodeDType)) { + if (VSymEnt* const foundp = SYMP->symCurrentp()->findIdFallback(refp->name())) { UINFO(9, "declaring type via param assignment" << foundp->nodep() << endl); - VARDTYPE(new AstParseTypeDType($1)) + VARDTYPE(new AstParseTypeDType{$1}) SYMP->reinsert(foundp->nodep()->cloneTree(false), nullptr, *$1); }} - $$ = VARDONEA($1, *$1, $2, $3); if ($4) $$->valuep($4); } + $$ = VARDONEA($1, *$1, $2, $3); + if ($4) $$->valuep($4); } ; list_of_param_assignments: // ==IEEE: list_of_param_assignments @@ -2765,8 +2771,9 @@ instDecl: // // Currently disambiguated from data_declaration based on // // VARs being type, and cells non-type. // // IEEE requires a '(' to disambiguate, we need TODO force this - id parameter_value_assignmentE {INSTPREP($1,*$1,$2);} instnameList ';' - { $$ = $4; GRAMMARP->m_impliedDecl=false; + id parameter_value_assignmentE {INSTPREP($1, *$1, $2);} instnameList ';' + { $$ = $4; + GRAMMARP->m_impliedDecl = false; if (GRAMMARP->m_instParamp) { VL_DO_CLEAR(GRAMMARP->m_instParamp->deleteTree(), GRAMMARP->m_instParamp = nullptr); @@ -3101,26 +3108,27 @@ statement_item: // IEEE: statement_item if ($1 == uniq_UNIQUE0) $2->unique0Pragma(true); if ($1 == uniq_PRIORITY) $2->priorityPragma(true); } //UNSUP caseStart caseAttrE yMATCHES case_patternListE yENDCASE { } - | unique_priorityE caseStart caseAttrE yINSIDE case_insideListE yENDCASE { $$ = $2; if ($5) $2->addItemsp($5); - if (!$2->caseSimple()) $2->v3error("Illegal to have inside on a casex/casez"); - $2->caseInsideSet(); - if ($1 == uniq_UNIQUE) $2->uniquePragma(true); - if ($1 == uniq_UNIQUE0) $2->unique0Pragma(true); - if ($1 == uniq_PRIORITY) $2->priorityPragma(true); } + | unique_priorityE caseStart caseAttrE yINSIDE case_insideListE yENDCASE + { $$ = $2; if ($5) $2->addItemsp($5); + if (!$2->caseSimple()) $2->v3error("Illegal to have inside on a casex/casez"); + $2->caseInsideSet(); + if ($1 == uniq_UNIQUE) $2->uniquePragma(true); + if ($1 == uniq_UNIQUE0) $2->unique0Pragma(true); + if ($1 == uniq_PRIORITY) $2->priorityPragma(true); } // // // IEEE: conditional_statement | unique_priorityE yIF '(' expr ')' stmtBlock %prec prLOWER_THAN_ELSE - { AstIf* newp = new AstIf($2,$4,$6,nullptr); - $$ = newp; - if ($1 == uniq_UNIQUE) newp->uniquePragma(true); - if ($1 == uniq_UNIQUE0) newp->unique0Pragma(true); - if ($1 == uniq_PRIORITY) newp->priorityPragma(true); } + { AstIf* const newp = new AstIf{$2, $4, $6, nullptr}; + $$ = newp; + if ($1 == uniq_UNIQUE) newp->uniquePragma(true); + if ($1 == uniq_UNIQUE0) newp->unique0Pragma(true); + if ($1 == uniq_PRIORITY) newp->priorityPragma(true); } | unique_priorityE yIF '(' expr ')' stmtBlock yELSE stmtBlock - { AstIf* newp = new AstIf($2,$4,$6,$8); - $$ = newp; - if ($1 == uniq_UNIQUE) newp->uniquePragma(true); - if ($1 == uniq_UNIQUE0) newp->unique0Pragma(true); - if ($1 == uniq_PRIORITY) newp->priorityPragma(true); } + { AstIf* const newp = new AstIf{$2, $4, $6, $8}; + $$ = newp; + if ($1 == uniq_UNIQUE) newp->uniquePragma(true); + if ($1 == uniq_UNIQUE0) newp->unique0Pragma(true); + if ($1 == uniq_PRIORITY) newp->priorityPragma(true); } // | finc_or_dec_expression ';' { $$ = $1; } // // IEEE: inc_or_dec_expression @@ -3133,15 +3141,15 @@ statement_item: // IEEE: statement_item // // so parse as if task // // Alternative would be shim with new AstVoidStmt. | yVOID yP_TICK '(' task_subroutine_callNoMethod ')' ';' - { $$ = $4; - FileLine* newfl = new FileLine($$->fileline()); - newfl->warnOff(V3ErrorCode::IGNOREDRETURN, true); - $$->fileline(newfl); } + { $$ = $4; + FileLine* const newfl = new FileLine{$$->fileline()}; + newfl->warnOff(V3ErrorCode::IGNOREDRETURN, true); + $$->fileline(newfl); } | yVOID yP_TICK '(' expr '.' task_subroutine_callNoMethod ')' ';' - { $$ = new AstDot($5, false, $4, $6); - FileLine* newfl = new FileLine($6->fileline()); - newfl->warnOff(V3ErrorCode::IGNOREDRETURN, true); - $6->fileline(newfl); } + { $$ = new AstDot{$5, false, $4, $6}; + FileLine* const newfl = new FileLine{$6->fileline()}; + newfl->warnOff(V3ErrorCode::IGNOREDRETURN, true); + $6->fileline(newfl); } // // Expr included here to resolve our not knowing what is a method call // // Expr here must result in a subroutine_call | task_subroutine_callNoMethod ';' { $$ = $1; } @@ -3434,7 +3442,7 @@ patternKey: // IEEE: merge structure_pattern_key, array_pattern_key, ass // // id/*member*/ is part of constExpr below //UNSUP constExpr { $$ = $1; } // // IEEE: assignment_pattern_key - //UNSUP simple_type { $1->v3error("Unsupported: '{} with data type as key"); $$=$1; } + //UNSUP simple_type { $1->v3error("Unsupported: '{} with data type as key"); $$ = $1; } // // simple_type reference looks like constExpr // // Verilator: // // The above expressions cause problems because "foo" may be a constant identifier @@ -3704,7 +3712,7 @@ system_t_call: // IEEE: system_tf_call (as task) | yD_WRITEMEMH '(' expr ',' idClassSel ',' expr ',' expr ')' { $$ = new AstWriteMem($1, true, $3, $5, $7, $9); } // | yD_CAST '(' expr ',' expr ')' - { FileLine* fl_nowarn = new FileLine($1); + { FileLine* const fl_nowarn = new FileLine{$1}; fl_nowarn->warnOff(V3ErrorCode::WIDTH, true); $$ = new AstAssertIntrinsic(fl_nowarn, new AstCastDynamic(fl_nowarn, $5, $3), nullptr, nullptr, true); } // @@ -6307,8 +6315,8 @@ dist_list: // ==IEEE: dist_list dist_item: // ==IEEE: dist_item + dist_weight value_range { $$ = $1; /* Same as := 1 */ } - | value_range yP_COLONEQ expr { $$ = $1; nullptr; /*UNSUP-no-UVM*/ } - | value_range yP_COLONDIV expr { $$ = $1; nullptr; /*UNSUP-no-UVM*/ } + | value_range yP_COLONEQ expr { $$ = $1; /*UNSUP-no-UVM*/ } + | value_range yP_COLONDIV expr { $$ = $1; /*UNSUP-no-UVM*/ } ; //UNSUPextern_constraint_declaration: // ==IEEE: extern_constraint_declaration @@ -6416,7 +6424,7 @@ vltDModuleE: ; vltDFTaskE: - /* empty */ { static string empty = ""; $$ = ∅ } + /* empty */ { static string empty; $$ = ∅ } | yVLT_D_FUNCTION str { $$ = $2; } | yVLT_D_TASK str { $$ = $2; } ; @@ -6427,7 +6435,7 @@ vltInlineFront: ; vltVarAttrVarE: - /* empty */ { static string empty = ""; $$ = ∅ } + /* empty */ { static string empty; $$ = ∅ } | yVLT_D_VAR str { $$ = $2; } ; From a49bfe871c65fb06df2b1cb3ef0c32cce458ccf2 Mon Sep 17 00:00:00 2001 From: Daniel Bates Date: Thu, 2 Sep 2021 12:41:10 +0100 Subject: [PATCH 03/65] Docs: Fix typo in coverage instructions (#3111) --- docs/CONTRIBUTORS | 1 + docs/guide/simulating.rst | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/CONTRIBUTORS b/docs/CONTRIBUTORS index bead98916..13308d1cc 100644 --- a/docs/CONTRIBUTORS +++ b/docs/CONTRIBUTORS @@ -11,6 +11,7 @@ Andreas Kuster Chris Randall Conor McCullough Dan Petrisko +Daniel Bates David Horton David Metz David Stanford diff --git a/docs/guide/simulating.rst b/docs/guide/simulating.rst index 19f54f198..c34087c37 100644 --- a/docs/guide/simulating.rst +++ b/docs/guide/simulating.rst @@ -230,7 +230,7 @@ coverage point insertions into the model and collect the coverage data. To get the coverage data from the model, in the user wrapper code, typically at the end once a test passes, call -:code:`Verilated::coveragep()->write` with an argument of the filename for +:code:`Verilated::threadContextp()->coveragep()->write` with an argument of the filename for the coverage data file to write coverage data to (typically "logs/coverage.dat"). From 4ed00c563c6c11a9179a7aafaedc3ed51ebdefb5 Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Thu, 2 Sep 2021 20:10:52 +0800 Subject: [PATCH 04/65] Support displaying x and z in $display task (#3107) (#3109) --- docs/CONTRIBUTORS | 1 + src/V3Number.cpp | 88 ++++++++++++++++++++++++++++++++---- src/V3Number.h | 3 ++ test_regress/t/t_display.out | 8 ++++ test_regress/t/t_display.v | 10 ++++ 5 files changed, 100 insertions(+), 10 deletions(-) diff --git a/docs/CONTRIBUTORS b/docs/CONTRIBUTORS index 13308d1cc..3f5d53095 100644 --- a/docs/CONTRIBUTORS +++ b/docs/CONTRIBUTORS @@ -31,6 +31,7 @@ Harald Heckmann Howard Su Huang Rui HyungKi Jeong +Iru Cai Ivan Vnučec Iztok Jeras James Hanlon diff --git a/src/V3Number.cpp b/src/V3Number.cpp index 595830d27..e4ea84f22 100644 --- a/src/V3Number.cpp +++ b/src/V3Number.cpp @@ -605,6 +605,24 @@ string V3Number::displayed(FileLine* fl, const string& vformat) const { while (bit && bitIs0(bit)) bit--; while ((bit % 3) != 2) bit++; for (; bit > 0; bit -= 3) { + const int numX = countX(bit - 2, 3); + const int numZ = countZ(bit - 2, 3); + if (numX == 3 || numX == width() - (bit - 2)) { + str += 'x'; + continue; + } + if (numZ == 3 || numZ == width() - (bit - 2)) { + str += 'z'; + continue; + } + if (numX > 0) { + str += 'X'; + continue; + } + if (numZ > 0) { + str += 'Z'; + continue; + } int v = bitsValue(bit - 2, 3); str += static_cast('0' + v); } @@ -617,6 +635,24 @@ string V3Number::displayed(FileLine* fl, const string& vformat) const { while (bit && bitIs0(bit)) bit--; while ((bit % 4) != 3) bit++; for (; bit > 0; bit -= 4) { + const int numX = countX(bit - 3, 4); + const int numZ = countZ(bit - 3, 4); + if (numX == 4 || numX == width() - (bit - 3)) { + str += 'x'; + continue; + } + if (numZ == 4 || numZ == width() - (bit - 3)) { + str += 'z'; + continue; + } + if (numX > 0) { + str += 'X'; + continue; + } + if (numZ > 0) { + str += 'Z'; + continue; + } int v = bitsValue(bit - 3, 4); if (v >= 10) { str += static_cast('a' + v - 10); @@ -667,17 +703,33 @@ string V3Number::displayed(FileLine* fl, const string& vformat) const { if (issigned) dchars++; // space for sign fmtsize = cvtToStr(int(dchars)); } - if (issigned) { - if (width() > 64) { - str = toDecimalS(); + bool hasXZ = false; + if (isAllX()) { + str = "x"; + hasXZ = true; + } else if (isAllZ()) { + str = "z"; + hasXZ = true; + } else if (isAnyX()) { + str = "X"; + hasXZ = true; + } else if (isAnyZ()) { + str = "Z"; + hasXZ = true; + } + if (!hasXZ) { + if (issigned) { + if (width() > 64) { + str = toDecimalS(); + } else { + str = cvtToStr(toSQuad()); + } } else { - str = cvtToStr(toSQuad()); - } - } else { - if (width() > 64) { - str = toDecimalU(); - } else { - str = cvtToStr(toUQuad()); + if (width() > 64) { + str = toDecimalU(); + } else { + str = cvtToStr(toUQuad()); + } } } const bool zeropad = fmtsize.length() > 0 && fmtsize[0] == '0'; @@ -977,6 +1029,22 @@ bool V3Number::isLtXZ(const V3Number& rhs) const { } return false; } +int V3Number::countX(int lsb, int nbits) const { + int count = 0; + for (int bitn = 0; bitn < nbits; ++bitn) { + if (lsb + bitn >= width()) return count; + if (bitIsX(lsb + bitn)) ++count; + } + return count; +} +int V3Number::countZ(int lsb, int nbits) const { + int count = 0; + for (int bitn = 0; bitn < nbits; ++bitn) { + if (lsb + bitn >= width()) return count; + if (bitIsZ(lsb + bitn)) ++count; + } + return count; +} int V3Number::widthMin() const { for (int bit = width() - 1; bit > 0; bit--) { diff --git a/src/V3Number.h b/src/V3Number.h index 09b15e67b..9a33a6b7a 100644 --- a/src/V3Number.h +++ b/src/V3Number.h @@ -204,6 +204,9 @@ private: return v; } + int countX(int lsb, int nbits) const; + int countZ(int lsb, int nbits) const; + int words() const { return ((width() + 31) / 32); } uint32_t hiWordMask() const { return VL_MASK_I(width()); } diff --git a/test_regress/t/t_display.out b/test_regress/t/t_display.out index 9b2b995ce..0475a1952 100644 --- a/test_regress/t/t_display.out +++ b/test_regress/t/t_display.out @@ -74,4 +74,12 @@ multiline ' beep' 'beep ' log10(2) = 2 +x +xxXa +XXX 1x5X + x + z + X + Z +ZzX *-* All Finished *-* diff --git a/test_regress/t/t_display.v b/test_regress/t/t_display.v index 073268617..3f191f9b1 100644 --- a/test_regress/t/t_display.v +++ b/test_regress/t/t_display.v @@ -179,6 +179,16 @@ multiline", $time); $display("log10(2) = %d", $log10(100)); // verilator lint_on REALCVT + // unknown and high-impedance values + $display("%d", 1'bx); + $display("%h", 14'bx01010); + $display("%h %o", 12'b001xxx101x01, 12'b001xxx101x01); + $display("%d", 32'bx); + $display("%d", 32'bz); + $display("%d", 32'b11x11z111); + $display("%d", 32'b11111z111); + $display("%h", 12'b1zz1_zzzz_1x1z); + $write("*-* All Finished *-*\n"); $finish; end From 7ae54ef973bba35b92cc0fde0a905654bc0cc9bd Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Thu, 2 Sep 2021 08:54:14 -0400 Subject: [PATCH 05/65] Commentary --- src/V3EmitCSyms.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/V3EmitCSyms.cpp b/src/V3EmitCSyms.cpp index fc430a369..044332fcf 100644 --- a/src/V3EmitCSyms.cpp +++ b/src/V3EmitCSyms.cpp @@ -214,12 +214,13 @@ class EmitCSyms final : EmitCBaseVisitor { } else { varBase = whole; } - // UINFO(9,"For "<name()<<" - "<name()<<" Scp "<name() << " - " << varp->name() << " Scp " + // << scpName << "Var " << varBase << endl); const string varBasePretty = AstNode::prettyName(varBase); const string scpPretty = AstNode::prettyName(scpName); const string scpSym = scopeSymString(scpName); - // UINFO(9," scnameins sp "< Date: Fri, 3 Sep 2021 19:59:10 -0400 Subject: [PATCH 06/65] Fix verilator_profcfunc profile accounting (#3115). --- Changes | 2 + bin/verilator_profcfunc | 58 ++++++++++++++++++--------- test_regress/t/t_profcfunc.gprof | 44 ++++++++++++++++++++ test_regress/t/t_profcfunc.out | 69 ++++++++++++++++++++++++++++++++ test_regress/t/t_profcfunc.pl | 20 +++++++++ 5 files changed, 173 insertions(+), 20 deletions(-) create mode 100644 test_regress/t/t_profcfunc.gprof create mode 100644 test_regress/t/t_profcfunc.out create mode 100755 test_regress/t/t_profcfunc.pl diff --git a/Changes b/Changes index 611e8d679..f308f4c4d 100644 --- a/Changes +++ b/Changes @@ -11,6 +11,8 @@ contributors that suggested a given feature are shown in []. Thanks! Verilator 4.213 devel ========================== +* Fix verilator_profcfunc profile accounting (#3115). + Verilator 4.212 2021-09-01 ========================== diff --git a/bin/verilator_profcfunc b/bin/verilator_profcfunc index 7ee22f54c..8fee5f2cc 100755 --- a/bin/verilator_profcfunc +++ b/bin/verilator_profcfunc @@ -59,11 +59,11 @@ sub parameter { sub profcfunc { my $filename = shift; # Remove hex numbers before diffing - my $fh = IO::File->new ($filename) or die "%Error: $! $filename,"; + my $fh = IO::File->new($filename) or die "%Error: $! $filename,"; my %funcs; - while (defined (my $line=$fh->getline())) { + while (defined(my $line = $fh->getline)) { # %time cumesec selfsec calls {stuff} name if ($line =~ /^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+([0-9.]+)\s+[^a-zA-Z_]*([a-zA-Z_].*)$/) { my $pct=$1; my $sec=$2; my $calls=$3; my $func=$4; @@ -83,44 +83,44 @@ sub profcfunc { $fh->close; # Find modules - my %pointer_mods; my %verilated_mods; foreach my $func (keys %funcs) { - if ($func =~ /(.*)::_eval\(([a-zA-Z_0-9]+__Syms).*\)$/) { + if ($func =~ /(.*)::eval\(/) { + print "-got _eval $func prefix=$1\n" if $Debug; $verilated_mods{$1} = qr/^$1/; - $pointer_mods{$2} = $1; } } - #print Dumper(\%pointer_mods, \%verilated_mods); + #print Dumper(\%verilated_mods); - # Resort by Verilog name + # Sort by Verilog name my %vfuncs; my %groups; foreach my $func (keys %funcs) { my $pct = $funcs{$func}{pct}; my $vfunc = $func; + + (my $funcarg = $func) =~ s/^.*\(//; + my $design; - - if ($func =~ /\(([a-zA-Z_0-9]+__Syms)/) { - $design = $pointer_mods{$1}; - } - foreach my $vde (keys %verilated_mods) { - last if $design; - if ($func =~ /$verilated_mods{$vde}/) { - $design=$vde; + if ($func =~ /$verilated_mods{$vde}/ + || $funcarg =~ /$verilated_mods{$vde}/) { + $design = $vde; last; } } - if ($vfunc =~ /__PROF__([a-zA-Z_0-9]+)__l?([0-9]+)\(/) { + my $vdesign = "-"; + if ($design && $vfunc =~ /__PROF__([a-zA-Z_0-9]+)__l?([0-9]+)\(/) { $vfunc = sprintf("VBlock %s:%d", $1, $2); + $vdesign = $design; $groups{type}{"Verilog Blocks under $design"} += $pct; $groups{design}{$design} += $pct; $groups{module}{$1} += $pct; } else { if ($design) { $vfunc = sprintf("VCommon %s", $func); + $vdesign = $design; $groups{type}{"Common code under $design"} += $pct; $groups{design}{$design} += $pct; $groups{module}{$design." common code"} += $pct; @@ -143,7 +143,14 @@ sub profcfunc { $groups{module}{'C++'} += $pct; } } - $vfuncs{$vfunc} = $funcs{$func}; + if (!$vfuncs{$vfunc}) { + $vfuncs{$vfunc} = $funcs{$func}; + $vfuncs{$vfunc}{design} = $vdesign; + } else { + $vfuncs{$vfunc}{pct} += $funcs{$func}{pct}; + $vfuncs{$vfunc}{calls} += $funcs{$func}{calls}; + $vfuncs{$vfunc}{sec} += $funcs{$func}{sec}; + } } @@ -165,6 +172,13 @@ sub profcfunc { print("\n"); } + my $design_width = 1; + foreach my $func (keys %vfuncs) { + if ($design_width < length($vfuncs{$func}{design})) { + $design_width = length($vfuncs{$func}{design}); + } + } + print("Verilog code profile:\n"); print(" These are split into three categories:\n"); print(" C++: Time in non-Verilated C++ code\n"); @@ -175,17 +189,21 @@ sub profcfunc { print("\n"); print(" % cumulative self \n"); - print(" time seconds seconds calls type filename and line number\n"); + print(" time seconds seconds calls "); + printf("%-${design_width}s", "design"); + print(" type filename and line number\n"); my $cume = 0; foreach my $func (sort {$vfuncs{$b}{sec} <=> $vfuncs{$a}{sec} || $a cmp $b} (keys %vfuncs)) { $cume += $vfuncs{$func}{sec}; - printf +("%6.2f %9.2f %8.2f %8d %s\n", + printf +("%6.2f %9.2f %8.2f %8d %-${design_width}s %s\n", $vfuncs{$func}{pct}, - $cume, $vfuncs{$func}{sec}, + $cume, + $vfuncs{$func}{sec}, $vfuncs{$func}{calls}, + $vfuncs{$func}{design}, $func); } } diff --git a/test_regress/t/t_profcfunc.gprof b/test_regress/t/t_profcfunc.gprof new file mode 100644 index 000000000..91be91407 --- /dev/null +++ b/test_regress/t/t_profcfunc.gprof @@ -0,0 +1,44 @@ +Flat profile: + + Note all numbers below were faked for this test, so might not be consistent. + + % cumulative self self total + time seconds seconds calls Ts/call Ts/call name + 1.99 1.99 0.99 200578 0.00 0.00 VL_EXTENDS_QQ(int, int, unsigned long) + 1.98 0.00 0.98 100000 0.00 0.00 VL_POWSS_QQQ(int, int, int, unsigned long, unsigned long, bool, bool) + 1.89 0.00 0.89 1407 0.00 0.00 Verilated::debug() + 1.88 0.00 0.88 202 0.00 0.00 VerilatedContext::gotFinish() const + 1.87 0.00 0.87 6 0.00 0.00 VerilatedContext::randReset() + 1.86 0.00 0.86 9 0.00 0.00 VlWide<2ul>::operator unsigned int*() + 1.79 0.00 0.79 600 0.00 0.00 Vt_prof* const& std::__get_helper<0ul, Vt_prof*, std::default_delete >(std::_Tuple_impl<0ul, Vt_prof*, std::default_delete > const&) + 1.78 0.00 0.78 3 0.00 0.00 Vt_prof*& std::__get_helper<0ul, Vt_prof*, std::default_delete >(std::_Tuple_impl<0ul, Vt_prof*, std::default_delete >&) + 1.77 0.00 0.77 1 0.00 0.00 Vt_prof::Vt_prof(VerilatedContext*, char const*) + 1.76 0.00 0.76 1 0.00 0.00 Vt_prof::Vt_prof(char const*) + 1.75 0.00 0.75 200 0.00 0.00 Vt_prof::eval() + 1.74 0.00 0.74 200 0.00 0.00 Vt_prof::eval_step() + 1.73 0.00 0.73 1 0.00 0.00 Vt_prof::final() + 1.72 0.00 0.72 1 0.00 0.00 Vt_prof::~Vt_prof() + 1.71 0.00 0.71 1 0.00 0.00 Vt_prof__Syms::Vt_prof__Syms(VerilatedContext*, char const*, Vt_prof*) + 1.70 0.00 0.70 1 0.00 0.00 Vt_prof__Syms::~Vt_prof__Syms() + 1.69 0.00 0.69 1 0.00 0.00 Vt_prof___024root::__Vconfigure(Vt_prof__Syms*, bool) + 1.68 0.00 0.68 1 0.00 0.00 Vt_prof___024root::Vt_prof___024root(char const*) + 1.67 0.00 0.67 1 0.00 0.00 Vt_prof___024root::~Vt_prof___024root() + 1.66 0.00 0.66 201 0.00 0.00 Vt_prof___024root___eval(Vt_prof___024root*) + 1.65 0.00 0.65 200 0.00 0.00 Vt_prof___024root___eval_debug_assertions(Vt_prof___024root*) + 1.64 0.00 0.64 100 0.00 0.00 Vt_prof___024root___sequent__TOP__5__PROF__t_prof__l31(Vt_prof___024root*) + 1.63 0.00 0.63 100 0.00 0.00 Vt_prof___024root___sequent__TOP__50__PROF__t_prof__l31(Vt_prof___024root*) + 1.62 0.00 0.62 100 0.00 0.00 Vt_prof___024root___sequent__TOP__6__PROF__t_prof__l30(Vt_prof___024root*) + 1.61 0.00 0.61 1 0.00 0.00 Vt_prof___024root___final(Vt_prof___024root*) + 1.60 0.00 0.60 1 0.00 0.00 Vt_prof___024root___eval_settle(Vt_prof___024root*) + 1.59 0.00 0.59 1 0.00 0.00 Vt_prof___024root___eval_initial(Vt_prof___024root*) + 1.58 0.00 0.58 1 0.00 0.00 Vt_prof___024root___ctor_var_reset(Vt_prof___024root*) + 1.57 0.00 0.57 1 0.00 0.00 Vt_prof___024root___initial__TOP__13__PROF__t_prof__l13(Vt_prof___024root*) + 1.30 0.00 0.30 1 0.00 0.00 _eval_initial_loop(Vt_prof__Syms*) + 1.29 0.00 0.29 1 0.00 0.00 _vl_cmp_w(int, unsigned int const*, unsigned int const*) + 1.28 0.00 0.28 2 0.00 0.00 _vl_moddiv_w(int, unsigned int*, unsigned int const*, unsigned int const*, bool) + 1.27 0.00 0.27 2 0.00 0.00 _vl_vsformat(std::__cxx11::basic_string, std::allocator >&, char const*, __va_list_tag*) + 1.26 0.00 0.26 1399 0.00 0.00 std::unique_ptr >::get() const + 1.25 0.00 0.25 3 0.00 0.00 unsigned long const& std::max(unsigned long const&, unsigned long const&) + 1.19 0.00 0.19 1 0.00 0.00 vl_finish(char const*, int, char const*) + 1.18 0.00 0.18 2 0.00 0.00 vl_time_pow10(int) + diff --git a/test_regress/t/t_profcfunc.out b/test_regress/t/t_profcfunc.out new file mode 100644 index 000000000..fb22d5c8e --- /dev/null +++ b/test_regress/t/t_profcfunc.out @@ -0,0 +1,69 @@ +Overall summary by type: + % time type + 4.37 C++ + 33.48 Common code under Vt_prof + 15.82 VLib + 6.46 Verilog Blocks under Vt_prof + 39.87 Unaccounted for/rounding error + +Overall summary by design: + % time design + 4.37 C++ + 15.82 VLib + 39.94 Vt_prof + 39.87 Unaccounted for/rounding error + +Overall summary by module: + % time module + 4.37 C++ + 15.82 VLib + 33.48 Vt_prof common code + 6.46 t_prof + 39.87 Unaccounted for/rounding error + +Verilog code profile: + These are split into three categories: + C++: Time in non-Verilated C++ code + Prof: Time in profile overhead + VBlock: Time attributable to a block in a Verilog file and line + VCommon: Time in a Verilated module, due to all parts of the design + VLib: Time in Verilated common libraries, called by the Verilated code + + % cumulative self + time seconds seconds calls design type filename and line number + 3.27 1.27 1.27 200 Vt_prof VBlock t_prof:31 + 1.99 2.26 0.99 200578 - VLib VL_EXTENDS_QQ(int, int, unsigned long) + 1.98 3.24 0.98 100000 - VLib VL_POWSS_QQQ(int, int, int, unsigned long, unsigned long, bool, bool) + 1.89 4.13 0.89 1407 - VLib Verilated::debug() + 1.88 5.01 0.88 202 - VLib VerilatedContext::gotFinish() const + 1.87 5.88 0.87 6 - VLib VerilatedContext::randReset() + 1.86 6.74 0.86 9 - C++ VlWide<2ul>::operator unsigned int*() + 1.79 7.53 0.79 600 Vt_prof VCommon Vt_prof* const& std::__get_helper<0ul, Vt_prof*, std::default_delete >(std::_Tuple_impl<0ul, Vt_prof*, std::default_delete > const&) + 1.78 8.31 0.78 3 Vt_prof VCommon Vt_prof*& std::__get_helper<0ul, Vt_prof*, std::default_delete >(std::_Tuple_impl<0ul, Vt_prof*, std::default_delete >&) + 1.77 9.08 0.77 1 Vt_prof VCommon Vt_prof::Vt_prof(VerilatedContext*, char const*) + 1.76 9.84 0.76 1 Vt_prof VCommon Vt_prof::Vt_prof(char const*) + 1.75 10.59 0.75 200 Vt_prof VCommon Vt_prof::eval() + 1.74 11.33 0.74 200 Vt_prof VCommon Vt_prof::eval_step() + 1.73 12.06 0.73 1 Vt_prof VCommon Vt_prof::final() + 1.72 12.78 0.72 1 Vt_prof VCommon Vt_prof::~Vt_prof() + 1.71 13.49 0.71 1 Vt_prof VCommon Vt_prof__Syms::Vt_prof__Syms(VerilatedContext*, char const*, Vt_prof*) + 1.70 14.19 0.70 1 Vt_prof VCommon Vt_prof__Syms::~Vt_prof__Syms() + 1.69 14.88 0.69 1 Vt_prof VCommon Vt_prof___024root::__Vconfigure(Vt_prof__Syms*, bool) + 1.68 15.56 0.68 1 Vt_prof VCommon Vt_prof___024root::Vt_prof___024root(char const*) + 1.67 16.23 0.67 1 Vt_prof VCommon Vt_prof___024root::~Vt_prof___024root() + 1.66 16.89 0.66 201 Vt_prof VCommon Vt_prof___024root___eval(Vt_prof___024root*) + 1.65 17.54 0.65 200 Vt_prof VCommon Vt_prof___024root___eval_debug_assertions(Vt_prof___024root*) + 1.62 18.16 0.62 100 Vt_prof VBlock t_prof:30 + 1.61 18.77 0.61 1 Vt_prof VCommon Vt_prof___024root___final(Vt_prof___024root*) + 1.60 19.37 0.60 1 Vt_prof VCommon Vt_prof___024root___eval_settle(Vt_prof___024root*) + 1.59 19.96 0.59 1 Vt_prof VCommon Vt_prof___024root___eval_initial(Vt_prof___024root*) + 1.58 20.54 0.58 1 Vt_prof VCommon Vt_prof___024root___ctor_var_reset(Vt_prof___024root*) + 1.57 21.11 0.57 1 Vt_prof VBlock t_prof:13 + 1.30 21.41 0.30 1 Vt_prof VCommon _eval_initial_loop(Vt_prof__Syms*) + 1.29 21.70 0.29 1 - VLib _vl_cmp_w(int, unsigned int const*, unsigned int const*) + 1.28 21.98 0.28 2 - VLib _vl_moddiv_w(int, unsigned int*, unsigned int const*, unsigned int const*, bool) + 1.27 22.25 0.27 2 - VLib _vl_vsformat(std::__cxx11::basic_string, std::allocator >&, char const*, __va_list_tag*) + 1.26 22.51 0.26 1399 - C++ std::unique_ptr >::get() const + 1.25 22.76 0.25 3 - C++ unsigned long const& std::max(unsigned long const&, unsigned long const&) + 1.19 22.95 0.19 1 - VLib vl_finish(char const*, int, char const*) + 1.18 23.13 0.18 2 - VLib vl_time_pow10(int) diff --git a/test_regress/t/t_profcfunc.pl b/test_regress/t/t_profcfunc.pl new file mode 100755 index 000000000..f6d5ee8ae --- /dev/null +++ b/test_regress/t/t_profcfunc.pl @@ -0,0 +1,20 @@ +#!/usr/bin/env perl +if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; } +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2003 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 + +scenarios(vlt_all => 1); + +run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_profcfunc $Self->{t_dir}/t_profcfunc.gprof > cfuncs.out"], + check_finished => 0); + +files_identical("$Self->{obj_dir}/cfuncs.out", $Self->{golden_filename}); + +ok(1); + +1; From f37c875be893677df8b56054c2611f4a5d5080b9 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 4 Sep 2021 08:07:48 -0400 Subject: [PATCH 07/65] Internal: Remove fixme --- src/V3Width.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/V3Width.cpp b/src/V3Width.cpp index 24b8e9c12..6fd9ee2ec 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -1179,7 +1179,6 @@ private: return; } } - nodep->backp()->dumpTree(cout, "-FIXME-tr "); nodep->v3warn(E_UNSUPPORTED, "Unsupported/illegal unbounded ('$') in this context."); } virtual void visit(AstIsUnbounded* nodep) override { From 1ee46ac5e179f3e070615ff307932c68df69a985 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 4 Sep 2021 08:21:09 -0400 Subject: [PATCH 08/65] Convert verilator_profcfunc to python. --- Makefile.in | 3 +- bin/verilator_profcfunc | 406 +++++++++++++++++----------------------- 2 files changed, 174 insertions(+), 235 deletions(-) diff --git a/Makefile.in b/Makefile.in index 7b09873c8..bc680bab5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -142,7 +142,7 @@ EXAMPLES_FIRST = \ EXAMPLES = $(EXAMPLES_FIRST) $(filter-out $(EXAMPLES_FIRST), $(sort $(wildcard examples/*))) # See uninstall also - don't put wildcards in this variable, it might uninstall other stuff -VL_INST_MAN_FILES = verilator.1 verilator_coverage.1 verilator_gantt.1 verilator_profcfunc.1 +VL_INST_MAN_FILES = verilator.1 verilator_coverage.1 default: all all: all_nomsg msg_test @@ -369,6 +369,7 @@ clang-format: PY_PROGRAMS = \ bin/verilator_ccache_report \ + bin/verilator_profcfunc \ examples/xml_py/vl_file_copy \ examples/xml_py/vl_hier_graph \ docs/guide/conf.py \ diff --git a/bin/verilator_profcfunc b/bin/verilator_profcfunc index 8fee5f2cc..65eeeb67f 100755 --- a/bin/verilator_profcfunc +++ b/bin/verilator_profcfunc @@ -1,266 +1,204 @@ -#!/usr/bin/env perl -# See copyright, etc in below POD section. +#!/usr/bin/env python3 +# pylint: disable=C0103,C0114,C0116,R0914,R0912,R0915,eval-used ###################################################################### -require 5.006_001; -use warnings; -use Getopt::Long; -use IO::File; -use Pod::Usage; -eval { use Data::Dumper; $Data::Dumper::Indent = 1; }; # Debug, ok if missing -use strict; -use vars qw($Debug); +import argparse +import collections +import re +# from pprint import pprint -#====================================================================== +###################################################################### -#====================================================================== -# main +def profcfunc(filename): + funcs = {} -$Debug = 0; -my $Opt_File; -autoflush STDOUT 1; -autoflush STDERR 1; -Getopt::Long::config("no_auto_abbrev"); -if (! GetOptions( - "help" => \&usage, - "debug" => \&debug, - "<>" => \¶meter, - )) { - die "%Error: Bad usage, try 'verilator_profcfunc --help'\n"; -} + with open(filename) as fh: -defined $Opt_File or die "%Error: No filename given\n"; + for line in fh: + # %time cumesec selfsec calls {stuff} name + match = re.match( + r'^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+([0-9.]+)\s+[^a-zA-Z_]*([a-zA-Z_].*)$', + line) + if match: + pct = float(match.group(1)) + sec = float(match.group(2)) + calls = float(match.group(3)) + func = match.group(4) + if func not in funcs: + funcs[func] = {'pct': 0, 'sec': 0, 'calls': 0} + funcs[func]['pct'] += pct + funcs[func]['sec'] += sec + funcs[func]['calls'] += calls + continue -profcfunc($Opt_File); - -#---------------------------------------------------------------------- - -sub usage { - pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT); - exit(1); # Unreachable -} - -sub debug { - $Debug = 1; -} - -sub parameter { - my $param = shift; - if (!defined $Opt_File) { - $Opt_File = $param; - } else { - die "%Error: Unknown parameter: $param\n"; - } -} - -####################################################################### - -sub profcfunc { - my $filename = shift; - # Remove hex numbers before diffing - my $fh = IO::File->new($filename) or die "%Error: $! $filename,"; - - my %funcs; - - while (defined(my $line = $fh->getline)) { - # %time cumesec selfsec calls {stuff} name - if ($line =~ /^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+([0-9.]+)\s+[^a-zA-Z_]*([a-zA-Z_].*)$/) { - my $pct=$1; my $sec=$2; my $calls=$3; my $func=$4; - $funcs{$func}{pct} += $pct; - $funcs{$func}{sec} += $sec; - $funcs{$func}{calls} += $calls; - } - # Older gprofs have no call column for single-call functions - # %time cumesec selfsec {stuff} name - elsif ($line =~ /^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+[^a-zA-Z_]*([a-zA-Z_].*)$/) { - my $pct=$1; my $sec=$2; my $calls=1; my $func=$3; - $funcs{$func}{pct} += $pct; - $funcs{$func}{sec} += $sec; - $funcs{$func}{calls} += $calls; - } - } - $fh->close; + # Older gprofs have no call column for single-call functions + # %time cumesec selfsec {stuff} name + match = re.match( + r'^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+[^a-zA-Z_]*([a-zA-Z_].*)$', + line) + if match: + pct = float(match.group(1)) + sec = float(match.group(2)) + calls = 1 + func = match.group(3) + if func not in funcs: + funcs[func] = {'pct': 0, 'sec': 0, 'calls': 0} + funcs[func]['pct'] += pct + funcs[func]['sec'] += sec + funcs[func]['calls'] += calls + continue # Find modules - my %verilated_mods; - foreach my $func (keys %funcs) { - if ($func =~ /(.*)::eval\(/) { - print "-got _eval $func prefix=$1\n" if $Debug; - $verilated_mods{$1} = qr/^$1/; - } - } - #print Dumper(\%verilated_mods); + verilated_mods = {} + for func in funcs: + match = re.search(r'(.*)::eval\(', func) + if match: + prefix = match.group(1) + if Args.debug: + print("-got _eval %s prefix=%s" % (func, prefix)) + verilated_mods[prefix] = re.compile(r'^' + prefix) + # pprint(verilated_mods) # Sort by Verilog name - my %vfuncs; - my %groups; - foreach my $func (keys %funcs) { - my $pct = $funcs{$func}{pct}; - my $vfunc = $func; + vfuncs = {} + groups = {} + groups['type'] = collections.defaultdict(lambda: 0) + groups['design'] = collections.defaultdict(lambda: 0) + groups['module'] = collections.defaultdict(lambda: 0) - (my $funcarg = $func) =~ s/^.*\(//; + for func in funcs: + pct = funcs[func]['pct'] + vfunc = func - my $design; - foreach my $vde (keys %verilated_mods) { - if ($func =~ /$verilated_mods{$vde}/ - || $funcarg =~ /$verilated_mods{$vde}/) { - $design = $vde; - last; - } - } + funcarg = re.sub(r'^.*\(', '', func) - my $vdesign = "-"; - if ($design && $vfunc =~ /__PROF__([a-zA-Z_0-9]+)__l?([0-9]+)\(/) { - $vfunc = sprintf("VBlock %s:%d", $1, $2); - $vdesign = $design; - $groups{type}{"Verilog Blocks under $design"} += $pct; - $groups{design}{$design} += $pct; - $groups{module}{$1} += $pct; - } else { - if ($design) { - $vfunc = sprintf("VCommon %s", $func); - $vdesign = $design; - $groups{type}{"Common code under $design"} += $pct; - $groups{design}{$design} += $pct; - $groups{module}{$design." common code"} += $pct; - } elsif ($func =~ /^VL_[A-Z0-9_]+/ - || $func =~ /^_?vl_[a-zA-Z0-9_]+/ - || $func =~ /^verilated/i) { - $vfunc = sprintf("VLib %s", $func); - $groups{type}{'VLib'} += $pct; - $groups{design}{'VLib'} += $pct; - $groups{module}{'VLib'} += $pct; - } elsif ($func =~ /^_mcount_private/) { - $vfunc = sprintf("Prof %s", $func); - $groups{type}{'Prof'} += $pct; - $groups{design}{'Prof'} += $pct; - $groups{module}{'Prof'} += $pct; - } else { - $vfunc = sprintf("C++ %s", $func); - $groups{type}{'C++'} += $pct; - $groups{design}{'C++'} += $pct; - $groups{module}{'C++'} += $pct; - } - } - if (!$vfuncs{$vfunc}) { - $vfuncs{$vfunc} = $funcs{$func}; - $vfuncs{$vfunc}{design} = $vdesign; - } else { - $vfuncs{$vfunc}{pct} += $funcs{$func}{pct}; - $vfuncs{$vfunc}{calls} += $funcs{$func}{calls}; - $vfuncs{$vfunc}{sec} += $funcs{$func}{sec}; - } - } + design = None + for vde in verilated_mods: + if verilated_mods[vde].match(func) or verilated_mods[vde].match( + funcarg): + design = vde + break + + vdesign = "-" + + prof_match = re.search(r'__PROF__([a-zA-Z_0-9]+)__l?([0-9]+)\(', vfunc) + if design and prof_match: + linefunc = prof_match.group(1) + lineno = int(prof_match.group(2)) + vfunc = "VBlock %s:%d" % (linefunc, lineno) + vdesign = design + groups['type']["Verilog Blocks under " + design] += pct + groups['design'][design] += pct + groups['module'][linefunc] += pct + elif design: + vfunc = "VCommon " + func + vdesign = design + groups['type']["Common code under " + design] += pct + groups['design'][design] += pct + groups['module'][design + " common code"] += pct + elif re.match(r'(VL_[A-Z0-9_]+|_?vl_[a-zA-Z0-9_]+|Verilated)', vfunc): + vfunc = "VLib " + func + groups['type']['VLib'] += pct + groups['design']['VLib'] += pct + groups['module']['VLib'] += pct + elif re.match(r'^_mcount_private', vfunc): + vfunc = "Prof " + func + groups['type']['Prof'] += pct + groups['design']['Prof'] += pct + groups['module']['Prof'] += pct + else: + vfunc = "C++ " + func + groups['type']['C++'] += pct + groups['design']['C++'] += pct + groups['module']['C++'] += pct + + if vfunc not in vfuncs: + vfuncs[vfunc] = funcs[func] + vfuncs[vfunc]['design'] = vdesign + else: + vfuncs[vfunc]['pct'] += funcs[func]['pct'] + vfuncs[vfunc]['calls'] += funcs[func]['calls'] + vfuncs[vfunc]['sec'] += funcs[func]['sec'] + + for ftype in ['type', 'design', 'module']: + missing = 100 + for item in groups[ftype].keys(): + missing -= groups[ftype][item] + groups[ftype]["\377Unaccounted for/rounding error"] = missing + + print("Overall summary by %s:" % ftype) + print(" %-6s %s" % ("% time", ftype)) + for what in sorted(groups[ftype].keys()): + # \377 used to establish sort order + pwhat = re.sub(r'^\377', '', what) + print(" %6.2f %s" % (groups[ftype][what], pwhat)) + print() + + design_width = 1 + for func in vfuncs: + if design_width < len(vfuncs[func]['design']): + design_width = len(vfuncs[func]['design']) + + print("Verilog code profile:") + print(" These are split into three categories:") + print(" C++: Time in non-Verilated C++ code") + print(" Prof: Time in profile overhead") + print(" VBlock: Time attributable to a block in a" + + " Verilog file and line") + print(" VCommon: Time in a Verilated module," + + " due to all parts of the design") + print(" VLib: Time in Verilated common libraries," + + " called by the Verilated code") + print() + + print(" % cumulative self ") + print((" time seconds seconds calls %-" + str(design_width) + + "s type filename and line number") % "design") + + cume = 0 + for func in sorted(vfuncs.keys(), + key=lambda f: vfuncs[f]['sec'], + reverse=True): + cume += vfuncs[func]['sec'] + print(("%6.2f %9.2f %8.2f %8d %-" + str(design_width) + "s %s") % + (vfuncs[func]['pct'], cume, vfuncs[func]['sec'], + vfuncs[func]['calls'], vfuncs[func]['design'], func)) - foreach my $type (qw(type design module)) { - my $missing = 100; - foreach (sort (keys %{$groups{$type}})) { - $missing -= $groups{$type}{$_}; - } - if ($missing) { - $groups{$type}{"\377Unaccounted for/rounding error"} = $missing; - } +###################################################################### +###################################################################### - print("Overall summary by $type:\n"); - printf(" %-6s %s\n","% time",$type); - foreach my $what (sort (keys %{$groups{$type}})) { - (my $pwhat = $what) =~ s/^\377//; # Just used to establish sort order - printf(" %6.2f %s\n", $groups{$type}{$what}, $pwhat); - } - print("\n"); - } - - my $design_width = 1; - foreach my $func (keys %vfuncs) { - if ($design_width < length($vfuncs{$func}{design})) { - $design_width = length($vfuncs{$func}{design}); - } - } - - print("Verilog code profile:\n"); - print(" These are split into three categories:\n"); - print(" C++: Time in non-Verilated C++ code\n"); - print(" Prof: Time in profile overhead\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(" VLib: Time in Verilated common libraries, called by the Verilated code\n"); - print("\n"); - - print(" % cumulative self \n"); - print(" time seconds seconds calls "); - printf("%-${design_width}s", "design"); - print(" type filename and line number\n"); - - my $cume = 0; - foreach my $func (sort {$vfuncs{$b}{sec} <=> $vfuncs{$a}{sec} - || $a cmp $b} - (keys %vfuncs)) { - $cume += $vfuncs{$func}{sec}; - printf +("%6.2f %9.2f %8.2f %8d %-${design_width}s %s\n", - $vfuncs{$func}{pct}, - $cume, - $vfuncs{$func}{sec}, - $vfuncs{$func}{calls}, - $vfuncs{$func}{design}, - $func); - } -} - -####################################################################### -__END__ - -=pod - -=head1 NAME - -verilator_profcfunc - Read gprof report created with --prof-cfuncs - -=head1 SYNOPSIS - - verilator --prof-cfuncs .... - gcc .... - {run executable} - gprof - verilator_profcfuncs gprof.out - -=head1 DESCRIPTION - -Verilator_profcfunc reads a profile report created by gprof. The names of +parser = argparse.ArgumentParser( + allow_abbrev=False, + formatter_class=argparse.RawDescriptionHelpFormatter, + description="""Read gprof report created with --prof-cfuncs""", + epilog= + """Verilator_profcfunc reads a profile report created by gprof. The names of the functions are then transformed, assuming the user used Verilator's --prof-cfuncs, and a report printed showing the percentage of time, etc, in each Verilog block. For documentation see -L. +https://verilator.org/guide/latest/exe_verilator_profcfuncs.html -=head1 ARGUMENT SUMMARY - - Input file (gprof.out) - --help Display this help - -=head1 DISTRIBUTION - -The latest version is available from L. - -Copyright 2007-2021 by Wilson Snyder. This program is free software; you +Copyright 2002-2021 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 +SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0""") -=head1 SEE ALSO +parser.add_argument('--debug', + action='store_const', + const=9, + help='enable debug') +parser.add_argument('filename', help='input gprof output to process') -C - -and L for -detailed documentation. - -=cut +Args = parser.parse_args() +profcfunc(Args.filename) ###################################################################### -### Local Variables: -### compile-command: "$V4/bin/verilator_profcfunc $V4/test_c/obj_dir/V*_03_*.tree $V4N/test_c/obj_dir/V*_03_*.tree" -### End: +# Local Variables: +# compile-command: "./verilator_profcfunc ../test_regress/t/t_profcfunc.gprof" +# End: From 496b9f9c6387ae2c10718249fee1f7fbd4557a99 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 4 Sep 2021 08:27:59 -0400 Subject: [PATCH 09/65] Tests: Add difftree test. --- test_regress/driver.pl | 2 ++ test_regress/t/t_difftree.a.tree | 11 +++++++++++ test_regress/t/t_difftree.b.tree | 11 +++++++++++ test_regress/t/t_difftree.out | 8 ++++++++ test_regress/t/t_difftree.pl | 21 +++++++++++++++++++++ 5 files changed, 53 insertions(+) create mode 100644 test_regress/t/t_difftree.a.tree create mode 100644 test_regress/t/t_difftree.b.tree create mode 100644 test_regress/t/t_difftree.out create mode 100755 test_regress/t/t_difftree.pl diff --git a/test_regress/driver.pl b/test_regress/driver.pl index 240049350..9a04b9ebd 100755 --- a/test_regress/driver.pl +++ b/test_regress/driver.pl @@ -2179,6 +2179,8 @@ sub files_identical { && !/^dot [^\n]+\n/ && !/^In file: .*\/sc_.*:\d+/ && !/^libgcov.*/ + && !/--- \/tmp\// # t_difftree.pl + && !/\+\+\+ \/tmp\// # t_difftree.pl } @l1; @l1 = map { s/(Internal Error: [^\n]+\.cpp):[0-9]+:/$1:#:/; diff --git a/test_regress/t/t_difftree.a.tree b/test_regress/t/t_difftree.a.tree new file mode 100644 index 000000000..5d6c8ea90 --- /dev/null +++ b/test_regress/t/t_difftree.a.tree @@ -0,0 +1,11 @@ +Verilator Tree Dump (format 0x3900) from to + NETLIST 0x555556bb6000 {a0aa} $root [1ps/1ps] + 1: MODULE 0x555556bc0120 {d19ai} t L2 [1ps] + 1:2: PORT 0x555556bc60d0 {d21ae} clk + 1:2: VAR 0x555556bbe180 {d23ak} @dt=0@ clk INPUT PORT + 1:2:1: BASICDTYPE 0x555556bc61a0 {d23ak} @dt=this@(nw0) LOGIC_IMPLICIT kwd=LOGIC_IMPLICIT + 3: TYPETABLE 0x555556bbc000 {a0aa} + logic -> BASICDTYPE 0x555556c71a00 {d55ap} @dt=this@(G/nw1) logic [GENERIC] kwd=logic + 3: CONSTPOOL 0x555556bbe000 {a0aa} + 3:1: MODULE 0x555556bc0000 {a0aa} @CONST-POOL@ L0 [NONE] + 3:1:2: SCOPE 0x555556bb60f0 {a0aa} @CONST-POOL@ [abovep=0] [cellp=0] [modp=0x555556bc0000] diff --git a/test_regress/t/t_difftree.b.tree b/test_regress/t/t_difftree.b.tree new file mode 100644 index 000000000..8fa15a731 --- /dev/null +++ b/test_regress/t/t_difftree.b.tree @@ -0,0 +1,11 @@ +Verilator Tree Dump (format 0x3900) from to + NETLIST 0x55d6994da000 {a0aa} $root [1ps/1ps] + 1: MODULE 0x55d6994e4120 {d19ai} t L2 [1ps] + 1:2: PORT 0x55d6994ea0d0 {d21ae} clk + 1:2: VAR 0x55d6994e2180 {d23ak} @dt=0@ clkmod INPUT PORT + 1:2:1: BASICDTYPE 0x55d6994ea1a0 {d23ak} @dt=this@(nw0) LOGIC_IMPLICIT kwd=LOGIC_IMPLICIT + 3: TYPETABLE 0x55d6994e0000 {a0aa} + logic -> BASICDTYPE 0x55d699595a00 {d55ap} @dt=this@(G/nw1) logic [GENERIC] kwd=logic + 3: CONSTPOOL 0x55d6994e2000 {a0aa} + 3:1: MODULE 0x55d6994e4000 {a0aa} @CONST-POOL@ L0 [NONE] + 3:1:2: SCOPE 0x55d6994da0f0 {a0aa} @CONST-POOL@ [abovep=0] [cellp=0] [modp=0x55d6994e4000] diff --git a/test_regress/t/t_difftree.out b/test_regress/t/t_difftree.out new file mode 100644 index 000000000..505086b2f --- /dev/null +++ b/test_regress/t/t_difftree.out @@ -0,0 +1,8 @@ +@@ -2,7 +2,7 @@ + NETLIST 0x {a0aa} $root [1ps/1ps] + 1: MODULE 0x {d19ai} t L2 [1ps] + 1:2: PORT 0x {d21ae} clk ++ 1:2: VAR 0x {d23ak} @dt=0@ clkmod INPUT PORT + 1:2:1: BASICDTYPE 0x {d23ak} @dt=this@(nw0) LOGIC_IMPLICIT kwd=LOGIC_IMPLICIT + 3: TYPETABLE 0x {a0aa} + logic -> BASICDTYPE 0x {d55ap} @dt=this@(G/nw1) logic [GENERIC] kwd=logic diff --git a/test_regress/t/t_difftree.pl b/test_regress/t/t_difftree.pl new file mode 100755 index 000000000..cafc17d66 --- /dev/null +++ b/test_regress/t/t_difftree.pl @@ -0,0 +1,21 @@ +#!/usr/bin/env perl +if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; } +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2003 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 + +scenarios(vlt_all => 1); + +run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_difftree" + ." $Self->{t_dir}/t_difftree.a.tree $Self->{t_dir}/t_difftree.b.tree > diff.log"], + check_finished => 0); + +files_identical("$Self->{obj_dir}/diff.log", $Self->{golden_filename}, 'logfile'); + +ok(1); + +1; From 18c543f2f2005830b881a3aecec6bd71ccf71d00 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 4 Sep 2021 09:31:22 -0400 Subject: [PATCH 10/65] Convert verilator_difftree to Python --- Makefile.in | 18 +-- bin/verilator_difftree | 306 ++++++++++++++--------------------------- 2 files changed, 107 insertions(+), 217 deletions(-) diff --git a/Makefile.in b/Makefile.in index bc680bab5..83e4518a0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -118,23 +118,6 @@ INFOS = verilator.html verilator.pdf INFOS_OLD = README README.html README.pdf -INST_PROJ_FILES = \ - bin/verilator \ - bin/verilator_ccache_report \ - bin/verilator_coverage \ - bin/verilator_gantt \ - bin/verilator_includer \ - bin/verilator_profcfunc \ - include/verilated.mk \ - include/*.[chv]* \ - include/gtkwave/*.[chv]* \ - include/vltstd/*.[chv]* \ - -INST_PROJ_BIN_FILES = \ - bin/verilator_bin$(EXEEXT) \ - bin/verilator_bin_dbg$(EXEEXT) \ - bin/verilator_coverage_bin_dbg$(EXEEXT) \ - EXAMPLES_FIRST = \ examples/make_hello_c \ examples/make_hello_sc \ @@ -369,6 +352,7 @@ clang-format: PY_PROGRAMS = \ bin/verilator_ccache_report \ + bin/verilator_difftree \ bin/verilator_profcfunc \ examples/xml_py/vl_file_copy \ examples/xml_py/vl_hier_graph \ diff --git a/bin/verilator_difftree b/bin/verilator_difftree index 52b03d6bb..ab612bc5c 100755 --- a/bin/verilator_difftree +++ b/bin/verilator_difftree @@ -1,233 +1,139 @@ -#!/usr/bin/env perl -# See copyright, etc in below POD section. +#!/usr/bin/env python3 +# pylint: disable=C0103,C0114,C0116 ###################################################################### -use warnings; -use Getopt::Long; -use IO::File; -use Pod::Usage; -use strict; -use vars qw($Debug); +import argparse +import collections +import glob +import os.path +import re +import sys -#====================================================================== -# main -$Debug = 0; -my $Opt_A; -my $Opt_B; -my $Opt_Lineno = 1; -autoflush STDOUT 1; -autoflush STDERR 1; -Getopt::Long::config("no_auto_abbrev"); -if (! GetOptions( - "help" => \&usage, - "debug" => \&debug, - "<>" => \¶meter, - "lineno!" => \$Opt_Lineno, - )) { - die "%Error: Bad usage, try 'verilator_difftree --help'\n"; -} +def diff(a, b): -defined $Opt_A or die "%Error: No old diff filename\n"; -defined $Opt_B or die "%Error: No new diff filename\n"; + if not os.path.exists(a): + sys.exit("%Error: No old diff filename found: " + a) + if not os.path.exists(b): + sys.exit("%Error: No new diff filename found: " + b) --e $Opt_A or die "%Error: No old diff filename found: $Opt_A\n"; --e $Opt_B or die "%Error: No new diff filename found: $Opt_B\n"; + if os.path.isdir(a) and os.path.isdir(b): + diff_dir(a, b) + elif os.path.isfile(a) and os.path.isfile(b): + diff_file(a, b) + else: + sys.exit("%Error: Mix of files and dirs") -if (-d $Opt_A && -d $Opt_B) { - diff_dir($Opt_A, $Opt_B); -} elsif (-f $Opt_A && -f $Opt_B) { - diff_file($Opt_A, $Opt_B); -} else { - die "%Error: Mix of files and dirs\n"; -} -sub diff_dir { - my $a = shift; - my $b = shift; +def diff_dir(a, b): # Diff all files under two directories - my %files; + files = collections.defaultdict(lambda: {}) - foreach my $fn (glob("$a/*.tree")) { - (my $base = $fn) =~ s!.*/!!; - $files{$base}{a} = $fn; - } - foreach my $fn (glob("$b/*.tree")) { - (my $base = $fn) =~ s!.*/!!; - $files{$base}{b} = $fn; - } - my $any; - foreach my $base (sort (keys %files)) { - my $a = $files{$base}{a}; - my $b = $files{$base}{b}; - next if !$a || !$b; - print "="x70,"\n"; - print "= $a <-> $b\n"; - diff_file($a,$b); - $any = 1; - } - $any or warn("%Warning: No .tree files found that have similar base names:\n " - .join("\n ", sort keys %files),"\n"); -} + for fn in glob.glob(a + "/*.tree"): + base = re.sub(r'.*/', '', fn) + files[base]['a'] = fn + for fn in glob.glob(b + "/*.tree"): + base = re.sub(r'.*/', '', fn) + files[base]['b'] = fn -sub diff_file { - my $a = shift; - my $b = shift; + anyfile = False + for base in sorted(files.keys()): + a = files[base]['a'] + b = files[base]['b'] + if not a or not b: + continue + print("=" * 70) + print("= %s <-> %s" % (a, b)) + diff_file(a, b) + anyfile = True + if not anyfile: + sys.stderr.write( + "%Warning: No .tree files found that have similar base names\n") + + +def diff_file(a, b): # Compare the two tree files - (my $short_a = $a) =~ s/[^a-zA-Z0-9.]+/_/g; - (my $short_b = $b) =~ s/[^a-zA-Z0-9.]+/_/g; - my $tmp_a = "/tmp/${$}_${short_a}.a"; - my $tmp_b = "/tmp/${$}_${short_b}.b"; + short_a = re.sub(r'[^a-zA-Z0-9.]+', '_', a) + short_b = re.sub(r'[^a-zA-Z0-9.]+', '_', b) + tmp_a = "/tmp/%s_%s.a" % (os.getpid(), short_a) + tmp_b = "/tmp/%s_%s.b" % (os.getpid(), short_b) - my $vera = version_from($a); - my $verb = version_from($b); - my $verCvt = (($vera < 0x3900 && $verb >= 0x3900) - || ($vera >= 0x3900 && $verb < 0x3900)); + # Version conversion deprecated, but for future... + # vera = version_from(a) + # verb = version_from(b) + # verCvt = ((vera < 0x3900 and verb >= 0x3900) + # or (vera >= 0x3900 and verb < 0x3900)) - filter($a, $tmp_a, $verCvt); - filter($b, $tmp_b, $verCvt); - system("diff -u $tmp_a $tmp_b"); - unlink $tmp_a; - unlink $tmp_b; -} + filterf(a, tmp_a) + filterf(b, tmp_b) + os.system("diff -u " + tmp_a + " " + tmp_b) + os.unlink(tmp_a) + os.unlink(tmp_b) -sub version_from { - my $fn = shift; + +def version_from(filename): # Return dump format - my $f1 = IO::File->new ($fn) or die "%Error: $! $fn,"; - while (defined (my $line=$f1->getline())) { - last if $. > 10; - return hex $1 if $line =~ /\(format (0x[0-9.]+)\)/; - } - return 1.0; -} + with open(filename) as fh: + lineno = 0 + for line in fh: + if lineno > 10: + break + match = re.search(r'format (0x[0-9.]+)', line) + if match: + return hex(match.group(1)) + return 1.0 -sub filter { - my $fn1 = shift; - my $fn2 = shift; - my $verCvt = shift; + +def filterf(fn1, fn2): # Remove hex numbers before diffing - my $f1 = IO::File->new ($fn1) or die "%Error: $! $fn1,"; - my $f2 = IO::File->new ($fn2,"w") or die "%Error: $! $fn2,"; - while (defined (my $line=$f1->getline())) { - same_line: - next if $line =~ / This=/; - $line =~ s/0x[a-f0-9]+/0x/g; - $line =~ s///g; - $line =~ s/{[a-z]*\d+}/{}/g if !$Opt_Lineno; - if ($verCvt) { - next if $line =~ /^ NETLIST/; - if ($line =~ /: ([A-Z]+) /) { - my $type = $1; - next if $type =~ 'DTYPE'; - if ($type eq 'TYPETABLE' || $type eq 'RANGE') { - $line =~ /^(\s+\S+:) /; my $prefix = $1; - while (defined ($line=$f1->getline())) { - next if $line =~ /^\s+[a-z]/; # Table body - next if $line =~ /^${prefix}[0-9]:/; - goto same_line; - } - next; - } - } - } - print $f2 $line; - } - $f1->close; - $f2->close; -} + with open(fn1) as fh1: + with open(fn2, "w") as fh2: + for line in fh1: + if re.search(r' This=', line): + continue + line = re.sub(r'0x[a-f0-9]+', '0x', line) + line = re.sub(r'', '', line) + if not Args.no_lineno: + line = re.sub(r'{[a-z]*\d+}', '{}', line) + fh2.write(line) -#---------------------------------------------------------------------- -sub usage { - pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT); - exit(1); # Unreachable -} +###################################################################### +###################################################################### -sub debug { - $Debug = 1; -} - -sub parameter { - my $param = shift; - if (!defined $Opt_A) { - $Opt_A = $param; - } elsif (!defined $Opt_B) { - $Opt_B = $param; - } else { - die "%Error: Unknown parameter: $param\n"; - } -} - -####################################################################### - -sub run { - # Run a system command, check errors - my $command = shift; - print "\t$command\n"; - system "$command"; - my $status = $?; - ($status == 0) or die "%Error: Command Failed $command, $status, stopped"; -} - -####################################################################### -__END__ - -=pod - -=head1 NAME - -verilator_difftree - Compare two Verilator debugging trees - -=head1 SYNOPSIS - - verilator_difftree .../a/a.tree .../b/a.tree - verilator_difftree .../a .../b - -=head1 DESCRIPTION - -Verilator_difftree is used for debugging Verilator tree output files. It -performs a diff between two files, or all files common between two +parser = argparse.ArgumentParser( + allow_abbrev=False, + formatter_class=argparse.RawDescriptionHelpFormatter, + description="""Compare two Verilator debugging trees""", + epilog= + """Verilator_difftree is used for debugging Verilator tree output files. +It performs a diff between two files, or all files common between two directories, ignoring irrelevant pointer differences. -=head1 ARGUMENTS - -=over 4 - -=item --help - -Displays this message and program version and exits. - -=item --nolineno - -Do not show differences in line numbering. - -=back - -=head1 DISTRIBUTION - -The latest version is available from L. +For documentation see +https://verilator.org/guide/latest/exe_verilator_difftree.html Copyright 2005-2021 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 +SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0""") -=head1 AUTHORS +parser.add_argument('--debug', + action='store_const', + const=9, + help='enable debug') +parser.add_argument('--no-lineno', + action='store_false', + help='do not show differences in line numbering') +parser.add_argument('filea', help='input file a to diff') +parser.add_argument('fileb', help='input file b to diff') -Wilson Snyder - -=head1 SEE ALSO - -C - -and L for detailed documentation. - -=cut +Args = parser.parse_args() +diff(Args.filea, Args.fileb) ###################################################################### -### Local Variables: -### compile-command: "$V4/bin/verilator_difftree {$V4D,$V4}/test_regress/obj_dir/t_EXAMPLE/V*_03_*.tree" -### End: +# Local Variables: +# compile-command: "./verilator_difftree ../test_regress/t/t_difftree.{a,b}.tree" +# End: From 1cb8091125432ce8909cb9d4b858c56dcb4c870a Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 4 Sep 2021 12:28:26 -0400 Subject: [PATCH 11/65] verilator_profcfunc: Also allow eval_step. --- bin/verilator_profcfunc | 6 +-- test_regress/t/t_profcfunc.out | 74 +++++++++++++++++----------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/bin/verilator_profcfunc b/bin/verilator_profcfunc index 65eeeb67f..5d02d1ea5 100755 --- a/bin/verilator_profcfunc +++ b/bin/verilator_profcfunc @@ -52,7 +52,7 @@ def profcfunc(filename): # Find modules verilated_mods = {} for func in funcs: - match = re.search(r'(.*)::eval\(', func) + match = re.search(r'(.*)::eval(_step)?\(', func) if match: prefix = match.group(1) if Args.debug: @@ -153,7 +153,7 @@ def profcfunc(filename): print() print(" % cumulative self ") - print((" time seconds seconds calls %-" + str(design_width) + + print((" time seconds seconds calls %-" + str(design_width) + "s type filename and line number") % "design") cume = 0 @@ -161,7 +161,7 @@ def profcfunc(filename): key=lambda f: vfuncs[f]['sec'], reverse=True): cume += vfuncs[func]['sec'] - print(("%6.2f %9.2f %8.2f %8d %-" + str(design_width) + "s %s") % + print(("%6.2f %9.2f %8.2f %10d %-" + str(design_width) + "s %s") % (vfuncs[func]['pct'], cume, vfuncs[func]['sec'], vfuncs[func]['calls'], vfuncs[func]['design'], func)) diff --git a/test_regress/t/t_profcfunc.out b/test_regress/t/t_profcfunc.out index fb22d5c8e..3dd28dfef 100644 --- a/test_regress/t/t_profcfunc.out +++ b/test_regress/t/t_profcfunc.out @@ -30,40 +30,40 @@ Verilog code profile: VLib: Time in Verilated common libraries, called by the Verilated code % cumulative self - time seconds seconds calls design type filename and line number - 3.27 1.27 1.27 200 Vt_prof VBlock t_prof:31 - 1.99 2.26 0.99 200578 - VLib VL_EXTENDS_QQ(int, int, unsigned long) - 1.98 3.24 0.98 100000 - VLib VL_POWSS_QQQ(int, int, int, unsigned long, unsigned long, bool, bool) - 1.89 4.13 0.89 1407 - VLib Verilated::debug() - 1.88 5.01 0.88 202 - VLib VerilatedContext::gotFinish() const - 1.87 5.88 0.87 6 - VLib VerilatedContext::randReset() - 1.86 6.74 0.86 9 - C++ VlWide<2ul>::operator unsigned int*() - 1.79 7.53 0.79 600 Vt_prof VCommon Vt_prof* const& std::__get_helper<0ul, Vt_prof*, std::default_delete >(std::_Tuple_impl<0ul, Vt_prof*, std::default_delete > const&) - 1.78 8.31 0.78 3 Vt_prof VCommon Vt_prof*& std::__get_helper<0ul, Vt_prof*, std::default_delete >(std::_Tuple_impl<0ul, Vt_prof*, std::default_delete >&) - 1.77 9.08 0.77 1 Vt_prof VCommon Vt_prof::Vt_prof(VerilatedContext*, char const*) - 1.76 9.84 0.76 1 Vt_prof VCommon Vt_prof::Vt_prof(char const*) - 1.75 10.59 0.75 200 Vt_prof VCommon Vt_prof::eval() - 1.74 11.33 0.74 200 Vt_prof VCommon Vt_prof::eval_step() - 1.73 12.06 0.73 1 Vt_prof VCommon Vt_prof::final() - 1.72 12.78 0.72 1 Vt_prof VCommon Vt_prof::~Vt_prof() - 1.71 13.49 0.71 1 Vt_prof VCommon Vt_prof__Syms::Vt_prof__Syms(VerilatedContext*, char const*, Vt_prof*) - 1.70 14.19 0.70 1 Vt_prof VCommon Vt_prof__Syms::~Vt_prof__Syms() - 1.69 14.88 0.69 1 Vt_prof VCommon Vt_prof___024root::__Vconfigure(Vt_prof__Syms*, bool) - 1.68 15.56 0.68 1 Vt_prof VCommon Vt_prof___024root::Vt_prof___024root(char const*) - 1.67 16.23 0.67 1 Vt_prof VCommon Vt_prof___024root::~Vt_prof___024root() - 1.66 16.89 0.66 201 Vt_prof VCommon Vt_prof___024root___eval(Vt_prof___024root*) - 1.65 17.54 0.65 200 Vt_prof VCommon Vt_prof___024root___eval_debug_assertions(Vt_prof___024root*) - 1.62 18.16 0.62 100 Vt_prof VBlock t_prof:30 - 1.61 18.77 0.61 1 Vt_prof VCommon Vt_prof___024root___final(Vt_prof___024root*) - 1.60 19.37 0.60 1 Vt_prof VCommon Vt_prof___024root___eval_settle(Vt_prof___024root*) - 1.59 19.96 0.59 1 Vt_prof VCommon Vt_prof___024root___eval_initial(Vt_prof___024root*) - 1.58 20.54 0.58 1 Vt_prof VCommon Vt_prof___024root___ctor_var_reset(Vt_prof___024root*) - 1.57 21.11 0.57 1 Vt_prof VBlock t_prof:13 - 1.30 21.41 0.30 1 Vt_prof VCommon _eval_initial_loop(Vt_prof__Syms*) - 1.29 21.70 0.29 1 - VLib _vl_cmp_w(int, unsigned int const*, unsigned int const*) - 1.28 21.98 0.28 2 - VLib _vl_moddiv_w(int, unsigned int*, unsigned int const*, unsigned int const*, bool) - 1.27 22.25 0.27 2 - VLib _vl_vsformat(std::__cxx11::basic_string, std::allocator >&, char const*, __va_list_tag*) - 1.26 22.51 0.26 1399 - C++ std::unique_ptr >::get() const - 1.25 22.76 0.25 3 - C++ unsigned long const& std::max(unsigned long const&, unsigned long const&) - 1.19 22.95 0.19 1 - VLib vl_finish(char const*, int, char const*) - 1.18 23.13 0.18 2 - VLib vl_time_pow10(int) + time seconds seconds calls design type filename and line number + 3.27 1.27 1.27 200 Vt_prof VBlock t_prof:31 + 1.99 2.26 0.99 200578 - VLib VL_EXTENDS_QQ(int, int, unsigned long) + 1.98 3.24 0.98 100000 - VLib VL_POWSS_QQQ(int, int, int, unsigned long, unsigned long, bool, bool) + 1.89 4.13 0.89 1407 - VLib Verilated::debug() + 1.88 5.01 0.88 202 - VLib VerilatedContext::gotFinish() const + 1.87 5.88 0.87 6 - VLib VerilatedContext::randReset() + 1.86 6.74 0.86 9 - C++ VlWide<2ul>::operator unsigned int*() + 1.79 7.53 0.79 600 Vt_prof VCommon Vt_prof* const& std::__get_helper<0ul, Vt_prof*, std::default_delete >(std::_Tuple_impl<0ul, Vt_prof*, std::default_delete > const&) + 1.78 8.31 0.78 3 Vt_prof VCommon Vt_prof*& std::__get_helper<0ul, Vt_prof*, std::default_delete >(std::_Tuple_impl<0ul, Vt_prof*, std::default_delete >&) + 1.77 9.08 0.77 1 Vt_prof VCommon Vt_prof::Vt_prof(VerilatedContext*, char const*) + 1.76 9.84 0.76 1 Vt_prof VCommon Vt_prof::Vt_prof(char const*) + 1.75 10.59 0.75 200 Vt_prof VCommon Vt_prof::eval() + 1.74 11.33 0.74 200 Vt_prof VCommon Vt_prof::eval_step() + 1.73 12.06 0.73 1 Vt_prof VCommon Vt_prof::final() + 1.72 12.78 0.72 1 Vt_prof VCommon Vt_prof::~Vt_prof() + 1.71 13.49 0.71 1 Vt_prof VCommon Vt_prof__Syms::Vt_prof__Syms(VerilatedContext*, char const*, Vt_prof*) + 1.70 14.19 0.70 1 Vt_prof VCommon Vt_prof__Syms::~Vt_prof__Syms() + 1.69 14.88 0.69 1 Vt_prof VCommon Vt_prof___024root::__Vconfigure(Vt_prof__Syms*, bool) + 1.68 15.56 0.68 1 Vt_prof VCommon Vt_prof___024root::Vt_prof___024root(char const*) + 1.67 16.23 0.67 1 Vt_prof VCommon Vt_prof___024root::~Vt_prof___024root() + 1.66 16.89 0.66 201 Vt_prof VCommon Vt_prof___024root___eval(Vt_prof___024root*) + 1.65 17.54 0.65 200 Vt_prof VCommon Vt_prof___024root___eval_debug_assertions(Vt_prof___024root*) + 1.62 18.16 0.62 100 Vt_prof VBlock t_prof:30 + 1.61 18.77 0.61 1 Vt_prof VCommon Vt_prof___024root___final(Vt_prof___024root*) + 1.60 19.37 0.60 1 Vt_prof VCommon Vt_prof___024root___eval_settle(Vt_prof___024root*) + 1.59 19.96 0.59 1 Vt_prof VCommon Vt_prof___024root___eval_initial(Vt_prof___024root*) + 1.58 20.54 0.58 1 Vt_prof VCommon Vt_prof___024root___ctor_var_reset(Vt_prof___024root*) + 1.57 21.11 0.57 1 Vt_prof VBlock t_prof:13 + 1.30 21.41 0.30 1 Vt_prof VCommon _eval_initial_loop(Vt_prof__Syms*) + 1.29 21.70 0.29 1 - VLib _vl_cmp_w(int, unsigned int const*, unsigned int const*) + 1.28 21.98 0.28 2 - VLib _vl_moddiv_w(int, unsigned int*, unsigned int const*, unsigned int const*, bool) + 1.27 22.25 0.27 2 - VLib _vl_vsformat(std::__cxx11::basic_string, std::allocator >&, char const*, __va_list_tag*) + 1.26 22.51 0.26 1399 - C++ std::unique_ptr >::get() const + 1.25 22.76 0.25 3 - C++ unsigned long const& std::max(unsigned long const&, unsigned long const&) + 1.19 22.95 0.19 1 - VLib vl_finish(char const*, int, char const*) + 1.18 23.13 0.18 2 - VLib vl_time_pow10(int) From 72f198d79ede83350ed6a068cc50024f67b58535 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 4 Sep 2021 12:44:13 -0400 Subject: [PATCH 12/65] Tests: Add t_gantt_io test --- test_regress/t/t_difftree.pl | 2 +- test_regress/t/t_gantt_io.dat | 20 ++++ test_regress/t/t_gantt_io.out | 38 +++++++ test_regress/t/t_gantt_io.pl | 22 ++++ test_regress/t/t_gantt_io_vcd.out | 173 ++++++++++++++++++++++++++++++ test_regress/t/t_profcfunc.pl | 2 +- 6 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 test_regress/t/t_gantt_io.dat create mode 100644 test_regress/t/t_gantt_io.out create mode 100755 test_regress/t/t_gantt_io.pl create mode 100644 test_regress/t/t_gantt_io_vcd.out diff --git a/test_regress/t/t_difftree.pl b/test_regress/t/t_difftree.pl index cafc17d66..b26bb4757 100755 --- a/test_regress/t/t_difftree.pl +++ b/test_regress/t/t_difftree.pl @@ -8,7 +8,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di # Version 2.0. # SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 -scenarios(vlt_all => 1); +scenarios(dist => 1); run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_difftree" ." $Self->{t_dir}/t_difftree.a.tree $Self->{t_dir}/t_difftree.b.tree > diff.log"], diff --git a/test_regress/t/t_gantt_io.dat b/test_regress/t/t_gantt_io.dat new file mode 100644 index 000000000..e88efc510 --- /dev/null +++ b/test_regress/t/t_gantt_io.dat @@ -0,0 +1,20 @@ +VLPROFTHREAD 1.0 # Verilator thread profile dump version 1.0 +VLPROF arg --threads 2 +VLPROF arg +verilator+prof+threads+start+2 +VLPROF arg +verilator+prof+threads+window+2 +VLPROF stat yields 1 +VLPROF mtask 6 start 595 end 735 elapsed 140 predict_time 30 cpu 1 on thread 1 +VLPROF mtask 10 start 8120 end 8260 elapsed 140 predict_time 30 cpu 1 on thread 1 +VLPROF mtask 6 start 11970 end 12075 elapsed 105 predict_time 30 cpu 1 on thread 1 +VLPROF mtask 10 start 15925 end 16065 elapsed 140 predict_time 30 cpu 1 on thread 1 +VLPROF mtask 5 start 5110 end 5530 elapsed 420 predict_time 30 cpu 16 on thread 2 +VLPROF mtask 7 start 5740 end 5845 elapsed 105 predict_time 30 cpu 16 on thread 2 +VLPROF mtask 8 start 6125 end 7140 elapsed 1015 predict_time 107 cpu 16 on thread 2 +VLPROF mtask 9 start 8820 end 9380 elapsed 560 predict_time 30 cpu 16 on thread 2 +VLPROF mtask 11 start 9940 end 10045 elapsed 105 predict_time 30 cpu 16 on thread 2 +VLPROF mtask 5 start 14175 end 14595 elapsed 420 predict_time 30 cpu 16 on thread 2 +VLPROF mtask 7 start 15120 end 15190 elapsed 70 predict_time 30 cpu 16 on thread 2 +VLPROF mtask 8 start 15365 end 15435 elapsed 70 predict_time 107 cpu 16 on thread 2 +VLPROF mtask 9 start 15680 end 15750 elapsed 70 predict_time 30 cpu 16 on thread 2 +VLPROF mtask 11 start 15925 end 15995 elapsed 70 predict_time 30 cpu 16 on thread 2 +VLPROF stat ticks 17220 diff --git a/test_regress/t/t_gantt_io.out b/test_regress/t/t_gantt_io.out new file mode 100644 index 000000000..ad02d1e79 --- /dev/null +++ b/test_regress/t/t_gantt_io.out @@ -0,0 +1,38 @@ +Verilator Gantt report + +Argument settings: + +verilator+prof+threads+start+2 + +verilator+prof+threads+window+2 + --threads 2 + +Thread gantt graph: + Legend: One character width = 200 rdtsc ticks + Legend: '&' = multiple mtasks in this period (character width) + <-16065 rdtsc total------------------------------------------------------------> + t: [1] [1] [1] [1] + t: [xx[x[16--] [16] [16] [16] [[x[[16] + +Analysis: + Total threads = 2 + Total mtasks = 7 + Total cpus used = 2 + Total yields = 1 + Total eval time = 16065 rdtsc ticks + Longest mtask time = 1085 rdtsc ticks + All-thread mtask time = 3430 rdtsc ticks + Longest-thread efficiency = 6.8% + All-thread efficiency = 10.7% + All-thread speedup = 0.2 + +Statistics: + min log(p2e) = -3.332 from mtask 5 (predict 30, elapsed 840) + max log(p2e) = -1.764 from mtask 11 (predict 30, elapsed 175) + mean = -2.365 + stddev = 0.562 + e ^ stddev = 1.754 + +CPUs: + cpu 1: cpu_time=525 socket=0 core=1 AMD Ryzen 9 3950X 16-Core Processor + cpu 16: cpu_time=2905 socket=0 core=0 AMD Ryzen 9 3950X 16-Core Processor + +Writing profile_threads.vcd diff --git a/test_regress/t/t_gantt_io.pl b/test_regress/t/t_gantt_io.pl new file mode 100755 index 000000000..77137b081 --- /dev/null +++ b/test_regress/t/t_gantt_io.pl @@ -0,0 +1,22 @@ +#!/usr/bin/env perl +if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; } +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2003 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 + +scenarios(dist => 1); + +run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_gantt $Self->{t_dir}/t_gantt_io.dat > gantt.log"], + check_finished => 0); + +files_identical("$Self->{obj_dir}/gantt.log", $Self->{golden_filename}); + +vcd_identical("$Self->{obj_dir}/profile_threads.vcd", "$Self->{t_dir}/t_gantt_io_vcd.out"); + +ok(1); + +1; diff --git a/test_regress/t/t_gantt_io_vcd.out b/test_regress/t/t_gantt_io_vcd.out new file mode 100644 index 000000000..a416d794f --- /dev/null +++ b/test_regress/t/t_gantt_io_vcd.out @@ -0,0 +1,173 @@ +$version Generated by verilator_gantt $end +$timescale 1ns $end + + $scope module gantt $end + $scope module Stats $end + $var wire 32 vb parallelism [31:0] $end + $upscope $end + $scope module cpus $end + $var wire 32 v1 cpu16_thread [31:0] $end + $var wire 32 v8 cpu1_thread [31:0] $end + $upscope $end + $scope module mtasks $end + $var wire 32 va mtask10_cpu [31:0] $end + $var wire 32 v6 mtask11_cpu [31:0] $end + $var wire 32 v2 mtask5_cpu [31:0] $end + $var wire 32 v9 mtask6_cpu [31:0] $end + $var wire 32 v3 mtask7_cpu [31:0] $end + $var wire 32 v4 mtask8_cpu [31:0] $end + $var wire 32 v5 mtask9_cpu [31:0] $end + $upscope $end + $scope module threads $end + $var wire 32 v7 thread1_mtask [31:0] $end + $var wire 32 v0 thread2_mtask [31:0] $end + $upscope $end + $upscope $end +$enddefinitions $end + +#595 +bz v0 +bz v1 +bz va +b1 vb +bz v2 +bz v3 +bz v4 +bz v5 +bz v6 +b110 v7 +b1 v8 +b1 v9 +#735 +b0 vb +bz v7 +bz v8 +bz v9 +#5110 +b101 v0 +b10 v1 +b1 vb +b10000 v2 +#5530 +bz v0 +bz v1 +b0 vb +bz v2 +#5740 +b111 v0 +b10 v1 +b1 vb +b10000 v3 +#5845 +bz v0 +bz v1 +b0 vb +bz v3 +#6125 +b1000 v0 +b10 v1 +b1 vb +b10000 v4 +#7140 +bz v0 +bz v1 +b0 vb +bz v4 +#8120 +b1 va +b1 vb +b1010 v7 +b1 v8 +#8260 +bz va +b0 vb +bz v7 +bz v8 +#8820 +b1001 v0 +b10 v1 +b1 vb +b10000 v5 +#9380 +bz v0 +bz v1 +b0 vb +bz v5 +#9940 +b1011 v0 +b10 v1 +b1 vb +b10000 v6 +#10045 +bz v0 +bz v1 +b0 vb +bz v6 +#11970 +b1 vb +b110 v7 +b1 v8 +b1 v9 +#12075 +b0 vb +bz v7 +bz v8 +bz v9 +#14175 +b101 v0 +b10 v1 +b1 vb +b10000 v2 +#14595 +bz v0 +bz v1 +b0 vb +bz v2 +#15120 +b111 v0 +b10 v1 +b1 vb +b10000 v3 +#15190 +bz v0 +bz v1 +b0 vb +bz v3 +#15365 +b1000 v0 +b10 v1 +b1 vb +b10000 v4 +#15435 +bz v0 +bz v1 +b0 vb +bz v4 +#15680 +b1001 v0 +b10 v1 +b1 vb +b10000 v5 +#15750 +bz v0 +bz v1 +b0 vb +bz v5 +#15925 +b1011 v0 +b10 v1 +b1 va +b10 vb +b10000 v6 +b1010 v7 +b1 v8 +#15995 +bz v0 +bz v1 +b1 vb +bz v6 +#16065 +bz va +b0 vb +bz v7 +bz v8 diff --git a/test_regress/t/t_profcfunc.pl b/test_regress/t/t_profcfunc.pl index f6d5ee8ae..8e0470809 100755 --- a/test_regress/t/t_profcfunc.pl +++ b/test_regress/t/t_profcfunc.pl @@ -8,7 +8,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di # Version 2.0. # SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 -scenarios(vlt_all => 1); +scenarios(dist => 1); run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_profcfunc $Self->{t_dir}/t_profcfunc.gprof > cfuncs.out"], check_finished => 0); From 8519dc1383cabb5516a63be49de771b4b7db1e0c Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 4 Sep 2021 13:48:16 -0400 Subject: [PATCH 13/65] Tests: Skip unstability --- test_regress/t/t_gantt_io.pl | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/test_regress/t/t_gantt_io.pl b/test_regress/t/t_gantt_io.pl index 77137b081..864f45c00 100755 --- a/test_regress/t/t_gantt_io.pl +++ b/test_regress/t/t_gantt_io.pl @@ -10,13 +10,21 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(dist => 1); -run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_gantt $Self->{t_dir}/t_gantt_io.dat > gantt.log"], - check_finished => 0); +if (1) { + skip("Skipping due to unstability with cpuinfo"); +} else { + check(); +} -files_identical("$Self->{obj_dir}/gantt.log", $Self->{golden_filename}); +sub check { + run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_gantt $Self->{t_dir}/t_gantt_io.dat > gantt.log"], + check_finished => 0); -vcd_identical("$Self->{obj_dir}/profile_threads.vcd", "$Self->{t_dir}/t_gantt_io_vcd.out"); + files_identical("$Self->{obj_dir}/gantt.log", $Self->{golden_filename}); -ok(1); + vcd_identical("$Self->{obj_dir}/profile_threads.vcd", "$Self->{t_dir}/t_gantt_io_vcd.out"); + + ok(1); +} 1; From cac0b0f316ec97c3e90cd860b74a4a973aa0f87a Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 4 Sep 2021 16:50:40 -0400 Subject: [PATCH 14/65] Tests: Fix t_gantt_io --- bin/verilator_gantt | 6 +- test_regress/t/t_gantt_io.pl | 21 +- test_regress/t/t_gantt_io_cpuinfo.dat | 896 ++++++++++++++++++++++++++ 3 files changed, 907 insertions(+), 16 deletions(-) create mode 100644 test_regress/t/t_gantt_io_cpuinfo.dat diff --git a/bin/verilator_gantt b/bin/verilator_gantt index 8d043670d..e45f19bf5 100755 --- a/bin/verilator_gantt +++ b/bin/verilator_gantt @@ -10,6 +10,7 @@ use Pod::Usage; use vars qw($Debug); $Debug = 0; +my $Opt_Cpuinfo = "/proc/cpuinfo"; my $Opt_File; my $Opt_Time_Per_Char = 0; # rdtsc ticks per char in gantt chart, 0=auto my $opt_vcd = "profile_threads.vcd"; @@ -23,6 +24,7 @@ autoflush STDERR 1; Getopt::Long::config("no_auto_abbrev"); if (! GetOptions( "help" => \&usage, + "cpuinfo=s" => \$Opt_Cpuinfo, # Testing, not documented "scale=i" => \$Opt_Time_Per_Char, "debug" => sub { $Debug = 1; }, "vcd=s" => \$opt_vcd, @@ -60,7 +62,7 @@ sub process { my $filename = shift; read_data($filename); - read_cpuinfo(); + read_cpuinfo($Opt_Cpuinfo); report(); } @@ -115,7 +117,7 @@ sub read_data { } sub read_cpuinfo { - my $filename = "/proc/cpuinfo"; + my $filename = shift; my $fh = IO::File->new("<$filename") or return; my $cpu; while (my $line = $fh->getline) { diff --git a/test_regress/t/t_gantt_io.pl b/test_regress/t/t_gantt_io.pl index 864f45c00..4f0041e7b 100755 --- a/test_regress/t/t_gantt_io.pl +++ b/test_regress/t/t_gantt_io.pl @@ -10,21 +10,14 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(dist => 1); -if (1) { - skip("Skipping due to unstability with cpuinfo"); -} else { - check(); -} +run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_gantt" + ." --cpuinfo $Self->{t_dir}/t_gantt_io_cpuinfo.dat" + ." $Self->{t_dir}/t_gantt_io.dat > gantt.log"], + check_finished => 0); -sub check { - run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_gantt $Self->{t_dir}/t_gantt_io.dat > gantt.log"], - check_finished => 0); +files_identical("$Self->{obj_dir}/gantt.log", $Self->{golden_filename}); - files_identical("$Self->{obj_dir}/gantt.log", $Self->{golden_filename}); - - vcd_identical("$Self->{obj_dir}/profile_threads.vcd", "$Self->{t_dir}/t_gantt_io_vcd.out"); - - ok(1); -} +vcd_identical("$Self->{obj_dir}/profile_threads.vcd", "$Self->{t_dir}/t_gantt_io_vcd.out"); +ok(1); 1; diff --git a/test_regress/t/t_gantt_io_cpuinfo.dat b/test_regress/t/t_gantt_io_cpuinfo.dat new file mode 100644 index 000000000..4585d9873 --- /dev/null +++ b/test_regress/t/t_gantt_io_cpuinfo.dat @@ -0,0 +1,896 @@ +processor : 0 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2203.060 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 0 +cpu cores : 16 +apicid : 0 +initial apicid : 0 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 1 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2192.482 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 1 +cpu cores : 16 +apicid : 2 +initial apicid : 2 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 2 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.034 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 2 +cpu cores : 16 +apicid : 4 +initial apicid : 4 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 3 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.861 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 3 +cpu cores : 16 +apicid : 6 +initial apicid : 6 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 4 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.736 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 4 +cpu cores : 16 +apicid : 8 +initial apicid : 8 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 5 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2192.116 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 5 +cpu cores : 16 +apicid : 10 +initial apicid : 10 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 6 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.236 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 6 +cpu cores : 16 +apicid : 12 +initial apicid : 12 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 7 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2194.216 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 7 +cpu cores : 16 +apicid : 14 +initial apicid : 14 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 8 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2197.502 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 8 +cpu cores : 16 +apicid : 16 +initial apicid : 16 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 9 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2194.929 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 9 +cpu cores : 16 +apicid : 18 +initial apicid : 18 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 10 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2194.423 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 10 +cpu cores : 16 +apicid : 20 +initial apicid : 20 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 11 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2193.157 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 11 +cpu cores : 16 +apicid : 22 +initial apicid : 22 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 12 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2182.263 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 12 +cpu cores : 16 +apicid : 24 +initial apicid : 24 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 13 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2509.976 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 13 +cpu cores : 16 +apicid : 26 +initial apicid : 26 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 14 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2179.424 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 14 +cpu cores : 16 +apicid : 28 +initial apicid : 28 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 15 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2183.384 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 15 +cpu cores : 16 +apicid : 30 +initial apicid : 30 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 16 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2193.777 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 0 +cpu cores : 16 +apicid : 1 +initial apicid : 1 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 17 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2190.659 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 1 +cpu cores : 16 +apicid : 3 +initial apicid : 3 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 18 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2189.525 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 2 +cpu cores : 16 +apicid : 5 +initial apicid : 5 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 19 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.475 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 3 +cpu cores : 16 +apicid : 7 +initial apicid : 7 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 20 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2187.858 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 4 +cpu cores : 16 +apicid : 9 +initial apicid : 9 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 21 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.358 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 5 +cpu cores : 16 +apicid : 11 +initial apicid : 11 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 22 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.161 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 6 +cpu cores : 16 +apicid : 13 +initial apicid : 13 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 23 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2187.812 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 7 +cpu cores : 16 +apicid : 15 +initial apicid : 15 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 24 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.371 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 8 +cpu cores : 16 +apicid : 17 +initial apicid : 17 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 25 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.530 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 9 +cpu cores : 16 +apicid : 19 +initial apicid : 19 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 26 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2191.688 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 10 +cpu cores : 16 +apicid : 21 +initial apicid : 21 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 27 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2195.968 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 11 +cpu cores : 16 +apicid : 23 +initial apicid : 23 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 28 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2018.474 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 12 +cpu cores : 16 +apicid : 25 +initial apicid : 25 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 29 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2249.337 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 13 +cpu cores : 16 +apicid : 27 +initial apicid : 27 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 30 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 1865.493 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 14 +cpu cores : 16 +apicid : 29 +initial apicid : 29 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + +processor : 31 +vendor_id : AuthenticAMD +cpu family : 23 +model : 113 +model name : AMD Ryzen 9 3950X 16-Core Processor +stepping : 0 +microcode : 0x8701013 +cpu MHz : 2015.595 +cache size : 512 KB +physical id : 0 +siblings : 32 +core id : 15 +cpu cores : 16 +apicid : 31 +initial apicid : 31 +fpu : yes +fpu_exception : yes +cpuid level : 16 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +bogomips : 6987.10 +TLB size : 3072 4K pages +clflush size : 64 +cache_alignment : 64 +address sizes : 43 bits physical, 48 bits virtual +power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] + From 35eac0c4573de5d516b5894ee656cbd117c89e13 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sun, 5 Sep 2021 11:33:20 -0400 Subject: [PATCH 15/65] Commentary: Fix profcfunc naming. --- bin/verilator_profcfunc | 2 +- ...rofcfuncs.rst => exe_verilator_profcfunc.rst} | 16 ++++++++++------ docs/guide/executables.rst | 2 +- docs/spelling.txt | 1 - 4 files changed, 12 insertions(+), 9 deletions(-) rename docs/guide/{exe_verilator_profcfuncs.rst => exe_verilator_profcfunc.rst} (58%) diff --git a/bin/verilator_profcfunc b/bin/verilator_profcfunc index 5d02d1ea5..1b564b5ec 100755 --- a/bin/verilator_profcfunc +++ b/bin/verilator_profcfunc @@ -180,7 +180,7 @@ the functions are then transformed, assuming the user used Verilator's in each Verilog block. For documentation see -https://verilator.org/guide/latest/exe_verilator_profcfuncs.html +https://verilator.org/guide/latest/exe_verilator_profcfunc.html Copyright 2002-2021 by Wilson Snyder. This program is free software; you can redistribute it and/or modify it under the terms of either the GNU diff --git a/docs/guide/exe_verilator_profcfuncs.rst b/docs/guide/exe_verilator_profcfunc.rst similarity index 58% rename from docs/guide/exe_verilator_profcfuncs.rst rename to docs/guide/exe_verilator_profcfunc.rst index f3ac26b81..1283e6f2a 100644 --- a/docs/guide/exe_verilator_profcfuncs.rst +++ b/docs/guide/exe_verilator_profcfunc.rst @@ -1,20 +1,24 @@ .. Copyright 2003-2021 by Wilson Snyder. .. SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 -verilator_profcfuncs -==================== +verilator_profcfunc +=================== Verilator_profcfunc reads a profile report created by gprof. The names of the functions are then transformed, assuming the user used Verilator's --prof-cfuncs, and a report printed showing the percentage of time, etc, in each Verilog block. -For an overview of use of verilator_profcfuncs, see :ref:`Profiling`. +Due to rounding errors in gprof reports, the input report's percentages may +not total to 100%. In the verilator_profcfunc report this will get +reported as a rounding error. -verilator_profcfuncs Arguments ------------------------------- +For an overview of use of verilator_profcfunc, see :ref:`Profiling`. -.. program:: verilator_profcfuncs +verilator_profcfunc Arguments +----------------------------- + +.. program:: verilator_profcfunc .. option:: diff --git a/docs/guide/executables.rst b/docs/guide/executables.rst index e9c3fc700..248553266 100644 --- a/docs/guide/executables.rst +++ b/docs/guide/executables.rst @@ -15,5 +15,5 @@ options to each executable. exe_verilator.rst exe_verilator_coverage.rst exe_verilator_gantt.rst - exe_verilator_profcfuncs.rst + exe_verilator_profcfunc.rst exe_sim.rst diff --git a/docs/spelling.txt b/docs/spelling.txt index 278dd6b76..82c6984da 100644 --- a/docs/spelling.txt +++ b/docs/spelling.txt @@ -676,7 +676,6 @@ prev printf printtimescale profcfunc -profcfuncs prototyptes ps pthread From d09b6a7d2c1ae6c187c4dd6361f7cd28cb3522b5 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sun, 5 Sep 2021 11:56:28 -0400 Subject: [PATCH 16/65] Include processor information in verilator_gantt data file. --- Changes | 1 + bin/verilator_gantt | 34 +- include/verilated_threads.cpp | 11 + test_regress/t/t_gantt_io.dat | 895 +++++++++++++++++++++++++ test_regress/t/t_gantt_io.out | 4 +- test_regress/t/t_gantt_io.pl | 1 - test_regress/t/t_gantt_io_cpuinfo.dat | 896 -------------------------- 7 files changed, 921 insertions(+), 921 deletions(-) delete mode 100644 test_regress/t/t_gantt_io_cpuinfo.dat diff --git a/Changes b/Changes index f308f4c4d..9033c8513 100644 --- a/Changes +++ b/Changes @@ -11,6 +11,7 @@ contributors that suggested a given feature are shown in []. Thanks! Verilator 4.213 devel ========================== +* Include processor information in verilator_gantt data file. * Fix verilator_profcfunc profile accounting (#3115). diff --git a/bin/verilator_gantt b/bin/verilator_gantt index e45f19bf5..0284180b1 100755 --- a/bin/verilator_gantt +++ b/bin/verilator_gantt @@ -10,7 +10,6 @@ use Pod::Usage; use vars qw($Debug); $Debug = 0; -my $Opt_Cpuinfo = "/proc/cpuinfo"; my $Opt_File; my $Opt_Time_Per_Char = 0; # rdtsc ticks per char in gantt chart, 0=auto my $opt_vcd = "profile_threads.vcd"; @@ -24,7 +23,6 @@ autoflush STDERR 1; Getopt::Long::config("no_auto_abbrev"); if (! GetOptions( "help" => \&usage, - "cpuinfo=s" => \$Opt_Cpuinfo, # Testing, not documented "scale=i" => \$Opt_Time_Per_Char, "debug" => sub { $Debug = 1; }, "vcd=s" => \$opt_vcd, @@ -62,7 +60,6 @@ sub process { my $filename = shift; read_data($filename); - read_cpuinfo($Opt_Cpuinfo); report(); } @@ -74,6 +71,8 @@ sub read_data { %Global = (rdtsc_cycle_time => 0); my $fh = IO::File->new("<$filename") or die "%Error: $! $filename,"; + + my $cpu; while (my $line = $fh->getline) { if ($line =~ m/VLPROF mtask\s(\d+)\sstart\s(\d+)\send\s(\d+)\selapsed\s(\d+)\spredict_time\s(\d+)\scpu\s(\d+)\son thread (\d+)/) { my $mtask = $1; @@ -102,6 +101,16 @@ sub read_data { elsif ($line =~ m/VLPROF stat\s+(\S+)\s+([0-9.]+)/) { $Global{stats}{$1} = $2; } + elsif ($line =~ m/^VLPROFPROC processor\s*:\s*(\d+)\s*$/) { + $cpu = $1; + } + elsif (defined $cpu && $line =~ m/^VLPROFPROC ([a-z_ ]+)\s*:\s*(.*)$/) { + my ($term, $value) = ($1, $2); + $term =~ s/\s+$//; + $term =~ s/\s+/_/; + $value =~ s/\s+$//; + $Global{cpuinfo}{$cpu}{$term} = $value; + } elsif ($line =~ /^#/) {} elsif ($Debug) { chomp $line; @@ -116,25 +125,6 @@ sub read_data { } } -sub read_cpuinfo { - my $filename = shift; - my $fh = IO::File->new("<$filename") or return; - my $cpu; - while (my $line = $fh->getline) { - chomp $line; - if ($line =~ m/^processor\s*:\s*(\d+)\s*$/) { - $cpu = $1; - } - if ($cpu && $line =~ m/^([a-z_ ]+)\s*:\s*(.*)$/) { - my ($term, $value) = ($1, $2); - $term =~ s/\s+$//; - $term =~ s/\s+/_/; - $value =~ s/\s+$//; - $Global{cpuinfo}{$cpu}{$term} = $value; - } - } -} - ####################################################################### sub report { diff --git a/include/verilated_threads.cpp b/include/verilated_threads.cpp index 606985494..76a6367b0 100644 --- a/include/verilated_threads.cpp +++ b/include/verilated_threads.cpp @@ -25,6 +25,7 @@ #include "verilated_threads.h" #include +#include //============================================================================= // Globals @@ -167,6 +168,16 @@ void VlThreadPool::profileDump(const char* filenamep, vluint64_t ticksElapsed) Verilated::threadContextp()->profThreadsWindow()); fprintf(fp, "VLPROF stat yields %" VL_PRI64 "u\n", VlMTaskVertex::yields()); + // Copy /proc/cpuinfo into this output so verilator_gantt can be run on + // a different machine + { + const std::unique_ptr ifp{new std::ifstream("/proc/cpuinfo")}; + if (!ifp->fail()) { + std::string line; + while (std::getline(*ifp, line)) { fprintf(fp, "VLPROFPROC %s\n", line.c_str()); } + } + } + vluint32_t thread_id = 0; for (const auto& pi : m_allProfiles) { ++thread_id; diff --git a/test_regress/t/t_gantt_io.dat b/test_regress/t/t_gantt_io.dat index e88efc510..1978ef606 100644 --- a/test_regress/t/t_gantt_io.dat +++ b/test_regress/t/t_gantt_io.dat @@ -3,6 +3,901 @@ VLPROF arg --threads 2 VLPROF arg +verilator+prof+threads+start+2 VLPROF arg +verilator+prof+threads+window+2 VLPROF stat yields 1 +VLPROFPROC processor : 0 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2203.060 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 0 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 0 +VLPROFPROC initial apicid : 0 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 1 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2192.482 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 1 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 2 +VLPROFPROC initial apicid : 2 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 2 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.034 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 2 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 4 +VLPROFPROC initial apicid : 4 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 3 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.861 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 3 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 6 +VLPROFPROC initial apicid : 6 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 4 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.736 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 4 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 8 +VLPROFPROC initial apicid : 8 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 5 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2192.116 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 5 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 10 +VLPROFPROC initial apicid : 10 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 6 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.236 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 6 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 12 +VLPROFPROC initial apicid : 12 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 7 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2194.216 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 7 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 14 +VLPROFPROC initial apicid : 14 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 8 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2197.502 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 8 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 16 +VLPROFPROC initial apicid : 16 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 9 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2194.929 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 9 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 18 +VLPROFPROC initial apicid : 18 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 10 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2194.423 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 10 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 20 +VLPROFPROC initial apicid : 20 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 11 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2193.157 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 11 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 22 +VLPROFPROC initial apicid : 22 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 12 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2182.263 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 12 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 24 +VLPROFPROC initial apicid : 24 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 13 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2509.976 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 13 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 26 +VLPROFPROC initial apicid : 26 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 14 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2179.424 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 14 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 28 +VLPROFPROC initial apicid : 28 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 15 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2183.384 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 15 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 30 +VLPROFPROC initial apicid : 30 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 16 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2193.777 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 0 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 1 +VLPROFPROC initial apicid : 1 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 17 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2190.659 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 1 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 3 +VLPROFPROC initial apicid : 3 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 18 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2189.525 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 2 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 5 +VLPROFPROC initial apicid : 5 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 19 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.475 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 3 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 7 +VLPROFPROC initial apicid : 7 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 20 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2187.858 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 4 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 9 +VLPROFPROC initial apicid : 9 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 21 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.358 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 5 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 11 +VLPROFPROC initial apicid : 11 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 22 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.161 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 6 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 13 +VLPROFPROC initial apicid : 13 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 23 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2187.812 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 7 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 15 +VLPROFPROC initial apicid : 15 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 24 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.371 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 8 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 17 +VLPROFPROC initial apicid : 17 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 25 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.530 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 9 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 19 +VLPROFPROC initial apicid : 19 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 26 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2191.688 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 10 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 21 +VLPROFPROC initial apicid : 21 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 27 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2195.968 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 11 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 23 +VLPROFPROC initial apicid : 23 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 28 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2018.474 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 12 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 25 +VLPROFPROC initial apicid : 25 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 29 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2249.337 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 13 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 27 +VLPROFPROC initial apicid : 27 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 30 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 1865.493 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 14 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 29 +VLPROFPROC initial apicid : 29 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] +VLPROFPROC +VLPROFPROC processor : 31 +VLPROFPROC vendor_id : AuthenticTest +VLPROFPROC cpu family : 23 +VLPROFPROC model : 113 +VLPROFPROC model name : Test Ryzen 9 3950X 16-Core Processor +VLPROFPROC stepping : 0 +VLPROFPROC microcode : 0x8701013 +VLPROFPROC cpu MHz : 2015.595 +VLPROFPROC cache size : 512 KB +VLPROFPROC physical id : 0 +VLPROFPROC siblings : 32 +VLPROFPROC core id : 15 +VLPROFPROC cpu cores : 16 +VLPROFPROC apicid : 31 +VLPROFPROC initial apicid : 31 +VLPROFPROC fpu : yes +VLPROFPROC fpu_exception : yes +VLPROFPROC cpuid level : 16 +VLPROFPROC wp : yes +VLPROFPROC flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca +VLPROFPROC bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass +VLPROFPROC bogomips : 6987.10 +VLPROFPROC TLB size : 3072 4K pages +VLPROFPROC clflush size : 64 +VLPROFPROC cache_alignment : 64 +VLPROFPROC address sizes : 43 bits physical, 48 bits virtual +VLPROFPROC power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] VLPROF mtask 6 start 595 end 735 elapsed 140 predict_time 30 cpu 1 on thread 1 VLPROF mtask 10 start 8120 end 8260 elapsed 140 predict_time 30 cpu 1 on thread 1 VLPROF mtask 6 start 11970 end 12075 elapsed 105 predict_time 30 cpu 1 on thread 1 diff --git a/test_regress/t/t_gantt_io.out b/test_regress/t/t_gantt_io.out index ad02d1e79..3ad8bd681 100644 --- a/test_regress/t/t_gantt_io.out +++ b/test_regress/t/t_gantt_io.out @@ -32,7 +32,7 @@ Statistics: e ^ stddev = 1.754 CPUs: - cpu 1: cpu_time=525 socket=0 core=1 AMD Ryzen 9 3950X 16-Core Processor - cpu 16: cpu_time=2905 socket=0 core=0 AMD Ryzen 9 3950X 16-Core Processor + cpu 1: cpu_time=525 socket=0 core=1 Test Ryzen 9 3950X 16-Core Processor + cpu 16: cpu_time=2905 socket=0 core=0 Test Ryzen 9 3950X 16-Core Processor Writing profile_threads.vcd diff --git a/test_regress/t/t_gantt_io.pl b/test_regress/t/t_gantt_io.pl index 4f0041e7b..f4643afeb 100755 --- a/test_regress/t/t_gantt_io.pl +++ b/test_regress/t/t_gantt_io.pl @@ -11,7 +11,6 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(dist => 1); run(cmd => ["cd $Self->{obj_dir} && $ENV{VERILATOR_ROOT}/bin/verilator_gantt" - ." --cpuinfo $Self->{t_dir}/t_gantt_io_cpuinfo.dat" ." $Self->{t_dir}/t_gantt_io.dat > gantt.log"], check_finished => 0); diff --git a/test_regress/t/t_gantt_io_cpuinfo.dat b/test_regress/t/t_gantt_io_cpuinfo.dat deleted file mode 100644 index 4585d9873..000000000 --- a/test_regress/t/t_gantt_io_cpuinfo.dat +++ /dev/null @@ -1,896 +0,0 @@ -processor : 0 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2203.060 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 0 -cpu cores : 16 -apicid : 0 -initial apicid : 0 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 1 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2192.482 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 1 -cpu cores : 16 -apicid : 2 -initial apicid : 2 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 2 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.034 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 2 -cpu cores : 16 -apicid : 4 -initial apicid : 4 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 3 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.861 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 3 -cpu cores : 16 -apicid : 6 -initial apicid : 6 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 4 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.736 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 4 -cpu cores : 16 -apicid : 8 -initial apicid : 8 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 5 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2192.116 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 5 -cpu cores : 16 -apicid : 10 -initial apicid : 10 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 6 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.236 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 6 -cpu cores : 16 -apicid : 12 -initial apicid : 12 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 7 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2194.216 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 7 -cpu cores : 16 -apicid : 14 -initial apicid : 14 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 8 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2197.502 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 8 -cpu cores : 16 -apicid : 16 -initial apicid : 16 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 9 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2194.929 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 9 -cpu cores : 16 -apicid : 18 -initial apicid : 18 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 10 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2194.423 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 10 -cpu cores : 16 -apicid : 20 -initial apicid : 20 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 11 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2193.157 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 11 -cpu cores : 16 -apicid : 22 -initial apicid : 22 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 12 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2182.263 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 12 -cpu cores : 16 -apicid : 24 -initial apicid : 24 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 13 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2509.976 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 13 -cpu cores : 16 -apicid : 26 -initial apicid : 26 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 14 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2179.424 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 14 -cpu cores : 16 -apicid : 28 -initial apicid : 28 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 15 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2183.384 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 15 -cpu cores : 16 -apicid : 30 -initial apicid : 30 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 16 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2193.777 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 0 -cpu cores : 16 -apicid : 1 -initial apicid : 1 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 17 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2190.659 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 1 -cpu cores : 16 -apicid : 3 -initial apicid : 3 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 18 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2189.525 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 2 -cpu cores : 16 -apicid : 5 -initial apicid : 5 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 19 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.475 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 3 -cpu cores : 16 -apicid : 7 -initial apicid : 7 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 20 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2187.858 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 4 -cpu cores : 16 -apicid : 9 -initial apicid : 9 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 21 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.358 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 5 -cpu cores : 16 -apicid : 11 -initial apicid : 11 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 22 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.161 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 6 -cpu cores : 16 -apicid : 13 -initial apicid : 13 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 23 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2187.812 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 7 -cpu cores : 16 -apicid : 15 -initial apicid : 15 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 24 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.371 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 8 -cpu cores : 16 -apicid : 17 -initial apicid : 17 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 25 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.530 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 9 -cpu cores : 16 -apicid : 19 -initial apicid : 19 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 26 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2191.688 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 10 -cpu cores : 16 -apicid : 21 -initial apicid : 21 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 27 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2195.968 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 11 -cpu cores : 16 -apicid : 23 -initial apicid : 23 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 28 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2018.474 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 12 -cpu cores : 16 -apicid : 25 -initial apicid : 25 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 29 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2249.337 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 13 -cpu cores : 16 -apicid : 27 -initial apicid : 27 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 30 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 1865.493 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 14 -cpu cores : 16 -apicid : 29 -initial apicid : 29 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - -processor : 31 -vendor_id : AuthenticAMD -cpu family : 23 -model : 113 -model name : AMD Ryzen 9 3950X 16-Core Processor -stepping : 0 -microcode : 0x8701013 -cpu MHz : 2015.595 -cache size : 512 KB -physical id : 0 -siblings : 32 -core id : 15 -cpu cores : 16 -apicid : 31 -initial apicid : 31 -fpu : yes -fpu_exception : yes -cpuid level : 16 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca -bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass -bogomips : 6987.10 -TLB size : 3072 4K pages -clflush size : 64 -cache_alignment : 64 -address sizes : 43 bits physical, 48 bits virtual -power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14] - From 2a79e46c462630c521fb50a2f216beb5d12ffc81 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Tue, 7 Sep 2021 19:27:46 -0400 Subject: [PATCH 17/65] Tests: Fix t_dist_fixme to detect later files. --- test_regress/t/t_dist_fixme.pl | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/test_regress/t/t_dist_fixme.pl b/test_regress/t/t_dist_fixme.pl index cbceb52c9..3fd51c460 100755 --- a/test_regress/t/t_dist_fixme.pl +++ b/test_regress/t/t_dist_fixme.pl @@ -21,15 +21,28 @@ if (!-r "$root/.git") { ### Must trim output before and after our file list my $files = `cd $root && git ls-files --exclude-standard`; print "ST $files\n" if $Debug; + my %names; + $files =~ s/\s+/ /g; - my $cmd = "cd $root && grep -n -P '(FIX"."ME|BO"."ZO)' $files | sort"; - my $grep = `$cmd`; - print "$grep\n"; - if ($grep ne "") { - my %names; - foreach my $line (split /\n/, $grep) { - $names{$1} = 1 if $line =~ /^([^:]+)/; + my @batch; + my $n = 0; + foreach my $file (split /\s+/, $files) { + $batch[$n] .= $file . " "; + ++$n if (length($batch[$n]) > 10000); + } + + foreach my $bfiles (@batch) { + my $cmd = "cd $root && grep -n -P '(FIX"."ME|BO"."ZO)' $bfiles | sort"; + my $grep = `$cmd`; + if ($grep ne "") { + print "$grep\n"; + foreach my $line (split /\n/, $grep) { + print "L $line\n"; + $names{$1} = 1 if $line =~ /^([^:]+)/; + } } + } + if (scalar(%names) >= 1) { error("Files with FIX"."MEs: ",join(' ',sort keys %names)); } } From c678e7ec3eb8d229631d0e1235bf3a9e2366c191 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Tue, 7 Sep 2021 23:50:28 -0400 Subject: [PATCH 18/65] Format: perltidy spacing cleanup. No functional change. --- bin/verilator | 48 +-- bin/verilator_coverage | 18 +- bin/verilator_includer | 6 +- test_regress/driver.pl | 405 ++++++++++++----------- test_regress/t/t_alw_noreorder.pl | 2 +- test_regress/t/t_alw_nosplit.pl | 2 +- test_regress/t/t_alw_reorder.pl | 2 +- test_regress/t/t_clk_condflop_nord.pl | 2 +- test_regress/t/t_const_opt.pl | 2 +- test_regress/t/t_const_opt_cov.pl | 2 +- test_regress/t/t_const_opt_red.pl | 2 +- test_regress/t/t_const_opt_shortcut.pl | 2 +- test_regress/t/t_display_merge.pl | 2 +- test_regress/t/t_dist_cinclude.pl | 2 +- test_regress/t/t_dist_error_format.pl | 2 +- test_regress/t/t_dist_fixme.pl | 4 +- test_regress/t/t_dist_inctree.pl | 2 +- test_regress/t/t_dist_install.pl | 4 +- test_regress/t/t_dist_portability.pl | 10 +- test_regress/t/t_dist_tabs.pl | 8 +- test_regress/t/t_dist_untracked.pl | 6 +- test_regress/t/t_dist_whitespace.pl | 4 +- test_regress/t/t_dpi_import_hdr_only.pl | 4 +- test_regress/t/t_gate_chained.pl | 10 +- test_regress/t/t_gate_ormux.pl | 2 +- test_regress/t/t_preproc.pl | 2 +- test_regress/t/t_timing_long.pl | 12 +- test_regress/t/t_trace_complex_params.pl | 2 +- test_regress/t/t_unopt_array.pl | 2 +- test_regress/t/t_var_rsvd_port.pl | 2 +- 30 files changed, 288 insertions(+), 285 deletions(-) diff --git a/bin/verilator b/bin/verilator index 0a9ceaf71..c188ac3a2 100755 --- a/bin/verilator +++ b/bin/verilator @@ -34,11 +34,11 @@ my $opt_quiet_exit; # No arguments can't do anything useful. Give help if ($#ARGV < 0) { - pod2usage(-exitstatus=>2, -verbose=>0); + pod2usage(-exitstatus => 2, -verbose => 0); } # Insert debugging options up front -push @ARGV, (split ' ',$ENV{VERILATOR_TEST_FLAGS}||""); +push @ARGV, (split ' ', $ENV{VERILATOR_TEST_FLAGS} || ""); # We sneak a look at the flags so we can do some pre-environment checks # All flags will hit verilator... @@ -60,7 +60,7 @@ if (! GetOptions( # Additional parameters "<>" => sub {}, # Ignored )) { - pod2usage(-exitstatus=>2, -verbose=>0); + pod2usage(-exitstatus => 2, -verbose => 0); } if ($opt_gdbbt && !gdb_works()) { @@ -73,12 +73,12 @@ if ($opt_gdbbt && !gdb_works()) { # Starting with that, escape all special chars for the shell; # The shell will undo the escapes and the verilator binary should # then see exactly the contents of @Opt_Verilator_Sw. -my @quoted_sw = map {sh_escape($_)} @Opt_Verilator_Sw; +my @quoted_sw = map { sh_escape($_) } @Opt_Verilator_Sw; if ($opt_gdb) { # Generic GDB interactive run (aslr_off() - .($ENV{VERILATOR_GDB}||"gdb") - ." ".verilator_bin() + . ($ENV{VERILATOR_GDB} || "gdb") + . " " . verilator_bin() # Note, uncomment to set breakpoints before running: # ." -ex 'break main'" @@ -87,42 +87,42 @@ if ($opt_gdb) { # escapes as you would expect in a double-quoted string. # That's not true for a single-quoted string, where \' # actually terminates the string -- not what we want! - ." -ex \"run ".join(' ', @quoted_sw)."\"" - ." -ex 'set width 0'" - ." -ex 'bt'"); + . " -ex \"run " . join(' ', @quoted_sw) . "\"" + . " -ex 'set width 0'" + . " -ex 'bt'"); } elsif ($opt_rr) { # Record with rr run (aslr_off() - ."rr record ".verilator_bin() - ." ".join(' ', @quoted_sw)); + . "rr record " . verilator_bin() + . " " . join(' ', @quoted_sw)); } elsif ($opt_gdbbt && $Debug) { # Run under GDB to get gdbbt run (aslr_off() - ."gdb" - ." ".verilator_bin() - ." --batch --quiet --return-child-result" - ." -ex \"run ".join(' ', @quoted_sw)."\"" - ." -ex 'set width 0'" - ." -ex 'bt' -ex 'quit'"); + . "gdb" + . " " . verilator_bin() + . " --batch --quiet --return-child-result" + . " -ex \"run " . join(' ', @quoted_sw)."\"" + . " -ex 'set width 0'" + . " -ex 'bt' -ex 'quit'"); } elsif ($Debug) { # Debug run(aslr_off() - .verilator_bin()." ".join(' ',@quoted_sw)); + . verilator_bin() . " " . join(' ',@quoted_sw)); } else { # Normal, non gdb - run(verilator_bin()." ".join(' ',@quoted_sw)); + run(verilator_bin() . " " . join(' ',@quoted_sw)); } #---------------------------------------------------------------------- sub usage { - pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT); + pod2usage(-verbose => 2, -exitval => 0, -output => \*STDOUT); } sub debug { shift; my $level = shift; - $Debug = $level||3; + $Debug = $level || 3; } ####################################################################### @@ -169,7 +169,7 @@ sub gdb_works { ." -ex 'bt'" ." -ex 'quit'"); my $status = $?; - return $status==0; + return $status == 0; } sub aslr_off { @@ -185,7 +185,7 @@ sub run { # Run command, check errors my $command = shift; $! = undef; # Cleanup -x - print "\t$command\n" if $Debug>=3; + print "\t$command\n" if $Debug >= 3; system($command); my $status = $?; if ($status) { @@ -193,7 +193,7 @@ sub run { warn "%Error: verilator: Misinstalled, or VERILATOR_ROOT might need to be in environment\n"; } if ($Debug) { # For easy rerunning - warn "%Error: export VERILATOR_ROOT=".($ENV{VERILATOR_ROOT}||"")."\n"; + warn "%Error: export VERILATOR_ROOT=" . ($ENV{VERILATOR_ROOT} || "") . "\n"; warn "%Error: $command\n"; } if ($status & 127) { diff --git a/bin/verilator_coverage b/bin/verilator_coverage index ab76d15ba..0ec1f1bac 100755 --- a/bin/verilator_coverage +++ b/bin/verilator_coverage @@ -30,7 +30,7 @@ $Debug = 0; # No arguments can't do anything useful. Give help if ($#ARGV < 0) { - pod2usage(-exitstatus=>2, -verbose=>0); + pod2usage(-exitstatus => 2, -verbose => 0); } # We sneak a look at the flags so we can do some pre-environment checks @@ -40,7 +40,7 @@ foreach my $sw (@ARGV) { push @Opt_Verilator_Sw, $sw; } -Getopt::Long::config("no_auto_abbrev","pass_through"); +Getopt::Long::config("no_auto_abbrev", "pass_through"); if (! GetOptions ( # Major operating modes "help" => \&usage, @@ -49,23 +49,23 @@ if (! GetOptions ( # Additional parameters "<>" => sub {}, # Ignored )) { - pod2usage(-exitstatus=>2, -verbose=>0); + pod2usage(-exitstatus => 2, -verbose => 0); } # Normal, non gdb run(verilator_coverage_bin() - ." ".join(' ',@Opt_Verilator_Sw)); + . " " . join(' ', @Opt_Verilator_Sw)); #---------------------------------------------------------------------- sub usage { - pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT); + pod2usage(-verbose => 2, -exitval => 0, -output => \*STDOUT); } sub debug { shift; my $level = shift; - $Debug = $level||3; + $Debug = $level || 3; } ####################################################################### @@ -107,7 +107,7 @@ sub run { # Run command, check errors my $command = shift; $! = undef; # Cleanup -x - print "\t$command\n" if $Debug>=3; + print "\t$command\n" if $Debug >= 3; system($command); my $status = $?; if ($status) { @@ -115,11 +115,11 @@ sub run { warn "%Error: verilator_coverage: Misinstalled, or VERILATOR_ROOT might need to be in environment\n"; } if ($Debug) { # For easy rerunning - warn "%Error: export VERILATOR_ROOT=".($ENV{VERILATOR_ROOT}||"")."\n"; + warn "%Error: export VERILATOR_ROOT=" . ($ENV{VERILATOR_ROOT} || "") . "\n"; warn "%Error: $command\n"; } if ($status & 127) { - if (($status & 127) == 8 || ($status & 127) == 11) { # SIGFPA or SIGSEGV + if (($status & 127) == 8 || ($status & 127) == 11) { # SIGFPA or SIGSEGV warn "%Error: Verilator_coverage internal fault, sorry.\n" if !$Debug; } elsif (($status & 127) == 6) { # SIGABRT warn "%Error: Verilator_coverage aborted.\n" if !$Debug; diff --git a/bin/verilator_includer b/bin/verilator_includer index d6c26860b..356849827 100755 --- a/bin/verilator_includer +++ b/bin/verilator_includer @@ -10,11 +10,11 @@ require 5.005; use warnings; -print "// DESCR"."IPTION: Generated by verilator_includer via makefile\n"; +print "// DESCR" . "IPTION: Generated by verilator_includer via makefile\n"; foreach my $param (@ARGV) { if ($param =~ /^-D([^=]+)=(.*)/) { - print "#define $1 $2\n" + print "#define $1 $2\n"; } else { - print "#include \"$param\"\n" + print "#include \"$param\"\n"; } } diff --git a/test_regress/driver.pl b/test_regress/driver.pl index 9a04b9ebd..bf8590571 100755 --- a/test_regress/driver.pl +++ b/test_regress/driver.pl @@ -5,9 +5,10 @@ require 5.006_001; use warnings; use Cwd; + BEGIN { if (!$ENV{VERILATOR_ROOT} && -x "../bin/verilator") { - $ENV{VERILATOR_ROOT} = Cwd::getcwd()."/.."; + $ENV{VERILATOR_ROOT} = Cwd::getcwd() . "/.."; } $ENV{MAKE} ||= "make"; $ENV{CXX} ||= "c++"; @@ -16,7 +17,7 @@ BEGIN { use Getopt::Long; use IO::File; use Pod::Usage; -use Data::Dumper; $Data::Dumper::Sortkeys=1; +use Data::Dumper; $Data::Dumper::Sortkeys = 1; use FindBin qw($RealBin); use strict; use vars qw($Debug %Vars $Driver $Fork); @@ -30,7 +31,7 @@ $::Driver = 1; $::Have_Forker = 0; eval "use Parallel::Forker; \$Fork=Parallel::Forker->new(use_sig_child=>1, poll_interval=>10*1000); \$::Have_Forker=1;"; -$Fork = Forker->new(use_sig_child=>1) if !$Fork; +$Fork = Forker->new(use_sig_child => 1) if !$Fork; my $forker_Min_Version = 1.258; if ($::Have_Forker && $Parallel::Forker::VERSION < $forker_Min_Version) { print STDERR "driver.pl: Parallel::Forker is older than $forker_Min_Version, suggest 'cpan install Parallel::Forker'\n"; @@ -62,7 +63,7 @@ autoflush STDOUT 1; autoflush STDERR 1; our @Orig_ARGV = @ARGV; -our @Orig_ARGV_Sw; foreach (@Orig_ARGV) { push @Orig_ARGV_Sw, $_ if /^-/ && !/^-j/; } +our @Orig_ARGV_Sw; foreach (@Orig_ARGV) { push @Orig_ARGV_Sw, $_ if /^-/ && !/^-j/; } our $Start = time(); our $Vltmt_threads = 3; @@ -133,7 +134,7 @@ if (! GetOptions( die "%Error: Bad usage, try '$0 --help'\n"; } -$opt_jobs = calc_jobs() if defined $opt_jobs && $opt_jobs==0; +$opt_jobs = calc_jobs() if defined $opt_jobs && $opt_jobs == 0; $Fork->max_proc($opt_jobs); if ((scalar keys %opt_scenarios) < 1) { @@ -142,10 +143,10 @@ if ((scalar keys %opt_scenarios) < 1) { } our @Test_Dirs = "t"; -push @Test_Dirs, split(/:/,$ENV{VERILATOR_TESTS_SITE}) - if (($#opt_tests<0 ? $opt_site : 1) && $ENV{VERILATOR_TESTS_SITE}); +push @Test_Dirs, split(/:/, $ENV{VERILATOR_TESTS_SITE}) + if (($#opt_tests < 0 ? $opt_site : 1) && $ENV{VERILATOR_TESTS_SITE}); -if ($#opt_tests<0) { # Run everything +if ($#opt_tests < 0) { # Run everything my %uniq; foreach my $dir (@Test_Dirs) { my @stats = stat($dir); # Uniquify by inode, so different paths to same place get combined @@ -155,7 +156,7 @@ if ($#opt_tests<0) { # Run everything } @opt_tests = _calc_hashset(@opt_tests) if $opt_hashset; -if ($#opt_tests>=2 && $opt_jobs>=2) { +if ($#opt_tests >= 2 && $opt_jobs >= 2) { # Without this tests such as t_debug_sigsegv_bt_bad.pl will occasionally # block on input and cause a SIGSTOP, then a "fg" was needed to resume testing. if (!$::Have_Forker) { @@ -165,7 +166,6 @@ if ($#opt_tests>=2 && $opt_jobs>=2) { open(STDIN, "+>/dev/null"); } - mkdir "obj_dist"; my $timestart = strftime("%Y%m%d_%H%M%S", localtime); @@ -185,8 +185,8 @@ my $runner; } if ($opt_rerun && $runner->fail_count) { - print("="x70,"\n"); - print("="x70,"\n"); + print("=" x 70, "\n"); + print("=" x 70, "\n"); print("RERUN ==\n\n"); # Avoid parallel run to ensure that isn't causing problems @@ -215,7 +215,7 @@ exit(10) if $runner->fail_count; #---------------------------------------------------------------------- sub usage { - pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT); + pod2usage(-verbose => 2, -exitval => 0, -output => \*STDOUT); exit(1); # Unreachable } @@ -232,7 +232,7 @@ sub parameter { ($param =~ /^(\d+)$/) or die "%Error: Expected number following $_Parameter_Next_Level: $param\n"; push @Opt_Driver_Verilator_Flags, $param; - $_Parameter_Next_Level = undef; + $_Parameter_Next_Level = undef; } elsif ($param =~ /\.pl/) { push @opt_tests, $param; @@ -250,6 +250,7 @@ sub parameter { } our $_Max_Procs; + sub max_procs { if (!defined $_Max_Procs) { $_Max_Procs = `python3 -c 'import multiprocessing\nprint(multiprocessing.cpu_count())'`; @@ -272,7 +273,7 @@ sub calc_threads { sub calc_jobs { my $ok = max_procs(); $ok && !$@ or die "%Error: Can't use -j: $@\n"; - print "driver.pl: Found $ok cores, using -j ",$ok+1,"\n"; + print "driver.pl: Found $ok cores, using -j ", $ok + 1, "\n"; return $ok + 1; } @@ -351,10 +352,10 @@ sub one_test { open(STDOUT, ">/dev/null"); open(STDERR, ">&STDOUT"); } - print("="x70,"\n"); + print("=" x 70, "\n"); my $test = VTest->new(@params, running_id => $process->{running_id}); - $test->oprint("="x50,"\n"); + $test->oprint("=" x 50, "\n"); unlink $test->{status_filename}; $test->_prep; $test->_read; @@ -373,7 +374,7 @@ sub one_test { } elsif ($test->scenario_off && !$test->errors) { } elsif ($test->skips && !$test->errors) { push @{$self->{skip_msgs}}, - ("\t#".$test->soprint("-Skip: $test->{skips}\n")); + ("\t#" . $test->soprint("-Skip: $test->{skips}\n")); $self->{skip_cnt}++; } elsif ($test->unsupporteds && !$test->errors) { $self->{unsup_cnt}++; @@ -384,19 +385,19 @@ sub one_test { my $upperdir = (Cwd::getcwd() =~ /test_regress/ ? 'test_regress/' : ''); push @{$self->{fail_msgs}}, - ("\t#".$test->soprint("%Error: $test->{errors}\n") - ."\t\t$makecmd " - .$upperdir.$test->{pl_filename} - ." ".join(' ', _manual_args()) - ." --".$test->{scenario}."\n"); + ("\t#" . $test->soprint("%Error: $test->{errors}\n") + . "\t\t$makecmd " + . $upperdir . $test->{pl_filename} + . " " . join(' ', _manual_args()) + . " --" . $test->{scenario} . "\n"); push @{$self->{fail_tests}}, $test; $self->{fail_cnt}++; $self->report($self->{driver_log_filename}); my $other = ""; foreach my $proc ($::Fork->running) { - $other .= " ".$proc->{test_pl_filename}; + $other .= " " . $proc->{test_pl_filename}; } - $test->oprint("Simultaneous running tests:",$other,"\n") + $test->oprint("Simultaneous running tests:", $other, "\n") if $other && !$opt_quiet; if ($opt_stop) { die "%Error: --stop and errors found\n"; } } @@ -409,15 +410,15 @@ sub one_test { sub wait_and_report { my $self = shift; - $self->print_summary(force=>1); + $self->print_summary(force => 1); # Wait for all children to finish while ($::Fork->is_any_left) { $::Fork->poll; if ((time() - ($self->{_last_summary_time} || 0) >= 30) && (!$opt_gdb && !$opt_gdbsim)) { # Don't show for interactive gdb etc - $self->print_summary(force=>1, show_running=>1); + $self->print_summary(force => 1, show_running => 1); } - Time::HiRes::usleep 100*1000; + Time::HiRes::usleep 100 * 1000; } $runner->report(undef); $runner->report($self->{driver_log_filename}); @@ -433,7 +434,7 @@ sub report { } $fh->print("\n"); - $fh->print("="x70,"\n"); + $fh->print("=" x 70, "\n"); foreach my $f (sort @{$self->{fail_msgs}}) { chomp $f; $fh->print("$f\n"); @@ -445,7 +446,7 @@ sub report { my $sum = ($self->{fail_cnt} && "FAILED" || $self->{skip_cnt} && "PASSED w/SKIPS" || "PASSED"); - $fh->print("TESTS DONE, $sum: ".$self->sprint_summary."\n"); + $fh->print("TESTS DONE, $sum: " . $self->sprint_summary . "\n"); } sub print_summary { @@ -457,13 +458,13 @@ sub print_summary { || ($self->{left_cnt} < 5) || (time() - ($self->{_last_summary_time} || 0) >= 15)) { # Don't show for interactive gdb etc $self->{_last_summary_time} = time(); - print STDERR ("==SUMMARY: ".$self->sprint_summary."\n"); + print STDERR ("==SUMMARY: " . $self->sprint_summary . "\n"); if ($params{show_running}) { my $other; foreach my $proc ($::Fork->running) { - $other .= " ".$proc->{test_pl_filename}; + $other .= " " . $proc->{test_pl_filename}; } - print STDERR ("==STILL RUNNING: ".$other."\n"); + print STDERR ("==STILL RUNNING: " . $other . "\n"); } } } @@ -473,7 +474,7 @@ sub sprint_summary { my $delta = time() - $::Start; my $leftmsg = $::Have_Forker ? $self->{left_cnt} : "NO-FORKER"; - my $pct = int(100*($self->{left_cnt} / ($self->{all_cnt} + 0.001)) + 0.999); + my $pct = int(100 * ($self->{left_cnt} / ($self->{all_cnt} + 0.001)) + 0.999); # Fudge of 120% works out about right so ETA correctly predicts completion time my $eta = 1.2 * (($self->{all_cnt} * ($delta / (($self->{all_cnt} - $self->{left_cnt})+0.001))) @@ -487,8 +488,8 @@ sub sprint_summary { $out .= " Failed-First $self->{fail1_cnt}" if $self->{fail1_cnt}; $out .= " Skipped $self->{skip_cnt}" if $self->{skip_cnt}; $out .= " Unsup $self->{unsup_cnt}"; - $out .= sprintf(" Eta %d:%02d", int($eta/60), $eta%60) if $self->{left_cnt} > 10 && $eta > 10; - $out .= sprintf(" Time %d:%02d", int($delta/60), $delta%60); + $out .= sprintf(" Eta %d:%02d", int($eta / 60), $eta % 60) if $self->{left_cnt} > 10 && $eta > 10; + $out .= sprintf(" Time %d:%02d", int($delta / 60), $delta % 60); return $out; } @@ -566,7 +567,7 @@ sub new { my $scen_dir = File::Spec->abs2rel("$self->{t_dir}/../obj_$self->{scenario}"); $scen_dir =~ s!^t/\.\./!!; # Simplify filenames on local runs mkdir $scen_dir; # Not a mkpath so find out if trying to build somewhere odd - $self->{obj_dir} ="$scen_dir/$self->{name}"; + $self->{obj_dir} = "$scen_dir/$self->{name}"; } my $define_opt = defineOpt($self->{xsim}); @@ -588,21 +589,21 @@ sub new { (-r 'input.vc' ? " -f input.vc " : "")) .($self->{t_dir} !~ m!/test_regress! # Don't include standard dir, only site's ? " +incdir+$self->{t_dir} -y $self->{t_dir}" : "") - . " ".$define_opt."TEST_OBJ_DIR=$self->{obj_dir}" - .($opt_verbose ? " ".$define_opt."TEST_VERBOSE=1":"") - .($opt_benchmark ? " ".$define_opt."TEST_BENCHMARK=$opt_benchmark":"") - .($opt_trace ? " ".$define_opt."WAVES=1":"") + . " " . $define_opt . "TEST_OBJ_DIR=$self->{obj_dir}" + .($opt_verbose ? " " . $define_opt . "TEST_VERBOSE=1":"") + .($opt_benchmark ? " " . $define_opt . "TEST_BENCHMARK=$opt_benchmark":"") + .($opt_trace ? " " . $define_opt . "WAVES=1":"") ))], v_flags2 => [], # Overridden in some sim files v_other_filenames => [], # After the filename so we can spec multiple files all_run_flags => [], pli_flags => ["-I$ENV{VERILATOR_ROOT}/include/vltstd -fPIC -shared" - .(($^O eq "darwin" ) - ? " -Wl,-undefined,dynamic_lookup" - : " -export-dynamic") - .($opt_verbose ? " -DTEST_VERBOSE=1":"") - .(cfg_with_m32() ? " -m32" : "") - ." -o $self->{obj_dir}/libvpi.so"], + . (($^O eq "darwin" ) + ? " -Wl,-undefined,dynamic_lookup" + : " -export-dynamic") + . ($opt_verbose ? " -DTEST_VERBOSE=1":"") + . (cfg_with_m32() ? " -m32" : "") + . " -o $self->{obj_dir}/libvpi.so"], tool_c_flags => [], # ATSIM atsim => 0, @@ -674,15 +675,15 @@ sub new { $self->{vlt_all} = $self->{vlt} || $self->{vltmt}; # Any Verilator scenario - $self->{VM_PREFIX} ||= "V".$self->{name}; - $self->{stats} ||= "$self->{obj_dir}/V".$self->{name}."__stats.txt"; - $self->{status_filename} ||= "$self->{obj_dir}/V".$self->{name}.".status"; + $self->{VM_PREFIX} ||= "V" . $self->{name}; + $self->{stats} ||= "$self->{obj_dir}/V" . $self->{name} . "__stats.txt"; + $self->{status_filename} ||= "$self->{obj_dir}/V" . $self->{name} . ".status"; $self->{run_log_filename} ||= "$self->{obj_dir}/vlt_sim.log"; $self->{coverage_filename} ||= "$self->{obj_dir}/coverage.dat"; $self->{main_filename} ||= "$self->{obj_dir}/$self->{VM_PREFIX}__main.cpp"; ($self->{top_filename} ||= $self->{pl_filename}) =~ s/\.pl$//; ($self->{golden_filename} ||= $self->{pl_filename}) =~ s/\.pl$/.out/; - if (-e ($self->{top_filename}.".vhd")) { # If VHDL file exists + if (-e ($self->{top_filename} . ".vhd")) { # If VHDL file exists $self->{vhdl} = 1; $self->{top_filename} .= ".vhd"; } else { @@ -693,13 +694,13 @@ sub new { } else { $self->{top_shell_filename} = "$self->{obj_dir}/$self->{VM_PREFIX}__top.v"; } - $self->{pli_filename} ||= $self->{name}.".cpp"; + $self->{pli_filename} ||= $self->{name} . ".cpp"; return $self; } sub benchmarksim_filename { my $self = (ref $_[0] ? shift : $Self); - return $self->{obj_dir}."/$self->{name}_benchmarksim.csv"; + return $self->{obj_dir} . "/$self->{name}_benchmarksim.csv"; } sub init_benchmarksim { @@ -707,16 +708,16 @@ sub init_benchmarksim { # Simulations with benchmarksim enabled append to the same file between runs. # Test files must ensure a clean benchmark data file before executing tests. my $filename = $self->benchmarksim_filename(); - my $fh = IO::File->new(">".$filename) or die "%Error: $! ".$filename; + my $fh = IO::File->new(">" . $filename) or die "%Error: $! " . $filename; print $fh "# Verilator simulation benchmark data\n"; - print $fh "# Test name: ".$self->{name}."\n"; - print $fh "# Top file: ".$self->{top_filename}."\n"; + print $fh "# Test name: " . $self->{name} . "\n"; + print $fh "# Top file: " . $self->{top_filename} . "\n"; print $fh "evals, time[s]\n"; } sub soprint { my $self = (ref $_[0] ? shift : $Self); - my $str = "$self->{scenario}/$self->{name}: ".join('',@_); + my $str = "$self->{scenario}/$self->{name}: " . join('', @_); $str =~ s/\n\n+$/\n/s; return $str; } @@ -728,35 +729,35 @@ sub oprint { sub error { my $self = (ref $_[0] ? shift : $Self); - my $msg = join('',@_); + my $msg = join('', @_); # Called from tests as: error("Reason message"[, ...]); - warn "%Warning: $self->{scenario}/$self->{name}: ".$msg."\n"; + warn "%Warning: $self->{scenario}/$self->{name}: " . $msg . "\n"; $self->{errors} ||= $msg; } sub error_keep_going { my $self = (ref $_[0] ? shift : $Self); - my $msg = join('',@_); + my $msg = join('', @_); # Called from tests as: error_keep_going("Reason message"[, ...]); - warn "%Warning: $self->{scenario}/$self->{name}: ".$msg."\n"; + warn "%Warning: $self->{scenario}/$self->{name}: " . $msg . "\n"; $self->{errors_keep_going} ||= $msg; } sub skip { my $self = (ref $_[0] ? shift : $Self); - my $msg = join('',@_); + my $msg = join('', @_); # Called from tests as: skip("Reason message"[, ...]); - warn "-Skip: $self->{scenario}/$self->{name}: ".$msg."\n"; - $self->{skips} ||= "Skip: ".$msg; + warn "-Skip: $self->{scenario}/$self->{name}: " . $msg . "\n"; + $self->{skips} ||= "Skip: " . $msg; } sub unsupported { my $self = (ref $_[0] ? shift : $Self); - my $msg = join('',@_); + my $msg = join('', @_); # Called from tests as: unsupported("Reason message"[, ...]); - warn "-Unsupported: $self->{scenario}/$self->{name}: ".$msg."\n"; + warn "-Unsupported: $self->{scenario}/$self->{name}: " . $msg . "\n"; if (!$::Opt_Unsupported) { - $self->{unsupporteds} ||= "Unsupported: ".$msg; + $self->{unsupporteds} ||= "Unsupported: " . $msg; } } @@ -879,7 +880,7 @@ sub clean_objs { } sub compile_vlt_cmd { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my %param = (%{$self}, @_); # Default arguments are from $self return 1 if $self->errors || $self->skips || $self->unsupporteds; @@ -888,17 +889,17 @@ sub compile_vlt_cmd { $self->compile_vlt_flags(%param), $param{top_filename}, @{$param{v_other_filenames}}, - $param{stdout_filename}?"> ".$param{stdout_filename}:"" + $param{stdout_filename} ? "> " . $param{stdout_filename} : "" ); return @vlt_cmd; } sub compile_vlt_flags { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my %param = (%{$self}, @_); # Default arguments are from $self return 1 if $self->errors || $self->skips || $self->unsupporteds; - my $checkflags = join(' ',@{$param{v_flags}}, + my $checkflags = join(' ', @{$param{v_flags}}, @{$param{v_flags2}}, @{$param{verilator_flags}}, @{$param{verilator_flags2}}, @@ -932,24 +933,24 @@ sub compile_vlt_flags { unshift @verilator_flags, "--make cmake" if $param{verilator_make_cmake}; unshift @verilator_flags, "--exe" if $param{make_main} && $param{verilator_make_gmake}; - unshift @verilator_flags, "../".$self->{main_filename} if + unshift @verilator_flags, "../" . $self->{main_filename} if $param{make_main} && $param{verilator_make_gmake}; if (defined $opt_optimize) { my $letters = ""; if ($opt_optimize =~ /[a-zA-Z]/) { $letters = $opt_optimize; } else { # Randomly turn on/off different optimizations - foreach my $l ('a'..'z') { + foreach my $l ('a' .. 'z') { $letters .= ((rand() > 0.5) ? $l : uc $l); } unshift @verilator_flags, "--trace" if rand() > 0.5; unshift @verilator_flags, "--coverage" if rand() > 0.5; } - unshift @verilator_flags, "--O".$letters; + unshift @verilator_flags, "--O" . $letters; } my @cmdargs = ( - "--prefix ".$param{VM_PREFIX}, + "--prefix " . $param{VM_PREFIX}, @verilator_flags, @{$param{verilator_flags2}}, @{$param{verilator_flags3}}, @@ -963,8 +964,8 @@ sub compile_vlt_flags { } sub driver_verilator_flags { - #my $self = (ref $_[0] ? shift : $Self); - return @Opt_Driver_Verilator_Flags + # my $self = (ref $_[0] ? shift : $Self); + return @Opt_Driver_Verilator_Flags; } sub lint { @@ -981,7 +982,7 @@ sub lint { } sub compile { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my %param = (tee => 1, %{$self}, @_); # Default arguments are from $self return 1 if $self->errors || $self->skips || $self->unsupporteds; @@ -994,7 +995,7 @@ sub compile { = $self->{top_shell_filename} = ""; } else { $param{top_shell_filename} - = $self->{top_shell_filename} = "$self->{obj_dir}/$self->{VM_PREFIX}__top.".$self->v_suffix; + = $self->{top_shell_filename} = "$self->{obj_dir}/$self->{VM_PREFIX}__top." . $self->v_suffix; } if ($param{atsim}) { @@ -1002,7 +1003,7 @@ sub compile { $self->_make_top() if $param{make_top_shell}; $self->_run(logfile=>"$self->{obj_dir}/atsim_compile.log", fails=>$param{fails}, - cmd=>[($ENV{VERILATOR_ATSIM}||"atsim"), + cmd=>[($ENV{VERILATOR_ATSIM} || "atsim"), @{$param{atsim_flags}}, @{$param{atsim_flags2}}, @{$param{v_flags}}, @@ -1018,9 +1019,9 @@ sub compile { $self->_make_top() if $param{make_top_shell}; $self->_run(logfile=>"$self->{obj_dir}/ghdl_compile.log", fails=>$param{fails}, - cmd=>[($ENV{VERILATOR_GHDL}||"ghdl"), + cmd=>[($ENV{VERILATOR_GHDL} || "ghdl"), # Add -c here, as having -c twice freaks it out - ((($ENV{VERILATOR_GHDL}||' ') =~ / -c\b/) ? "" : "-c"), + ((($ENV{VERILATOR_GHDL} || ' ') =~ / -c\b/) ? "" : "-c"), @{$param{ghdl_flags}}, @{$param{ghdl_flags2}}, #@{$param{v_flags}}, # Not supported @@ -1036,7 +1037,7 @@ sub compile { $self->_make_top() if $param{make_top_shell}; $self->_run(logfile=>"$self->{obj_dir}/vcs_compile.log", fails=>$param{fails}, - cmd=>[($ENV{VERILATOR_VCS}||"vcs"), + cmd=>[($ENV{VERILATOR_VCS} || "vcs"), @{$param{vcs_flags}}, @{$param{vcs_flags2}}, ($opt_verbose ? " -CFLAGS -DTEST_VERBOSE=1":""), @@ -1053,12 +1054,12 @@ sub compile { my @more_args; if ($self->vhdl) { ((my $ts = $param{top_shell_filename}) =~ s!\.v!!); - $ts =~ s!.*/!!;; + $ts =~ s!.*/!!; push @more_args, "-vhdltop", $ts; } $self->_run(logfile=>"$self->{obj_dir}/nc_compile.log", fails=>$param{fails}, - cmd=>[($ENV{VERILATOR_NCVERILOG}||"ncverilog"), + cmd=>[($ENV{VERILATOR_NCVERILOG} || "ncverilog"), @{$param{nc_flags}}, @{$param{nc_flags2}}, @{$param{v_flags}}, @@ -1075,7 +1076,7 @@ sub compile { $self->_run(logfile=>"$self->{obj_dir}/ms_compile.log", fails=>$param{fails}, cmd=>[("vlib $self->{obj_dir}/work && "), - ($ENV{VERILATOR_MODELSIM}||"vlog"), + ($ENV{VERILATOR_MODELSIM} || "vlog"), @{$param{ms_flags}}, @{$param{ms_flags2}}, @{$param{v_flags}}, @@ -1088,7 +1089,7 @@ sub compile { elsif ($param{iv}) { $param{tool_define} ||= $param{iv_define}; $self->_make_top() if $param{make_top_shell}; - my @cmd = (($ENV{VERILATOR_IVERILOG}||"iverilog"), + my @cmd = (($ENV{VERILATOR_IVERILOG} || "iverilog"), @{$param{iv_flags}}, @{$param{iv_flags2}}, @{$param{v_flags}}, @@ -1107,7 +1108,7 @@ sub compile { $self->_make_top() if $param{make_top_shell}; $self->_run(logfile=>"$self->{obj_dir}/xsim_compile.log", fails=>$param{fails}, - cmd=>[($ENV{VERILATOR_XVLOG}||"xvlog"), + cmd=>[($ENV{VERILATOR_XVLOG} || "xvlog"), @{$param{xsim_flags}}, @{$param{xsim_flags2}}, @{$param{v_flags}}, @@ -1165,16 +1166,16 @@ sub compile { expect => $param{expect}, expect_filename => $param{expect_filename}, verilator_run => 1, - cmd => ["cd \"".$self->{obj_dir}."\" && cmake", - "\"".$self->{t_dir}."/..\"", + cmd => ["cd \"" . $self->{obj_dir} . "\" && cmake", + "\"" . $self->{t_dir} . "/..\"", "-DTEST_VERILATOR_ROOT=$ENV{VERILATOR_ROOT}", "-DTEST_NAME=$self->{name}", "-DTEST_CSOURCES=\"@csources\"", "-DTEST_VERILATOR_ARGS=\"@vlt_args\"", "-DTEST_VERILATOR_SOURCES=\"$param{top_filename} @{$param{v_other_filenames}}\"", - "-DTEST_VERBOSE=\"".($self->{verbose} ? 1 : 0)."\"", - "-DTEST_SYSTEMC=\"" .($self->sc ? 1 : 0). "\"", - "-DCMAKE_PREFIX_PATH=\"".(($ENV{SYSTEMC_INCLUDE}||$ENV{SYSTEMC}||'')."/..\""), + "-DTEST_VERBOSE=\"" . ($self->{verbose} ? 1 : 0) . "\"", + "-DTEST_SYSTEMC=\"" . ($self->sc ? 1 : 0) . "\"", + "-DCMAKE_PREFIX_PATH=\"" . (($ENV{SYSTEMC_INCLUDE} || $ENV{SYSTEMC} || '') . "/..\""), "-DTEST_OPT_FAST=\"" . ($param{benchmark} ? "-Os" : "-O0") . "\"", "-DTEST_OPT_GLOBAL=\"" . ($param{benchmark} ? "-Os" : "-O0") . "\"", "-DTEST_VERILATION=\"" . $::Opt_Verilation . "\"", @@ -1187,17 +1188,17 @@ sub compile { $self->_run(logfile => "$self->{obj_dir}/vlt_gcc.log", entering => "$self->{obj_dir}", cmd => [$ENV{MAKE}, - "-C ".$self->{obj_dir}, - "-f ".$FindBin::RealBin."/Makefile_obj", + "-C " . $self->{obj_dir}, + "-f " . $FindBin::RealBin . "/Makefile_obj", ($self->{verbose} ? "" : "--no-print-directory"), "VM_PREFIX=$self->{VM_PREFIX}", "TEST_OBJ_DIR=$self->{obj_dir}", - "CPPFLAGS_DRIVER=-D".uc($self->{name}), + "CPPFLAGS_DRIVER=-D" . uc($self->{name}), ($self->{verbose} ? "CPPFLAGS_DRIVER2=-DTEST_VERBOSE=1":""), ($param{benchmark} ? "" : "OPT_FAST=-O0"), ($param{benchmark} ? "" : "OPT_GLOBAL=-O0"), "$self->{VM_PREFIX}", # bypass default rule, as we don't need archive - ($param{make_flags}||""), + ($param{make_flags} || ""), ]); } @@ -1217,8 +1218,8 @@ sub compile { if ($param{make_pli}) { $self->oprint("Compile vpi\n") if $self->{verbose}; my @cmd = ($ENV{CXX}, @{$param{pli_flags}}, - "-D".$param{tool_define}, - "-DIS_VPI", ($ENV{CFLAGS}||''), + "-D" . $param{tool_define}, + "-DIS_VPI", ($ENV{CFLAGS} || ''), "$self->{t_dir}/$self->{pli_filename}"); $self->_run(logfile=>"$self->{obj_dir}/pli_compile.log", @@ -1230,7 +1231,7 @@ sub compile { } sub execute { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); return 1 if $self->errors || $self->skips || $self->unsupporteds; my %param = (%{$self}, @_); # Default arguments are from $self # params may be expect or {tool}_expect @@ -1245,7 +1246,7 @@ sub execute { if ($param{atsim}) { $self->_run(logfile=>"$self->{obj_dir}/atsim_sim.log", fails=>$param{fails}, - cmd=>["echo q | ".$run_env."$self->{obj_dir}/athdl_sv", + cmd=>["echo q | " . $run_env . "$self->{obj_dir}/athdl_sv", @{$param{atsim_run_flags}}, @{$param{all_run_flags}}, ], @@ -1257,7 +1258,7 @@ sub execute { elsif ($param{ghdl}) { $self->_run(logfile=>"$self->{obj_dir}/ghdl_sim.log", fails=>$param{fails}, - cmd=>[$run_env."$self->{obj_dir}/simghdl", + cmd=>[$run_env . "$self->{obj_dir}/simghdl", @{$param{ghdl_run_flags}}, @{$param{all_run_flags}}, ], @@ -1267,7 +1268,7 @@ sub execute { ); } elsif ($param{iv}) { - my @cmd = ($run_env."$self->{obj_dir}/simiv", + my @cmd = ($run_env . "$self->{obj_dir}/simiv", @{$param{iv_run_flags}}, @{$param{all_run_flags}}, ); @@ -1284,13 +1285,13 @@ sub execute { ); } elsif ($param{ms}) { - my @pli_opt=(); + my @pli_opt = (); if ($param{use_libvpi}) { unshift @pli_opt, "-pli $self->{obj_dir}/libvpi.so"; } $self->_run(logfile=>"$self->{obj_dir}/ms_sim.log", fails=>$param{fails}, - cmd=>["echo q | ".$run_env.($ENV{VERILATOR_MODELSIM}||"vsim"), + cmd=>["echo q | " . $run_env . ($ENV{VERILATOR_MODELSIM} || "vsim"), @{$param{ms_run_flags}}, @{$param{all_run_flags}}, @{pli_opt}, @@ -1304,7 +1305,7 @@ sub execute { elsif ($param{nc}) { $self->_run(logfile=>"$self->{obj_dir}/nc_sim.log", fails=>$param{fails}, - cmd=>["echo q | ".$run_env.($ENV{VERILATOR_NCVERILOG}||"ncverilog"), + cmd=>["echo q | " . $run_env . ($ENV{VERILATOR_NCVERILOG} || "ncverilog"), @{$param{nc_run_flags}}, @{$param{all_run_flags}}, ], @@ -1317,7 +1318,7 @@ sub execute { #my $fh = IO::File->new(">simv.key") or die "%Error: $! simv.key,"; #$fh->print("quit\n"); $fh->close; $self->_run(logfile=>"$self->{obj_dir}/vcs_sim.log", - cmd=>["echo q | ".$run_env."./simv", + cmd=>["echo q | " . $run_env . "./simv", @{$param{vcs_run_flags}}, @{$param{all_run_flags}}, ], @@ -1329,7 +1330,7 @@ sub execute { elsif ($param{xsim}) { $self->_run(logfile=>"$self->{obj_dir}/xsim_sim.log", fails=>$param{fails}, - cmd=>[$run_env.($ENV{VERILATOR_XELAB}||"xelab"), + cmd=>[$run_env.($ENV{VERILATOR_XELAB} || "xelab"), @{$param{xsim_run_flags}}, @{$param{xsim_run_flags2}}, @{$param{all_run_flags}}, @@ -1346,7 +1347,7 @@ sub execute { $param{executable} ||= "$self->{obj_dir}/$param{VM_PREFIX}"; my $debugger = ""; if ($opt_gdbsim) { - $debugger = ($ENV{VERILATOR_GDB}||"gdb")." "; + $debugger = ($ENV{VERILATOR_GDB} || "gdb") . " "; } elsif ($opt_rrsim) { $debugger = "rr record "; } @@ -1370,7 +1371,7 @@ sub execute { } sub setenv { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $var = shift; my $val = shift; print "\texport $var='$val'\n"; @@ -1378,7 +1379,7 @@ sub setenv { } sub inline_checks { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); return 1 if $self->errors || $self->skips || $self->unsupporteds; return 1 if !$self->{vlt_all}; @@ -1392,21 +1393,21 @@ sub inline_checks { while (defined(my $line = $fh->getline)) { if ($line =~ /CHECK/) { if ($line =~ /CHECK_COVER *\( *([---0-9]+) *, *"([^"]+)" *, *("([^"]+)" *,|) *(\d+) *\)/) { - my $lineno = ($. + $1); my $hier=$2; my $comment=$4; my $count=$5; - my $regexp = "\001l\002".$lineno; - $regexp .= ".*\001o\002".quotemeta($comment) if $comment; - $regexp .= ".*\001h\002".quotemeta($hier) if $hier; - $regexp .= ".*' ".$count; + my $lineno = ($. + $1); my $hier = $2; my $comment = $4; my $count = $5; + my $regexp = "\001l\002" . $lineno; + $regexp .= ".*\001o\002" . quotemeta($comment) if $comment; + $regexp .= ".*\001h\002" . quotemeta($hier) if $hier; + $regexp .= ".*' " . $count; if ($contents !~ /$regexp/) { - $self->error("CHECK_COVER: $covfn: Regexp not found: $regexp\n". + $self->error("CHECK_COVER: $covfn: Regexp not found: $regexp\n" . "From $self->{top_filename}:$.: $line"); } } elsif ($line =~ /CHECK_COVER_MISSING *\( *([---0-9]+) *\)/) { my $lineno = ($. + $1); - my $regexp = "\001l\002".$lineno; + my $regexp = "\001l\002" . $lineno; if ($contents =~ /$regexp/) { - $self->error("CHECK_COVER_MISSING: $covfn: Regexp found: $regexp\n". + $self->error("CHECK_COVER_MISSING: $covfn: Regexp found: $regexp\n" . "From $self->{top_filename}:$.: $line"); } } @@ -1422,51 +1423,51 @@ sub inline_checks { # Accessors sub ok { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); $self->{ok} = $_[0] if defined $_[0]; $self->{ok} = 0 if $self->{errors} || $self->{errors_keep_going} || $self->{skips} || $self->unsupporteds; return $self->{ok}; } sub continuing { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); return !($self->errors || $self->skips || $self->unsupporteds); } sub errors { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); return $self->{errors}; } sub golden_filename { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); $self->{golden_filename} = shift if defined $_[0]; return $self->{golden_filename}; } sub scenario_off { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); return $self->{scenario_off}; } sub skips { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); return $self->{skips}; } sub unsupporteds { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); return $self->{unsupporteds}; } sub top_filename { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); $self->{top_filename} = shift if defined $_[0]; return $self->{top_filename}; } sub vhdl { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); $self->{vhdl} = shift if defined $_[0]; if ($self->{vhdl}) { $self->{top_filename} =~ s/\.v$/\.vhdl/; @@ -1475,18 +1476,18 @@ sub vhdl { } sub v_suffix { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); # Suffix for file type, e.g. .vhdl or .v return $self->{vhdl} ? "vhdl" : "v"; } sub sc { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); return $self->{sc}; } sub have_sc { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); return 1 if (defined $ENV{SYSTEMC} || defined $ENV{SYSTEMC_INCLUDE} || $ENV{CFG_HAVE_SYSTEMC}); return 1 if $self->verilator_version =~ /systemc found *= *1/i; return 0; @@ -1534,7 +1535,7 @@ sub get_default_vltmt_threads { } sub pli_filename { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); $self->{pli_filename} = shift if defined $_[0]; return $self->{pli_filename}; } @@ -1545,7 +1546,7 @@ sub too_few_cores { } sub skip_if_too_few_cores { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); if (too_few_cores()) { $self->skip("Skipping due to too few cores\n"); } @@ -1560,7 +1561,7 @@ sub wno_unopthreads_for_few_cores { } sub VM_PREFIX { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); $self->{VM_PREFIX} = shift if defined $_[0]; return $self->{VM_PREFIX}; } @@ -1568,17 +1569,17 @@ sub VM_PREFIX { #---------------------------------------------------------------------- sub run { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); $self->_run(@_); } sub _run { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my %param = (tee => 1, #entering => # Print entering directory information #verilator_run => # Move gcov data to parallel area @_); - my $command = join(' ',@{$param{cmd}}); + my $command = join(' ', @{$param{cmd}}); $command = "time $command" if $opt_benchmark && $command !~ /^cd /; if ($param{verilator_run}) { @@ -1610,15 +1611,15 @@ sub _run { if ($param{logfile}) { $logfh = IO::File->new(">$param{logfile}") or die "%Error: Can't open $param{logfile}"; } - my $pid=fork(); + my $pid = fork(); if ($pid) { # Parent close CHILDWR; print "driver: Entering directory '", File::Spec->rel2abs($param{entering}), "'\n" if $param{entering}; while (1) { my $buf = ''; - my $got = sysread PARENTRD,$buf,10000; - last if defined $got && $got==0; + my $got = sysread PARENTRD, $buf, 10000; + last if defined $got && $got == 0; print $buf if $param{tee}; print $logfh $buf if $logfh; } @@ -1647,7 +1648,7 @@ sub _run { } exit($? ? 10 : 0); # $?>>8 misses coredumps } - waitpid($pid,0); + waitpid($pid, 0); $status = $? || 0; } flush STDOUT; @@ -1702,7 +1703,7 @@ sub _run { #print "**BAD $self->{name} $param{logfile} MT $moretry $try\n"; next if $moretry; $self->error("Miscompares in output from $param{cmd}[0]\n"); - $self->error("Might be error in regexp format\n") if $ok<1; + $self->error("Might be error in regexp format\n") if $ok < 1; print "GOT:\n"; print $wholefile; print "ENDGOT\n"; @@ -1753,7 +1754,7 @@ sub _make_main { my $fh = IO::File->new(">$filename") or die "%Error: $! $filename,"; print $fh "// Test defines\n"; - print $fh "#define MAIN_TIME_MULTIPLIER ".($self->{main_time_multiplier} || 1)."\n"; + print $fh "#define MAIN_TIME_MULTIPLIER " . ($self->{main_time_multiplier} || 1) . "\n"; print $fh "#include \n"; print $fh "#include \n" if $self->{benchmarksim}; @@ -1812,9 +1813,10 @@ sub _make_main { print $fh " const std::unique_ptr contextp{new VerilatedContext};\n"; print $fh " contextp->commandArgs(argc, argv);\n"; - print $fh " contextp->debug(".($self->{verilated_debug}?1:0).");\n"; + print $fh " contextp->debug(" . ($self->{verilated_debug} ? 1 : 0) . ");\n"; print $fh " srand48(5);\n"; # Ensure determinism - print $fh " contextp->randReset(".$self->{verilated_randReset}.");\n" if defined $self->{verilated_randReset}; + print $fh " contextp->randReset(" . $self->{verilated_randReset} . ");\n" + if defined $self->{verilated_randReset}; print $fh " topp.reset(new $VM_PREFIX(\"top\"));\n"; print $fh " contextp->internalsDump()\n;" if $self->{verilated_debug}; @@ -1843,7 +1845,7 @@ sub _make_main { $fh->print(" std::unique_ptr tfp{new VerilatedVcdC};\n") if $self->{trace_format} eq 'vcd-c'; $fh->print(" std::unique_ptr tfp{new VerilatedVcdSc};\n") if $self->{trace_format} eq 'vcd-sc'; $fh->print(" topp->trace(tfp.get(), 99);\n"); - $fh->print(" tfp->open(\"".$self->trace_filename."\");\n"); + $fh->print(" tfp->open(\"" . $self->trace_filename . "\");\n"); if ($self->{trace} && !$self->sc) { $fh->print(" if (tfp) tfp->dump(contextp->time());\n"); } @@ -1874,13 +1876,13 @@ sub _make_main { print $fh " while ((${time} < sim_time * MAIN_TIME_MULTIPLIER)\n"; print $fh " && !contextp->gotFinish()) {\n"; - for (my $i=0; $i<5; $i++) { + for (my $i = 0; $i < 5; $i++) { my $action = 0; if ($self->{inputs}{fastclk}) { print $fh " ${set}fastclk = !${set}fastclk;\n"; $action = 1; } - if ($i==0 && $self->{inputs}{clk}) { + if ($i == 0 && $self->{inputs}{clk}) { print $fh " ${set}clk = !${set}clk;\n"; $action = 1; } @@ -1906,20 +1908,20 @@ sub _make_main { if ($self->{benchmarksim}) { $fh->print(" {\n"); $fh->print(" const std::chrono::duration exec_s = std::chrono::steady_clock::now() - starttime;\n"); - $fh->print(" std::ofstream benchfile(\"".$self->benchmarksim_filename()."\", std::ofstream::out | std::ofstream::app);\n"); + $fh->print(" std::ofstream benchfile(\"" . $self->benchmarksim_filename() . "\", std::ofstream::out | std::ofstream::app);\n"); $fh->print(" benchfile << std::fixed << std::setprecision(9) << n_evals << \",\" << exec_s.count() << std::endl;\n"); $fh->print(" benchfile.close();\n"); $fh->print(" }\n"); } print $fh " if (!contextp->gotFinish()) {\n"; - print $fh ' vl_fatal(__FILE__, __LINE__, "main", "%Error: Timeout; never got a $finish");',"\n"; + print $fh ' vl_fatal(__FILE__, __LINE__, "main", "%Error: Timeout; never got a $finish");', "\n"; print $fh " }\n"; print $fh " topp->final();\n"; if ($self->{coverage}) { $fh->print("#if VM_COVERAGE\n"); - $fh->print(" VerilatedCov::write(\"",$self->{coverage_filename},"\");\n"); + $fh->print(" VerilatedCov::write(\"", $self->{coverage_filename}, "\");\n"); $fh->print("#endif // VM_COVERAGE\n"); } if ($self->{trace}) { @@ -1985,10 +1987,10 @@ sub _make_top_v { } # Inst print $fh " t t (\n"; - my $comma=""; + my $comma = ""; foreach my $inp (sort (keys %{$self->{inputs}})) { print $fh " ${comma}.${inp} (${inp})\n"; - $comma=","; + $comma = ","; } print $fh " );\n"; @@ -1996,8 +1998,8 @@ sub _make_top_v { print $fh "\n"; print $fh "`ifdef WAVES\n"; print $fh " initial begin\n"; - print $fh " \$display(\"-Tracing Waves to Dumpfile: ".$self->trace_filename."\");\n"; - print $fh " \$dumpfile(\"".$self->trace_filename."\");\n"; + print $fh " \$display(\"-Tracing Waves to Dumpfile: " . $self->trace_filename . "\");\n"; + print $fh " \$dumpfile(\"" . $self->trace_filename . "\");\n"; print $fh " \$dumpvars(0, top);\n"; print $fh " end\n"; print $fh "`endif\n"; @@ -2011,10 +2013,10 @@ sub _make_top_v { print $fh " fastclk = 1;\n" if $self->{inputs}{fastclk}; print $fh " clk = 1;\n" if $self->{inputs}{clk}; print $fh " while (\$time < $self->{sim_time}) begin\n"; - for (my $i=0; $i<5; $i++) { + for (my $i = 0; $i < 5; $i++) { print $fh " #1;\n"; print $fh " fastclk = !fastclk;\n" if $self->{inputs}{fastclk}; - print $fh " clk = !clk;\n" if $i==4 && $self->{inputs}{clk}; + print $fh " clk = !clk;\n" if $i == 4 && $self->{inputs}{clk}; } print $fh " end\n"; print $fh " end\n"; @@ -2039,7 +2041,7 @@ sub _make_top_vhdl { my $semi = ""; foreach my $inp (@ports) { print $fh " ${semi}${inp} : in std_logic\n"; - $semi=";"; + $semi = ";"; } print $fh " );\n"; } @@ -2060,10 +2062,10 @@ sub _make_top_vhdl { print $fh " t : t_ent\n"; if ($#ports >= 0) { print $fh " port map(\n"; - my $comma=""; + my $comma = ""; foreach my $inp (@ports) { print $fh "\t${comma}${inp} => ${inp}\n"; - $comma=","; + $comma = ","; } print $fh " )\n"; } @@ -2085,7 +2087,7 @@ sub _read_inputs_v { my $filename = $self->top_filename; $filename = "$self->{t_dir}/$filename" if !-r $filename; my $fh = IO::File->new("<$filename") or die "%Error: $! $filename,"; - my $get_sigs=1; + my $get_sigs = 1; my %inputs; while (defined(my $line = $fh->getline)) { if ($get_sigs) { @@ -2134,9 +2136,9 @@ sub verilator_version { # Returns verbose version, line 1 contains actual version if (!defined $_Verilator_Version) { my @args = ("perl", "$ENV{VERILATOR_ROOT}/bin/verilator", "-V"); - my $args = join(' ',@args); + my $args = join(' ', @args); $_Verilator_Version = `$args`; - $_Verilator_Version or die "can't fork: $! ".join(' ',@args); + $_Verilator_Version or die "can't fork: $! " . join(' ', @args); chomp $_Verilator_Version; } return $_Verilator_Version if defined $_Verilator_Version; @@ -2146,7 +2148,7 @@ sub verilator_version { # File utilities sub files_identical { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $fn1 = shift; my $fn2 = shift; my $fn1_is_logfile = shift; @@ -2201,17 +2203,17 @@ sub files_identical { } } } - my $nl = $#l1; $nl = $#l2 if ($#l2 > $nl); + my $nl = $#l1; $nl = $#l2 if ($#l2 > $nl); for (my $l=0; $l<=$nl; ++$l) { - if (($l1[$l]||"") ne ($l2[$l]||"")) { + if (($l1[$l] || "") ne ($l2[$l] || "")) { next try if $moretry; - $self->error_keep_going("Line ".($l+1)." miscompares; $fn1 != $fn2"); - warn("F1: ".($l1[$l]||"*EOF*\n") - ."F2: ".($l2[$l]||"*EOF*\n")); + $self->error_keep_going("Line " . ($l+1) . " miscompares; $fn1 != $fn2"); + warn("F1: " . ($l1[$l] || "*EOF*\n") + . "F2: " . ($l2[$l] || "*EOF*\n")); if ($ENV{HARNESS_UPDATE_GOLDEN}) { # Update golden files with current warn "%Warning: HARNESS_UPDATE_GOLDEN set: cp $fn1 $fn2\n"; my $fhw = IO::File->new(">$fn2") or $self->error("Files_identical $! $fn2\n"); - $fhw->print(join('',@l1)); + $fhw->print(join('', @l1)); } else { warn "To update reference: HARNESS_UPDATE_GOLDEN=1 {command} or --golden\n"; } @@ -2223,7 +2225,7 @@ sub files_identical { } sub files_identical_sorted { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $fn1 = shift; my $fn2 = shift; my $fn1_is_logfile = shift; @@ -2237,7 +2239,7 @@ sub files_identical_sorted { } sub copy_if_golden { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $fn1 = shift; my $fn2 = shift; if ($ENV{HARNESS_UPDATE_GOLDEN}) { # Update golden files with current @@ -2248,7 +2250,7 @@ sub copy_if_golden { } sub vcd_identical { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $fn1 = shift; my $fn2 = shift; return 0 if $self->errors || $self->skips || $self->unsupporteds; @@ -2290,7 +2292,7 @@ sub vcd_identical { } sub fst2vcd { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $fn1 = shift; my $fn2 = shift; if (!-r $fn1) { $self->error("File does not exist $fn1\n"); return 0; } @@ -2306,17 +2308,17 @@ sub fst2vcd { } sub fst_identical { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $fn1 = shift; my $fn2 = shift; return 0 if $self->errors || $self->skips || $self->unsupporteds; - my $tmp = $fn1.".vcd"; + my $tmp = $fn1 . ".vcd"; fst2vcd($fn1, $tmp); return vcd_identical($tmp, $fn2); } sub _vcd_read { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $filename = shift; my $data = {}; my $fh = IO::File->new("<$filename"); @@ -2375,34 +2377,34 @@ sub tries { } sub glob_all { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $pattern = shift; return glob($pattern); } sub glob_one { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $pattern = shift; return if $self->errors || $self->skips || $self->unsupporteds; my @files = glob($pattern); my $n = scalar @files; if ($n == 0) { - $self->error("glob_one: pattern '$pattern' does not match any files\n"); + $self->error("glob_one: pattern '$pattern' does not match any files\n"); } elsif ($n != 1) { - my $msg = "glob_one: pattern '$pattern' matches multiple files:\n"; - foreach my $file (@files) { - $msg .= $file."\n"; - } - $self->error($msg); + my $msg = "glob_one: pattern '$pattern' matches multiple files:\n"; + foreach my $file (@files) { + $msg .= $file . "\n"; + } + $self->error($msg); } else { - return $files[0]; + return $files[0]; } } sub file_grep_not { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $filename = shift; my $regexp = shift; my $expvalue = shift; @@ -2417,7 +2419,7 @@ sub file_grep_not { } sub file_grep { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $filename = shift; my $regexp = shift; my $expvalue = shift; @@ -2440,18 +2442,18 @@ sub file_grep_any { return if $self->errors || $self->skips || $self->unsupporteds; foreach my $filename (@filenames) { - my $contents = $self->file_contents($filename); - return if ($contents eq "_Already_Errored_"); - if ($contents =~ /$regexp/) { - if ($expvalue && $expvalue ne $1) { - $self->error("file_grep: $filename: Got='$1' Expected='$expvalue' in regexp: $regexp\n"); + my $contents = $self->file_contents($filename); + return if ($contents eq "_Already_Errored_"); + if ($contents =~ /$regexp/) { + if ($expvalue && $expvalue ne $1) { + $self->error("file_grep: $filename: Got='$1' Expected='$expvalue' in regexp: $regexp\n"); + } + return; } - return; - } } my $msg = "file_grep_any: Regexp '$regexp' not found in any of the following files:\n"; foreach my $filename (@filenames) { - $msg .= $filename."\n"; + $msg .= $filename . "\n"; } $self->error($msg); } @@ -2459,14 +2461,14 @@ sub file_grep_any { my %_File_Contents_Cache; sub file_contents { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $filename = shift; if (!$_File_Contents_Cache{$filename}) { my $fh = IO::File->new("<$filename"); if (!$fh) { $_File_Contents_Cache{$filename} = "_Already_Errored_"; - $self->error("File_grep file not found: ".$filename."\n"); + $self->error("File_grep file not found: " . $filename . "\n"); return $_File_Contents_Cache{$filename}; } local $/; undef $/; @@ -2479,7 +2481,7 @@ sub file_contents { } sub write_wholefile { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $filename = shift; my $contents = shift; my $fh = IO::File->new(">$filename") or die "%Error: $! writing $filename,"; @@ -2489,7 +2491,7 @@ sub write_wholefile { } sub file_sed { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my $infilename = shift; my $outfilename = shift; my $editcb = shift; @@ -2503,7 +2505,7 @@ sub file_sed { } sub extract { - my $self = (ref $_[0]? shift : $Self); + my $self = (ref $_[0] ? shift : $Self); my %param = (#in =>, #out => regexp => qr/.*/, @@ -2614,6 +2616,7 @@ sub is_any_left { return 0; } ####################################################################### 1; + package main; __END__ diff --git a/test_regress/t/t_alw_noreorder.pl b/test_regress/t/t_alw_noreorder.pl index 7d6eceb88..46d021e6b 100755 --- a/test_regress/t/t_alw_noreorder.pl +++ b/test_regress/t/t_alw_noreorder.pl @@ -24,7 +24,7 @@ file_grep_any(\@files, qr/dly__t__DOT__v1/i); file_grep_any(\@files, qr/dly__t__DOT__v2/i); execute( - check_finished=>1, + check_finished => 1, ); ok(1); diff --git a/test_regress/t/t_alw_nosplit.pl b/test_regress/t/t_alw_nosplit.pl index ae8fcb03f..a1d66aaad 100755 --- a/test_regress/t/t_alw_nosplit.pl +++ b/test_regress/t/t_alw_nosplit.pl @@ -19,7 +19,7 @@ if ($Self->{vlt_all}) { } execute( - check_finished=>1, + check_finished => 1, ); ok(1); diff --git a/test_regress/t/t_alw_reorder.pl b/test_regress/t/t_alw_reorder.pl index dce2f101f..90a7126da 100755 --- a/test_regress/t/t_alw_reorder.pl +++ b/test_regress/t/t_alw_reorder.pl @@ -28,7 +28,7 @@ foreach my $file ( } execute( - check_finished=>1, + check_finished => 1, ); ok(1); diff --git a/test_regress/t/t_clk_condflop_nord.pl b/test_regress/t/t_clk_condflop_nord.pl index 57e493fa0..0c03448c5 100755 --- a/test_regress/t/t_clk_condflop_nord.pl +++ b/test_regress/t/t_clk_condflop_nord.pl @@ -11,7 +11,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(simulator => 1); compile( - verilator_flags2=>["-no-order-clock-delay"], + verilator_flags2 => ["-no-order-clock-delay"], ); execute( diff --git a/test_regress/t/t_const_opt.pl b/test_regress/t/t_const_opt.pl index 5dbe1ff36..ee51e8030 100755 --- a/test_regress/t/t_const_opt.pl +++ b/test_regress/t/t_const_opt.pl @@ -11,7 +11,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(simulator => 1); compile( - verilator_flags2=>["-Wno-UNOPTTHREADS", "--stats"], + verilator_flags2 => ["-Wno-UNOPTTHREADS", "--stats"], ); execute( diff --git a/test_regress/t/t_const_opt_cov.pl b/test_regress/t/t_const_opt_cov.pl index a052e9321..211e1d79a 100755 --- a/test_regress/t/t_const_opt_cov.pl +++ b/test_regress/t/t_const_opt_cov.pl @@ -11,7 +11,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(simulator => 1); compile( - verilator_flags2=>["-Wno-UNOPTTHREADS", "--stats", "--coverage", "--trace"], + verilator_flags2 => ["-Wno-UNOPTTHREADS", "--stats", "--coverage", "--trace"], ); execute( diff --git a/test_regress/t/t_const_opt_red.pl b/test_regress/t/t_const_opt_red.pl index 666e5d478..a9e16fbf5 100755 --- a/test_regress/t/t_const_opt_red.pl +++ b/test_regress/t/t_const_opt_red.pl @@ -11,7 +11,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(simulator => 1); compile( - verilator_flags2=>["-Wno-UNOPTTHREADS", "--stats"], + verilator_flags2 => ["-Wno-UNOPTTHREADS", "--stats"], ); execute( diff --git a/test_regress/t/t_const_opt_shortcut.pl b/test_regress/t/t_const_opt_shortcut.pl index 89c1226dd..8955f94f0 100755 --- a/test_regress/t/t_const_opt_shortcut.pl +++ b/test_regress/t/t_const_opt_shortcut.pl @@ -12,7 +12,7 @@ scenarios(simulator => 1); compile( v_flags2 => ["t/$Self->{name}.cpp"], - verilator_flags2=>["-Wno-UNOPTTHREADS", "--stats"], + verilator_flags2 => ["-Wno-UNOPTTHREADS", "--stats"], ); execute( diff --git a/test_regress/t/t_display_merge.pl b/test_regress/t/t_display_merge.pl index 66642748d..75570aba2 100755 --- a/test_regress/t/t_display_merge.pl +++ b/test_regress/t/t_display_merge.pl @@ -11,7 +11,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(simulator => 1); compile( - verilator_flags2=>["--stats"], + verilator_flags2 => ["--stats"], ); execute( diff --git a/test_regress/t/t_dist_cinclude.pl b/test_regress/t/t_dist_cinclude.pl index 873380dce..90b0723b7 100755 --- a/test_regress/t/t_dist_cinclude.pl +++ b/test_regress/t/t_dist_cinclude.pl @@ -51,7 +51,7 @@ if (!-r "$root/.git") { } if (keys %names) { - error("Files like stdint.h instead of cstdint: ",join(' ',sort keys %names)); + error("Files like stdint.h instead of cstdint: ", join(' ', sort keys %names)); } } diff --git a/test_regress/t/t_dist_error_format.pl b/test_regress/t/t_dist_error_format.pl index 654a7c70f..bdacfb6ac 100755 --- a/test_regress/t/t_dist_error_format.pl +++ b/test_regress/t/t_dist_error_format.pl @@ -68,7 +68,7 @@ sub formats { $lnmatch or error("Check line number regexp is correct, no matches"); if (keys %warns) { # First warning lists everything as that's shown in the driver summary - error($summary." ",join(' ',sort keys %warns)); + error($summary . " ", join(' ', sort keys %warns)); foreach my $file (sort keys %warns) { error($warns{$file}); } diff --git a/test_regress/t/t_dist_fixme.pl b/test_regress/t/t_dist_fixme.pl index 3fd51c460..f722de3fe 100755 --- a/test_regress/t/t_dist_fixme.pl +++ b/test_regress/t/t_dist_fixme.pl @@ -32,7 +32,7 @@ if (!-r "$root/.git") { } foreach my $bfiles (@batch) { - my $cmd = "cd $root && grep -n -P '(FIX"."ME|BO"."ZO)' $bfiles | sort"; + my $cmd = "cd $root && grep -n -P '(FIX" . "ME|BO" . "ZO)' $bfiles | sort"; my $grep = `$cmd`; if ($grep ne "") { print "$grep\n"; @@ -43,7 +43,7 @@ if (!-r "$root/.git") { } } if (scalar(%names) >= 1) { - error("Files with FIX"."MEs: ",join(' ',sort keys %names)); + error("Files with FIX" . "MEs: ", join(' ', sort keys %names)); } } diff --git a/test_regress/t/t_dist_inctree.pl b/test_regress/t/t_dist_inctree.pl index 8b579db84..acbbaa079 100755 --- a/test_regress/t/t_dist_inctree.pl +++ b/test_regress/t/t_dist_inctree.pl @@ -34,7 +34,7 @@ sub inctree { my $grep = `$cmd`; foreach my $line (split /\n/, $grep) { if ($line =~ /^(\S+):(\d+):#\s*include\s*(\S+)/) { - my $filename = $1; my $line = $2+0; my $inc = $3; + my $filename = $1; my $line = $2 + 0; my $inc = $3; (my $base = $filename) =~ s!.*/(.*?)!$1!; $inc =~ s/[<>"]//g; $Files{$base}{filename} = $filename; diff --git a/test_regress/t/t_dist_install.pl b/test_regress/t/t_dist_install.pl index 67c6d5b2a..abf277032 100755 --- a/test_regress/t/t_dist_install.pl +++ b/test_regress/t/t_dist_install.pl @@ -19,7 +19,7 @@ if (!-r "$root/.git") { skip("Not in a git repository"); } else { my $cwd = getcwd(); - my $destdir = "$cwd/".$Self->{obj_dir}; + my $destdir = "$cwd/" . $Self->{obj_dir}; # Start clean run(cmd => ["rm -rf $destdir && mkdir -p $destdir"], check_finished => 0); @@ -48,7 +48,7 @@ if (!-r "$root/.git") { push @files, $file; } if ($#files >= 0) { - error("Uninstall missed files: ",join(' ',@files)); + error("Uninstall missed files: ", join(' ',@files)); } } diff --git a/test_regress/t/t_dist_portability.pl b/test_regress/t/t_dist_portability.pl index 99fa2f164..b436e5cb5 100755 --- a/test_regress/t/t_dist_portability.pl +++ b/test_regress/t/t_dist_portability.pl @@ -48,7 +48,7 @@ sub uint { } } if (keys %names) { - error("Files with uint32*_t instead of vluint32s: ",join(' ',sort keys %names)); + error("Files with uint32*_t instead of vluint32s: ", join(' ', sort keys %names)); } } @@ -69,7 +69,7 @@ sub printfll { } } if (keys %names) { - error("Files with %ll instead of VL_PRI64: ",join(' ',sort keys %names)); + error("Files with %ll instead of VL_PRI64: ", join(' ', sort keys %names)); } } @@ -87,7 +87,7 @@ sub cstr { } } if (keys %names) { - error("Files with potential c_str() lifetime issue: ",join(' ',sort keys %names)); + error("Files with potential c_str() lifetime issue: ", join(' ', sort keys %names)); } } @@ -106,7 +106,7 @@ sub vsnprintf { } } if (keys %names) { - error("Files with vsnprintf, use VL_VSNPRINTF: ",join(' ',sort keys %names)); + error("Files with vsnprintf, use VL_VSNPRINTF: ", join(' ', sort keys %names)); } } @@ -127,7 +127,7 @@ sub final { } } if (keys %names) { - error("Files with classes without final/VL_NOT_FINAL: ",join(' ',sort keys %names)); + error("Files with classes without final/VL_NOT_FINAL: ", join(' ', sort keys %names)); } } diff --git a/test_regress/t/t_dist_tabs.pl b/test_regress/t/t_dist_tabs.pl index cd830d4fc..f1bb39258 100755 --- a/test_regress/t/t_dist_tabs.pl +++ b/test_regress/t/t_dist_tabs.pl @@ -43,10 +43,10 @@ if (!-r "$root/.git") { $btab = 0; print " File $file\n" if $Self->{verbose}; } - elsif ($line =~ m!^@@ -?[0-9]+,?[0-9]* \+?([0-9]+)!) { + elsif ($line =~ m!^@@ -?[0-9]+,?[0-9]* \+?([0-9]+)!) { $lineno = $1 - 1; } - elsif ($line =~ m!^ !) { + elsif ($line =~ m!^ !) { ++$lineno; if ($line =~ m!^[- ].*\t!) { print " Had tabs\n" if $Self->{verbose} && !$atab; @@ -72,7 +72,7 @@ if (!-r "$root/.git") { if ($len >= 100 && $file !~ $Tabs_Exempt_Re && $file !~ $Wide_Exempt_Re) { - print" Wide $line\n" if $Self->{verbose}; + print " Wide $line\n" if $Self->{verbose}; $summary = "File modification adds a new >100 column line:" if !$summary; $warns{$file} = "File modification adds a new >100 column line: $file:$lineno"; } @@ -81,7 +81,7 @@ if (!-r "$root/.git") { } if (keys %warns) { # First warning lists everything as that's shown in the driver summary - error($summary." ",join(' ',sort keys %warns)); + error($summary . " ", join(' ', sort keys %warns)); foreach my $file (sort keys %warns) { error($warns{$file}); } diff --git a/test_regress/t/t_dist_untracked.pl b/test_regress/t/t_dist_untracked.pl index 9f25d1622..254e6aa3d 100755 --- a/test_regress/t/t_dist_untracked.pl +++ b/test_regress/t/t_dist_untracked.pl @@ -27,16 +27,16 @@ if (!-r "$root/.git") { next if $file =~ /nodist/; if (_has_tabs("$root/$file")) { $warns{$file} = "File not in git or .gitignore (with tabs): $file"; - $summary = "Files untracked in git or .gitignore (with tabs):" + $summary = "Files untracked in git or .gitignore (with tabs):"; } else { $warns{$file} = "File not in git or .gitignore: $file"; - $summary ||= "Files untracked in git or .gitignore:" + $summary ||= "Files untracked in git or .gitignore:"; } } } if (keys %warns) { # First warning lists everything as that's shown in the driver summary - error($summary." ",join(' ',sort keys %warns)); + error($summary . " ", join(' ', sort keys %warns)); foreach my $file (sort keys %warns) { error($warns{$file}); } diff --git a/test_regress/t/t_dist_whitespace.pl b/test_regress/t/t_dist_whitespace.pl index bf7f6ca36..451d46e98 100755 --- a/test_regress/t/t_dist_whitespace.pl +++ b/test_regress/t/t_dist_whitespace.pl @@ -66,10 +66,10 @@ foreach my $file (sort keys %files) { if (keys %warns) { # First warning lists everything as that's shown in the driver summary if ($ENV{HARNESS_UPDATE_GOLDEN}) { - error("Updated files with whitespace errors: ",join(' ',sort keys %warns)); + error("Updated files with whitespace errors: ", join(' ', sort keys %warns)); error("To auto-fix: HARNESS_UPDATE_GOLDEN=1 {command} or --golden"); } else { - error("Files have whitespace errors: ",join(' ',sort keys %warns)); + error("Files have whitespace errors: ", join(' ', sort keys %warns)); error("To auto-fix: HARNESS_UPDATE_GOLDEN=1 {command} or --golden"); } foreach my $file (sort keys %warns) { diff --git a/test_regress/t/t_dpi_import_hdr_only.pl b/test_regress/t/t_dpi_import_hdr_only.pl index 92c6227ed..b497878f2 100755 --- a/test_regress/t/t_dpi_import_hdr_only.pl +++ b/test_regress/t/t_dpi_import_hdr_only.pl @@ -26,10 +26,10 @@ compile( my @files = glob($tmp_dir . "/*"); error("Did not produce DPI header") if scalar(@files) == 0; -error("Too many files created:".join(', ', @files)) if scalar(@files) > 1; +error("Too many files created:" . join(', ', @files)) if scalar(@files) > 1; my $tmp_header = $files[0]; -print("============".$tmp_header."\n"); +print("============" . $tmp_header . "\n"); error("Unexpected file $tmp_header") unless $tmp_header =~ /__Dpi\.h$/; compile( diff --git a/test_regress/t/t_gate_chained.pl b/test_regress/t/t_gate_chained.pl index 3b151b61f..ac9dd39d1 100755 --- a/test_regress/t/t_gate_chained.pl +++ b/test_regress/t/t_gate_chained.pl @@ -24,7 +24,7 @@ sub gen { $fh->print("\n"); my $prev = "i"; my $n = 9000; - for (my $i=1; $i<$n; ++$i) { + for (my $i = 1; $i < $n; ++$i) { $fh->printf(" wire [63:0] ass%04x = (sel == 16'h%04x) ? 64'h0 : $prev;\n", $i, $i); $prev = sprintf("ass%04x", $i); } @@ -34,8 +34,8 @@ sub gen { $fh->print("\n"); $fh->print(" always @ (posedge clk) begin\n"); - $fh->print(' $write("*-* All Finished *-*\n");',"\n"); - $fh->print(' $finish;',"\n"); + $fh->print(' $write("*-* All Finished *-*\n");', "\n"); + $fh->print(' $finish;', "\n"); $fh->print(" end\n"); $fh->print("endmodule\n"); } @@ -45,8 +45,8 @@ top_filename("$Self->{obj_dir}/t_gate_chained.v"); gen($Self->{top_filename}); compile( - verilator_flags2=>["--stats --x-assign fast --x-initial fast", - "-Wno-UNOPTTHREADS"], + verilator_flags2 => ["--stats --x-assign fast --x-initial fast", + "-Wno-UNOPTTHREADS"], ); execute( diff --git a/test_regress/t/t_gate_ormux.pl b/test_regress/t/t_gate_ormux.pl index e0cf23b95..02476bffd 100755 --- a/test_regress/t/t_gate_ormux.pl +++ b/test_regress/t/t_gate_ormux.pl @@ -15,7 +15,7 @@ $Self->{sim_time} = $Self->{cycles} * 10 + 1000; compile( v_flags2 => ["+define+SIM_CYCLES=$Self->{cycles}",], - verilator_flags2=>["-Wno-UNOPTTHREADS", "--stats"], + verilator_flags2 => ["-Wno-UNOPTTHREADS", "--stats"], ); if ($Self->{vlt}) { diff --git a/test_regress/t/t_preproc.pl b/test_regress/t/t_preproc.pl index 930deb5d7..1a9daee70 100755 --- a/test_regress/t/t_preproc.pl +++ b/test_regress/t/t_preproc.pl @@ -51,7 +51,7 @@ sub preproc_check { my $check = shift @Line_Checks; if (!$check) { error("$filename2:$.: Extra Line_Preproc_Check\n"); } if ($linecmt != $check) { error("$filename2:$.: __LINE__ inserted $linecmt, exp=$check\n"); } - if ($lineno != $check) { error("$filename2:$.: __LINE__ on `line $lineno, exp=$check\n"); } + if ($lineno != $check) { error("$filename2:$.: __LINE__ on `line $lineno, exp=$check\n"); } } } $fh->close; diff --git a/test_regress/t/t_timing_long.pl b/test_regress/t/t_timing_long.pl index 031575331..5f0b728d3 100755 --- a/test_regress/t/t_timing_long.pl +++ b/test_regress/t/t_timing_long.pl @@ -34,18 +34,18 @@ sub gen { $fh->print(" initial begin\n"); my $n = 100; - for (my $i=1; $i<$n; ++$i) { + for (my $i = 1; $i < $n; ++$i) { # If statement around the timing is important to make the code scheduling # mostly unpredictable - $fh->printf(" if (cnt == %d) begin\n", $i-1); + $fh->printf(" if (cnt == %d) begin\n", $i - 1); $fh->printf(" #1; ++cnt; `MSG((\"[%0t] cnt?=${i}\", \$time));" ." if (cnt != %d) \$stop;\n", $i); $fh->printf(" end\n"); } $fh->print("\n"); - $fh->print(' $write("*-* All Finished *-*\n");',"\n"); - $fh->print(' $finish;',"\n"); + $fh->print(' $write("*-* All Finished *-*\n");', "\n"); + $fh->print(' $finish;', "\n"); $fh->print(" end\n"); $fh->print("endmodule\n"); } @@ -55,8 +55,8 @@ top_filename("$Self->{obj_dir}/t_timing_long.v"); gen($Self->{top_filename}); compile( - #verilator_flags2=>["--exe --build --main --timing"], # Unsupported - verilator_flags2=>["--exe --build --main -Wno-STMTDLY"], + # verilator_flags2 => ["--exe --build --main --timing"], # Unsupported + verilator_flags2 => ["--exe --build --main -Wno-STMTDLY"], verilator_make_cmake => 0, verilator_make_gmake => 0, make_main => 0, diff --git a/test_regress/t/t_trace_complex_params.pl b/test_regress/t/t_trace_complex_params.pl index 04c792441..8f72740a0 100755 --- a/test_regress/t/t_trace_complex_params.pl +++ b/test_regress/t/t_trace_complex_params.pl @@ -20,7 +20,7 @@ execute( check_finished => 1, ); -file_grep ("$Self->{obj_dir}/simx.vcd", qr/ PARAM /); +file_grep("$Self->{obj_dir}/simx.vcd", qr/ PARAM /); vcd_identical("$Self->{obj_dir}/simx.vcd", $Self->{golden_filename}); diff --git a/test_regress/t/t_unopt_array.pl b/test_regress/t/t_unopt_array.pl index 6361d5df0..6bef1be6c 100755 --- a/test_regress/t/t_unopt_array.pl +++ b/test_regress/t/t_unopt_array.pl @@ -11,7 +11,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(simulator => 1); compile( - verilator_flags2=>["-Wno-UNOPTFLAT"], + verilator_flags2 => ["-Wno-UNOPTFLAT"], ); execute( diff --git a/test_regress/t/t_var_rsvd_port.pl b/test_regress/t/t_var_rsvd_port.pl index de2083cc5..76a08e9aa 100755 --- a/test_regress/t/t_var_rsvd_port.pl +++ b/test_regress/t/t_var_rsvd_port.pl @@ -11,7 +11,7 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(simulator => 1); compile( - verilator_flags2=>["-Wno-SYMRSVDWORD"], + verilator_flags2 => ["-Wno-SYMRSVDWORD"], ); execute(); From 4b274a8d4d8e10c2ab233773fac8a0bd2281ede4 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Wed, 8 Sep 2021 08:16:31 -0400 Subject: [PATCH 19/65] Convert verilator_gantt to python --- Makefile.in | 1 + bin/verilator_gantt | 898 ++++++++++++++++------------------ docs/guide/conf.py | 2 +- test_regress/t/t_gantt_io.out | 10 +- 4 files changed, 419 insertions(+), 492 deletions(-) diff --git a/Makefile.in b/Makefile.in index 83e4518a0..06574e83f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -353,6 +353,7 @@ clang-format: PY_PROGRAMS = \ bin/verilator_ccache_report \ bin/verilator_difftree \ + bin/verilator_gantt \ bin/verilator_profcfunc \ examples/xml_py/vl_file_copy \ examples/xml_py/vl_hier_graph \ diff --git a/bin/verilator_gantt b/bin/verilator_gantt index 0284180b1..e48792425 100755 --- a/bin/verilator_gantt +++ b/bin/verilator_gantt @@ -1,163 +1,135 @@ -#!/usr/bin/env perl -# See copyright, etc in below POD section. +#!/usr/bin/env python3 +# pylint: disable=C0103,C0114,C0116,C0301,R0914,R0912,R0915,W0511,eval-used ###################################################################### -use warnings; -use strict; -use Getopt::Long; -use IO::File; -use Pod::Usage; -use vars qw($Debug); +import argparse +import collections +import math +import re +import statistics +# from pprint import pprint -$Debug = 0; -my $Opt_File; -my $Opt_Time_Per_Char = 0; # rdtsc ticks per char in gantt chart, 0=auto -my $opt_vcd = "profile_threads.vcd"; - -our %Threads; -our %Mtasks; -our %Global; - -autoflush STDOUT 1; -autoflush STDERR 1; -Getopt::Long::config("no_auto_abbrev"); -if (! GetOptions( - "help" => \&usage, - "scale=i" => \$Opt_Time_Per_Char, - "debug" => sub { $Debug = 1; }, - "vcd=s" => \$opt_vcd, - "no-vcd!" => sub { $opt_vcd = undef; }, - "<>" => \¶meter, - )) { - die "%Error: Bad usage, try 'verilator_gantt --help'\n"; +Threads = collections.defaultdict(lambda: {}) +Mtasks = collections.defaultdict(lambda: {}) +Global = { + 'args': {}, + 'cpuinfo': collections.defaultdict(lambda: {}), + 'rdtsc_cycle_time': 0, + 'stats': {} } -$Opt_File = "profile_threads.dat" if !defined $Opt_File; +###################################################################### -process($Opt_File); -write_vcd($opt_vcd) if defined $opt_vcd; -exit(0); -####################################################################### +def process(filename): + read_data(filename) + report() -sub usage { - pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT); - exit(1); # Unreachable -} -sub parameter { - my $param = shift; - if (!defined $Opt_File) { - $Opt_File = $param; - } else { - die "%Error: Unknown parameter: $param\n"; - } -} +def read_data(filename): + with open(filename) as fh: + re_prof = re.compile( + r'^VLPROF mtask\s(\d+)\sstart\s(\d+)\send\s(\d+)\selapsed\s(\d+)\spredict_time\s(\d+)\scpu\s(\d+)\son thread (\d+)' + ) + re_arg1 = re.compile(r'VLPROF arg\s+(\S+)\+([0-9.])\s*') + re_arg2 = re.compile(r'VLPROF arg\s+(\S+)\s+([0-9.])\s*$') + re_stat = re.compile(r'VLPROF stat\s+(\S+)\s+([0-9.]+)') + re_time = re.compile(r'rdtsc time = (\d+) ticks') + re_proc_cpu = re.compile(r'VLPROFPROC processor\s*:\s*(\d+)\s*$') + re_proc_dat = re.compile(r'VLPROFPROC ([a-z_ ]+)\s*:\s*(.*)$') + cpu = None -####################################################################### + for line in fh: + if re_prof.match(line): + match = re_prof.match(line) + mtask = int(match.group(1)) + start = int(match.group(2)) + end = int(match.group(3)) + elapsed_time = int(match.group(4)) + predict_time = int(match.group(5)) + cpu = int(match.group(6)) + thread = int(match.group(7)) + if start not in Threads[thread]: + Threads[thread][start] = {} + Threads[thread][start]['mtask'] = mtask + Threads[thread][start]['end'] = end + Threads[thread][start]['cpu'] = cpu -sub process { - my $filename = shift; + if 'elapsed' not in Mtasks[mtask]: + Mtasks[mtask] = {'end': 0, 'elapsed': 0} + Mtasks[mtask]['elapsed'] += elapsed_time + Mtasks[mtask]['predict'] = predict_time + Mtasks[mtask]['end'] = max(Mtasks[mtask]['end'], end) + elif re.match(r'^VLPROFTHREAD', line): + None # pylint: disable=pointless-statement + elif re_arg1.match(line): + match = re_arg1.match(line) + Global['args'][match.group(1)] = match.group(2) + elif re_arg2.match(line): + match = re_arg2.match(line) + Global['args'][match.group(1)] = match.group(2) + elif re_stat.match(line): + match = re_stat.match(line) + Global['stats'][match.group(1)] = match.group(2) + elif re_proc_cpu.match(line): + match = re_proc_cpu.match(line) + cpu = int(match.group(1)) + elif cpu and re_proc_dat.match(line): + match = re_proc_dat.match(line) + term = match.group(1) + value = match.group(2) + term = re.sub(r'\s+$', '', term) + term = re.sub(r'\s+', '_', term) + value = re.sub(r'\s+$', '', value) + Global['cpuinfo'][cpu][term] = value + elif re.match(r'^#', line): + None # pylint: disable=pointless-statement + elif Args.debug: + print("-Unk: %s" % line) + # TODO -- this is parsing text printed by a client. + # Really, verilator proper should generate this + # if it's useful... + if re_time.match(line): + Global['rdtsc_cycle_time'] = re_time.group(1) - read_data($filename); - report(); -} -####################################################################### +def re_match_result(regexp, line, result_to): + result_to = re.match(regexp, line) + return result_to -sub read_data { - my $filename = shift; - %Global = (rdtsc_cycle_time => 0); +###################################################################### - my $fh = IO::File->new("<$filename") or die "%Error: $! $filename,"; - my $cpu; - while (my $line = $fh->getline) { - if ($line =~ m/VLPROF mtask\s(\d+)\sstart\s(\d+)\send\s(\d+)\selapsed\s(\d+)\spredict_time\s(\d+)\scpu\s(\d+)\son thread (\d+)/) { - my $mtask = $1; - my $start = $2; - my $end = $3; - my $elapsed_time = $4; - my $predict_time = $5; - my $cpu = $6; - my $thread = $7; - $Threads{$thread}{$start}{mtask} = $mtask; - $Threads{$thread}{$start}{end} = $end; - $Threads{$thread}{$start}{cpu} = $cpu; +def report(): + print("Verilator Gantt report") - if (!exists $Mtasks{$mtask}{elapsed}) { - $Mtasks{$mtask}{elapsed} = 0; - } - $Mtasks{$mtask}{elapsed} += $elapsed_time; - $Mtasks{$mtask}{predict} = $predict_time; - $Mtasks{$mtask}{end} = max($Mtasks{$mtask}{end}, $end); - } - elsif ($line =~ /^VLPROFTHREAD/) {} - elsif ($line =~ m/VLPROF arg\s+(\S+)\+([0-9.])\s*$/ - || $line =~ m/VLPROF arg\s+(\S+)\s+([0-9.])\s*$/) { - $Global{args}{$1} = $2; - } - elsif ($line =~ m/VLPROF stat\s+(\S+)\s+([0-9.]+)/) { - $Global{stats}{$1} = $2; - } - elsif ($line =~ m/^VLPROFPROC processor\s*:\s*(\d+)\s*$/) { - $cpu = $1; - } - elsif (defined $cpu && $line =~ m/^VLPROFPROC ([a-z_ ]+)\s*:\s*(.*)$/) { - my ($term, $value) = ($1, $2); - $term =~ s/\s+$//; - $term =~ s/\s+/_/; - $value =~ s/\s+$//; - $Global{cpuinfo}{$cpu}{$term} = $value; - } - elsif ($line =~ /^#/) {} - elsif ($Debug) { - chomp $line; - print "Unk: $line\n"; - } - # TODO -- this is parsing text printed by a client. - # Really, verilator proper should generate this - # if it's useful... - if ($line =~ m/rdtsc time = (\d+) ticks/) { - $Global{rdtsc_cycle_time} = $1; - } - } -} + print("\nArgument settings:") + for arg in sorted(Global['args'].keys()): + plus = "+" if re.match(r'^\+', arg) else " " + print(" %s%s%s" % (arg, plus, Global['args'][arg])) -####################################################################### - -sub report { - print "Verilator Gantt report\n"; - - print "\nArgument settings:\n"; - foreach my $arg (sort keys %{$Global{args}}) { - my $plus = ($arg =~ /^\+/) ? "+" : " "; - printf " %s%s%d\n", $arg, $plus, $Global{args}{$arg}; - } - - my $nthreads = scalar keys %Threads; - $Global{cpus} = {}; - foreach my $thread (keys %Threads) { + nthreads = len(Threads) + Global['cpus'] = {} + for thread in Threads: # Make potentially multiple characters per column - foreach my $start (keys %{$Threads{$thread}}) { - my $cpu = $Threads{$thread}{$start}{cpu}; - my $elapsed = $Threads{$thread}{$start}{end} - $start; - $Global{cpus}{$cpu}{cpu_time} += $elapsed; - } - } + for start in Threads[thread]: + cpu = Threads[thread][start]['cpu'] + elapsed = Threads[thread][start]['end'] - start + if cpu not in Global['cpus']: + Global['cpus'][cpu] = {'cpu_time': 0} + Global['cpus'][cpu]['cpu_time'] += elapsed - my $mt_mtask_time = 0; - my $long_mtask_time = 0; - my $last_end = 0; - foreach my $mtask (keys %Mtasks) { - $mt_mtask_time += $Mtasks{$mtask}{elapsed}; - $last_end = max($last_end, $Mtasks{$mtask}{end}); - $long_mtask_time = max($long_mtask_time, $Mtasks{$mtask}{elapsed}); - } - $Global{last_end} = $last_end; + mt_mtask_time = 0 + long_mtask_time = 0 + last_end = 0 + for mtask in Mtasks: + mt_mtask_time += Mtasks[mtask]['elapsed'] + last_end = max(last_end, Mtasks[mtask]['end']) + long_mtask_time = max(long_mtask_time, Mtasks[mtask]['elapsed']) + Global['last_end'] = last_end - report_graph(); + report_graph() # If we know cycle time in the same (rdtsc) units, # this will give us an actual utilization number, @@ -167,402 +139,356 @@ sub report { # serial mode, to estimate the overhead of data sharing, # which will show up in the total elapsed time. (Overhead # of synchronization and scheduling should not.) - print "\nAnalysis:\n"; - printf " Total threads = %d\n", $nthreads; - printf " Total mtasks = %d\n", scalar(keys %Mtasks); - my $ncpus = scalar(keys %{$Global{cpus}}); - printf " Total cpus used = %d\n", $ncpus; - printf " Total yields = %d\n", $Global{stats}{yields}; - printf " Total eval time = %d rdtsc ticks\n", $Global{last_end}; - printf " Longest mtask time = %d rdtsc ticks\n", $long_mtask_time; - printf " All-thread mtask time = %d rdtsc ticks\n", $mt_mtask_time; - my $long_efficiency = $long_mtask_time/($Global{last_end} || 1); - printf " Longest-thread efficiency = %0.1f%%\n", $long_efficiency*100; - my $mt_efficiency = $mt_mtask_time/($Global{last_end}*$nthreads || 1); - printf " All-thread efficiency = %0.1f%%\n", $mt_efficiency*100; - printf " All-thread speedup = %0.1f\n", $mt_efficiency*$nthreads; - if ($Global{rdtsc_cycle_time} > 0) { - my $ut = $mt_mtask_time / $Global{rdtsc_cycle_time}; - print "tot_mtask_cpu=$mt_mtask_time cyc=$Global{rdtsc_cycle_time} ut=$ut\n"; - } + print("\nAnalysis:") + print(" Total threads = %d" % nthreads) + print(" Total mtasks = %d" % len(Mtasks)) + ncpus = len(Global['cpus']) + print(" Total cpus used = %d" % ncpus) + print(" Total yields = %d" % int(Global['stats']['yields'])) + print(" Total eval time = %d rdtsc ticks" % Global['last_end']) + print(" Longest mtask time = %d rdtsc ticks" % long_mtask_time) + print(" All-thread mtask time = %d rdtsc ticks" % mt_mtask_time) + long_efficiency = long_mtask_time / (Global.get('last_end', 1)) + print(" Longest-thread efficiency = %0.1f%%" % (long_efficiency * 100.0)) + mt_efficiency = mt_mtask_time / (Global.get('last_end', 1) * nthreads or 1) + print(" All-thread efficiency = %0.1f%%" % (mt_efficiency * 100.0)) + print(" All-thread speedup = %0.1f" % (mt_efficiency * nthreads)) + if Global['rdtsc_cycle_time'] > 0: + ut = mt_mtask_time / Global['rdtsc_cycle_time'] + print("tot_mtask_cpu=" + mt_mtask_time + " cyc=" + + Global['rdtsc_cycle_time'] + " ut=" + ut) - my @p2e_ratios; - my $min_p2e = 1000000; - my $min_mtask; - my $max_p2e = -1000000; - my $max_mtask; - foreach my $mtask (sort keys %Mtasks) { - if ($Mtasks{$mtask}{elapsed} > 0) { - if ($Mtasks{$mtask}{predict} == 0) { - $Mtasks{$mtask}{predict} = 1; # don't log(0) below - } - my $p2e_ratio = log( $Mtasks{$mtask}{predict} / $Mtasks{$mtask}{elapsed} ); - #print "log(p2e $mtask) = $p2e_ratio (predict $Mtasks{$mtask}{predict}, elapsed $Mtasks{$mtask}{elapsed})\n"; - push @p2e_ratios, $p2e_ratio; + p2e_ratios = [] + min_p2e = 1000000 + min_mtask = None + max_p2e = -1000000 + max_mtask = None - if ($p2e_ratio > $max_p2e) { - $max_p2e = $p2e_ratio; - $max_mtask = $mtask; - } - if ($p2e_ratio < $min_p2e) { - $min_p2e = $p2e_ratio; - $min_mtask = $mtask; - } - } - } + for mtask in sorted(Mtasks.keys()): + if Mtasks[mtask]['elapsed'] > 0: + if Mtasks[mtask]['predict'] == 0: + Mtasks[mtask]['predict'] = 1 # don't log(0) below + p2e_ratio = math.log(Mtasks[mtask]['predict'] / + Mtasks[mtask]['elapsed']) + p2e_ratios.append(p2e_ratio) - print "\nStatistics:\n"; - printf " min log(p2e) = %0.3f", $min_p2e; - print " from mtask $min_mtask (predict $Mtasks{$min_mtask}{predict},"; - print " elapsed $Mtasks{$min_mtask}{elapsed})\n"; - printf " max log(p2e) = %0.3f", $max_p2e; - print " from mtask $max_mtask (predict $Mtasks{$max_mtask}{predict},"; - print " elapsed $Mtasks{$max_mtask}{elapsed})\n"; + if p2e_ratio > max_p2e: + max_p2e = p2e_ratio + max_mtask = mtask + if p2e_ratio < min_p2e: + min_p2e = p2e_ratio + min_mtask = mtask - my $stddev = stddev(\@p2e_ratios); - my $mean = mean(\@p2e_ratios); - printf " mean = %0.3f\n", $mean; - printf " stddev = %0.3f\n", $stddev; - printf " e ^ stddev = %0.3f\n", exp($stddev); + print("\nStatistics:") + print(" min log(p2e) = %0.3f" % min_p2e, end="") + print(" from mtask %d (predict %d," % + (min_mtask, Mtasks[min_mtask]['predict']), + end="") + print(" elapsed %d)" % Mtasks[min_mtask]['elapsed']) + print(" max log(p2e) = %0.3f" % max_p2e, end="") + print(" from mtask %d (predict %d," % + (max_mtask, Mtasks[max_mtask]['predict']), + end="") + print(" elapsed %d)" % Mtasks[max_mtask]['elapsed']) - report_cpus(); + stddev = statistics.pstdev(p2e_ratios) + mean = statistics.mean(p2e_ratios) + print(" mean = %0.3f" % mean) + print(" stddev = %0.3f" % stddev) + print(" e ^ stddev = %0.3f" % math.exp(stddev)) - if ($nthreads > $ncpus) { - print "\n"; - print "%Warning: There were fewer CPUs ($ncpus) then threads ($nthreads).\n"; - print " : See docs on use of numactl.\n"; - } else { - if ($Global{cpu_socket_cores_warning}) { - print "\n"; - print "%Warning: Multiple threads scheduled on same hyperthreaded core.\n"; - print " : See docs on use of numactl.\n"; - } - if ($Global{cpu_sockets_warning}) { - print "\n"; - print "%Warning: Threads scheduled on multiple sockets.\n"; - print " : See docs on use of numactl.\n"; - } - } - print "\n"; -} + report_cpus() -sub report_cpus { - print "\nCPUs:\n"; - # Test - show all cores - # for (my $i=0; $i<73; ++$i) { $Global{cpus}{$i} ||= {cpu_time => 0}; } + if nthreads > ncpus: + print() + print("%%Warning: There were fewer CPUs (%d) then threads (%d)." % + (ncpus, nthreads)) + print(" : See docs on use of numactl.") + else: + if 'cpu_socket_cores_warning' in Global: + print() + print( + "%Warning: Multiple threads scheduled on same hyperthreaded core." + ) + print(" : See docs on use of numactl.") + if 'cpu_sockets_warning' in Global: + print() + print("%Warning: Threads scheduled on multiple sockets.") + print(" : See docs on use of numactl.") + print() - $Global{cpu_sockets} ||= {}; - $Global{cpu_socket_cores} ||= {}; - foreach my $cpu (sort {$a <=> $b} keys %{$Global{cpus}}) { - printf " cpu %d: ", $cpu; - printf "cpu_time=%d", $Global{cpus}{$cpu}{cpu_time}; +def report_cpus(): + print("\nCPUs:") - my $socket = $Global{cpuinfo}{$cpu}{physical_id}; - $Global{cpu_sockets}{$socket}++ if defined $socket; - printf " socket=%d", $socket if defined $socket; + Global['cpu_sockets'] = collections.defaultdict(lambda: 0) + Global['cpu_socket_cores'] = collections.defaultdict(lambda: 0) - my $core = $Global{cpuinfo}{$cpu}{core_id}; - $Global{cpu_socket_cores}{$socket."__".$core}++ if defined $socket && defined $core; - printf " core=%d", $core if defined $core; + for cpu in sorted(Global['cpus'].keys()): + print(" cpu %d: " % cpu, end='') + print("cpu_time=%d" % Global['cpus'][cpu]['cpu_time'], end='') - my $model = $Global{cpuinfo}{$cpu}{model_name}; - printf " %s", $model if defined $model; - print "\n"; - } + socket = None + if cpu in Global['cpuinfo']: + socket = int(Global['cpuinfo'][cpu]['physical_id']) + Global['cpu_sockets'][socket] += 1 + print(" socket=%d" % socket, end='') - $Global{cpu_sockets_warning} = 1 - if (scalar keys %{$Global{cpu_sockets}} > 1); - foreach my $scn (values %{$Global{cpu_socket_cores}}) { - $Global{cpu_socket_cores_warning} = 1 if $scn > 1; - } -} + core = int(Global['cpuinfo'][cpu]['core_id']) + Global['cpu_socket_cores'][str(socket) + "__" + str(core)] += 1 + print(" core=%d" % core, end='') -sub report_graph { - my $time_per = $Opt_Time_Per_Char; - if ($time_per == 0) { - $time_per = ($Global{last_end} / 40); # Start with 40 columns - while ($time_per > 10) { - my ($graph, $conflicts) = _make_graph($time_per); - last if !$conflicts; - $time_per = int($time_per/2); - } + model = Global['cpuinfo'][cpu]['model_name'] + if model: + print(" %s" % model, end='') + print() + + if len(Global['cpu_sockets']) > 1: + Global['cpu_sockets_warning'] = True + for scn in Global['cpu_socket_cores'].values(): + if scn > 1: + Global['cpu_socket_cores_warning'] = True + + +def report_graph(): + time_per = Args.scale + if time_per == 0: + time_per = Global['last_end'] / 40 # Start with 40 columns + while time_per > 10: + (graph, conflicts) = _make_graph(time_per) + if not conflicts: + break + time_per = int(time_per / 2) # One more step so we can fit more labels - $time_per = int($time_per/2); - $time_per ||= 1; - } + time_per = int(time_per / 2) + if time_per <= 0: + time_per = 1 - my ($graph, $conflicts) = _make_graph($time_per); + (graph, conflicts) = _make_graph(time_per) - print "\nThread gantt graph:\n"; - print " Legend: One character width = $time_per rdtsc ticks\n"; - print " Legend: '&' = multiple mtasks in this period (character width)\n"; + print("\nThread gantt graph:") + print(" Legend: One character width = %s rdtsc ticks" % time_per) + print(" Legend: '&' = multiple mtasks in this period (character width)") - my $scale = " <-".$Global{last_end}." rdtsc total"; - for (my $col = length($scale); # -2 for '->' below - $col < ($Global{last_end}/$time_per); ++$col) { - $scale .= "-"; - } - print " $scale->\n"; + scale = " <-%d rdtsc total" % Global['last_end'] + for col in range(len(scale), int(0.99 + (Global['last_end'] / time_per))): # pylint: disable=unused-variable + scale += "-" + print(" " + scale + "->") - foreach my $thread (sort keys %{$graph}) { - print " t: "; - _print_graph_line($graph->{$thread}, ''); - } -} + for thread in sorted(graph.keys()): + print(" t: ", end="") + _print_graph_line(graph[thread], '') -sub _make_graph { - my $time_per = shift; - my $graph = {}; # {thread}{column}{char=>'x' or chars=>#} - my $conflicts = 0; - foreach my $thread (keys %Threads) { +def _make_graph(time_per): + + # [thread][column] = char or # + graph = collections.defaultdict( + lambda: collections.defaultdict(lambda: '')) + + conflicts = 0 + for thread in Threads: # Make potentially multiple characters per column - foreach my $start (sort {$a <=> $b} keys %{$Threads{$thread}}) { - my $end = $Threads{$thread}{$start}{end}; - my $mtask = $Threads{$thread}{$start}{mtask}; - my $cpu = $Threads{$thread}{$start}{cpu}; + multi_at_col = collections.defaultdict(lambda: '') + for start in sorted(Threads[thread].keys()): + end = Threads[thread][start]['end'] + # mtask = Threads[thread][start]['mtask'] + cpu = Threads[thread][start]['cpu'] - my $startcol = _time_col($time_per, $start); - my $endcol = _time_col($time_per, $end); + startcol = _time_col(time_per, start) + endcol = _time_col(time_per, end) + + label = "[" + label += str(cpu) # Maybe make optional in future + width = endcol - startcol + 1 + while len(label) < (width - 1): # -1 for ']' + label += "-" + label += "]" + multi_at_col[startcol] += label - my $label = "["; - $label .= "$cpu"; # Maybe make optional in future - my $width = $endcol - $startcol + 1; - while (length($label) < ($width-1)) { # -1 for ']' - $label .= "-"; - } - $label .= "]"; - $graph->{$thread}[$startcol]{char} .= $label; - } - if ($Debug) { - print "# Multicol: "; _print_graph_line($graph->{$thread}, '|'); - } # Expand line to one char per column - for (my $col = 0; $col <= $#{$graph->{$thread}}; ++$col) { - if (my $chars = $graph->{$thread}[$col]{char}) { - my $ok = 1; - for (my $coladd = 1; $coladd{$thread}[$col + $coladd]{char}) { - $ok = 0; last; - } - } - if (!$ok) { - if ($chars =~ /\[.*\[/) { # Two begins or more - $conflicts++; - $graph->{$thread}[$col]{char} = "&"; - } else { - $graph->{$thread}[$col]{char} = "["; - } - for (my $coladd = 1; $coladd{$thread}[$col + $coladd]{char}) { - last; - } else { - $graph->{$thread}[$col + $coladd]{char} = 'x'; - } - } - } else { - my $coladd = 0; - foreach my $char (split //, $chars) { - $graph->{$thread}[$col+$coladd]{char} = $char; - ++$coladd; - } - } - } + for col in multi_at_col: + chars = multi_at_col[col] + ok = True + for coladd in range(0, len(chars)): + if col + coladd in graph[thread]: + ok = False + break + if not ok: + if re.search(r'\[.*\[', chars): # Two begins or more + conflicts += 1 + graph[thread][col] = "&" + else: + graph[thread][col] = "[" + for coladd in range(1, len(chars)): + if col + coladd in graph[thread]: + break + graph[thread][col + coladd] = 'x' + else: + coladd = 0 + for char in chars: + graph[thread][col + coladd] = char + coladd += 1 + + if Args.debug: + print("# Conflicts %d" % conflicts) + return (graph, conflicts) + + +def _print_graph_line(graph_thread, sep): + at = 0 + for col in sorted(graph_thread.keys()): + while at < col: + print(' ', end="") + at += 1 + c = graph_thread[col] + print(c + sep, end="") + at += len(c) + print() + + +def _time_col(time_per, time): + return int(time / time_per) + + +###################################################################### + + +def write_vcd(filename): + print("Writing %s" % filename) + with open(filename, "w") as fh: + vcd = { + 'values': + collections.defaultdict(lambda: {}), # {