From 193dcf38f4dd8f6876150309ffa75f32428f0593 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Fri, 13 Mar 2009 14:17:30 -0400 Subject: [PATCH] Add --pins-bv option to use sc_bv for all ports. --- Changes | 3 +++ bin/verilator | 16 ++++++++++++--- src/V3AstNodes.cpp | 14 ++++++------- src/V3AstNodes.h | 2 +- src/V3EmitC.cpp | 14 ++++++------- src/V3Options.cpp | 8 ++++++-- src/V3Options.h | 4 ++-- test_regress/t/t_var_pins_sc1.pl | 33 +++++++++++++++++++++++++++++++ test_regress/t/t_var_pins_sc2.pl | 33 +++++++++++++++++++++++++++++++ test_regress/t/t_var_pins_sc32.pl | 24 +++++++++++----------- test_regress/t/t_var_pins_sc64.pl | 24 +++++++++++----------- 11 files changed, 129 insertions(+), 46 deletions(-) create mode 100755 test_regress/t/t_var_pins_sc1.pl create mode 100755 test_regress/t/t_var_pins_sc2.pl diff --git a/Changes b/Changes index 28c02c26b..141b26ae9 100644 --- a/Changes +++ b/Changes @@ -5,6 +5,8 @@ indicates the contributor was also the author of the fix; Thanks! * Verilator 3.70**** +*** Add --pins-bv option to use sc_bv for all ports. [Brian Small] + **** Fix the SC_MODULE name() to not include __PVT__. [Bob Fredieu] * Verilator 3.701 2009/02/26 @@ -1405,3 +1407,4 @@ Local variables: mode: outline paragraph-separate: "[ \f\n]*$" end: + \ No newline at end of file diff --git a/bin/verilator b/bin/verilator index 3d60e3007..6fe20bd73 100755 --- a/bin/verilator +++ b/bin/verilator @@ -212,6 +212,7 @@ descriptions in the next sections for more information. -O Selectable optimizations --output-split Split .cpp files into pieces --output-split-cfuncs Split .ccp functions + --pins-bv Specify types for top level ports --prefix Name of top level class --profile-cfuncs Name functions for profiling --private Debugging; see docs @@ -459,9 +460,7 @@ the same as --prefix. =item --no-pins64 -Specifies SystemC outputs of 33-64 bits wide should use sc_bv's instead of -uint64_t's. Uint64's are faster, but sc_bvs were the default until -Verilator 3.671. +Backward compatible alias for "--pins-bv 33". =item --no-skip-identical @@ -507,6 +506,17 @@ worse with decreasing split values. Note that this option is stronger than --output-split in the sense that --output-split will not split inside a function. +=item --pins64 + +Backward compatible alias for "--pins-bv 65". Note that's a 65, not a 64. + +=item --pins-bv I + +Specifies SystemC outputs of greater than or equal to I bits wide +should use sc_bv's instead of uint32/uint64_t's. The default is "--pins-bv +65". Versions before Verilator 3.671 defaulted to "--pins-bv 33". The +more sc_bv is used, the worse for performance. + =item --prefix I Specifies the name of the top level class and makefile. Defaults to V diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index a16d44c48..2b2fb4077 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -51,11 +51,11 @@ bool AstVar::isSigPublic() const { } bool AstVar::isScQuad() const { - return (isSc()&&isQuad()&&v3Global.opt.pins64()); + return (isSc() && isQuad() && !isScBv()); } -bool AstVar::isScWide() const { - return (isWide() || isSc()&&isQuad()&&!v3Global.opt.pins64()); +bool AstVar::isScBv() const { + return (isSc() && width() >= v3Global.opt.pinsBv()); } void AstVar::combineType(AstVarType type) { @@ -108,7 +108,7 @@ string AstVar::cType() const { return "bool"; } else if (widthMin() <= VL_WORDSIZE) { return "uint32_t"; - } else if (isScWide()) { + } else if (isWide()) { return "uint32_t"; // []'s added later } else { return "uint64_t"; @@ -116,12 +116,12 @@ string AstVar::cType() const { } string AstVar::scType() const { - if (widthMin() == 1) { + if (isScBv()) { + return (string("sc_bv<")+cvtToStr(widthMin())+"> "); // Keep the space so don't get >> + } else if (widthMin() == 1) { return "bool"; } else if (widthMin() <= VL_WORDSIZE) { return "uint32_t"; - } else if (isScWide()) { - return (string("sc_bv<")+cvtToStr(widthMin())+"> "); // Keep the space so don't get >> } else { return "uint64_t"; } diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index 8cd7014f5..30b3331c1 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -341,7 +341,7 @@ public: bool isUsedParam() const { return m_usedParam; } bool isSc() const { return m_sc; } bool isScQuad() const; - bool isScWide() const; + bool isScBv() const; bool isScSensitive() const { return m_scSensitive; } bool isSigPublic() const; bool isSigModPublic() const { return m_sigModPublic; } diff --git a/src/V3EmitC.cpp b/src/V3EmitC.cpp index 3d165aa10..f701f9d75 100644 --- a/src/V3EmitC.cpp +++ b/src/V3EmitC.cpp @@ -1412,7 +1412,7 @@ void EmitCStmts::emitVarList(AstNode* firstp, EisWhich which, const string& pref int sigbytes = varp->widthAlignBytes(); if (varp->isUsedClock() && varp->widthMin()==1) sigbytes = 0; else if (varp->arraysp()) sigbytes=7; - else if (varp->isScWide()) sigbytes=6; + else if (varp->isScBv()) sigbytes=6; else if (sigbytes==8) sigbytes=5; else if (sigbytes==4) sigbytes=4; else if (sigbytes==2) sigbytes=2; @@ -1544,7 +1544,7 @@ void EmitCImp::emitInt(AstModule* modp) { if (!varp->initp()) nodep->v3fatalSrc("No init for a param?"); // These should be static const values, however microsloth VC++ doesn't // support them. They also cause problems with GDB under GCC2.95. - if (varp->isScWide()) { // Unsupported for output + if (varp->isWide()) { // Unsupported for output puts("// enum WData "+varp->name()+" //wide"); } else if (!varp->initp()->castConst()) { // Unsupported for output puts("// enum IData "+varp->name()+" //not simple value"); @@ -1816,11 +1816,11 @@ class EmitCTrace : EmitCStmts { puts("\n//======================\n\n"); } - bool emitTraceIsScWide(AstTraceInc* nodep) { + bool emitTraceIsScBv(AstTraceInc* nodep) { AstVarRef* varrefp = nodep->valuep()->castVarRef(); if (!varrefp) return false; AstVar* varp = varrefp->varp(); - return varp->isSc() && varp->isScWide(); + return varp->isSc() && varp->isScBv(); } void emitTraceInitOne(AstTraceDecl* nodep) { if (nodep->isWide()) { @@ -1851,7 +1851,7 @@ class EmitCTrace : EmitCStmts { string full = ((m_funcp->funcType() == AstCFuncType::TRACE_FULL || m_funcp->funcType() == AstCFuncType::TRACE_FULL_SUB) ? "full":"chg"); - if (nodep->isWide() || emitTraceIsScWide(nodep)) { + if (nodep->isWide() || emitTraceIsScBv(nodep)) { puts("vcdp->"+full+"Array"); } else if (nodep->isQuad()) { puts("vcdp->"+full+"Quad "); @@ -1873,7 +1873,7 @@ class EmitCTrace : EmitCStmts { if (nodep->valuep()->castVarRef()) { AstVarRef* varrefp = nodep->valuep()->castVarRef(); AstVar* varp = varrefp->varp(); - if (emitTraceIsScWide(nodep)) puts("(uint32_t*)"); + if (emitTraceIsScBv(nodep)) puts("(uint32_t*)"); puts("("); varrefp->iterate(*this); // Put var name out if (varp->arraysp()) { @@ -1882,7 +1882,7 @@ class EmitCTrace : EmitCStmts { else puts("["+cvtToStr(arrayindex)+"]"); } if (varp->isSc()) puts(".read()"); - if (emitTraceIsScWide(nodep)) puts(".get_datap()"); + if (emitTraceIsScBv(nodep)) puts(".get_datap()"); puts(")"); } else { puts("("); diff --git a/src/V3Options.cpp b/src/V3Options.cpp index 8004ec222..a5c32afce 100644 --- a/src/V3Options.cpp +++ b/src/V3Options.cpp @@ -622,7 +622,8 @@ void V3Options::parseOptsList(FileLine* fl, int argc, char** argv) { else if ( onoff (sw, "-inhibit-sim", flag/*ref*/)){ m_inhibitSim = flag; } else if ( onoff (sw, "-l2name", flag/*ref*/) ) { m_l2Name = flag; } else if ( onoff (sw, "-lint-only", flag/*ref*/) ) { m_lintOnly = flag; } - else if ( onoff (sw, "-pins64", flag/*ref*/) ) { m_pins64 = flag; } + else if ( !strcmp (sw, "-no-pins64") ) { m_pinsBv = 33; } + else if ( !strcmp (sw, "-pins64") ) { m_pinsBv = 65; } else if ( !strcmp (sw, "-private") ) { m_public = false; } else if ( onoff (sw, "-profile-cfuncs", flag/*ref*/) ) { m_profileCFuncs = flag; } else if ( onoff (sw, "-psl", flag/*ref*/) ) { m_psl = flag; } @@ -740,6 +741,9 @@ void V3Options::parseOptsList(FileLine* fl, int argc, char** argv) { else if ( !strcmp (sw, "-mod-prefix") && (i+1) ['-sp -pins-bv 1'], + verilator_make_gcc => 0, + ) if $Self->{v3}; + +if ($Self->{v3}) { + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i1;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i8;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i16;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i32;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i64;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i65;/x); + + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o1;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o8;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o16;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o32;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o64;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o65;/x); +} + +ok(1); +1; diff --git a/test_regress/t/t_var_pins_sc2.pl b/test_regress/t/t_var_pins_sc2.pl new file mode 100755 index 000000000..f5dcf88b9 --- /dev/null +++ b/test_regress/t/t_var_pins_sc2.pl @@ -0,0 +1,33 @@ +#!/usr/bin/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 +# General Public License or the Perl Artistic License. + +top_filename("t/t_var_pinsizes.v"); + +compile ( + v_flags2 => ['-sp -pins-bv 2'], + verilator_make_gcc => 0, + ) if $Self->{v3}; + +if ($Self->{v3}) { + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i1;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i8;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i16;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i32;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i64;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i65;/x); + + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o1;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o8;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o16;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o32;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o64;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o65;/x); +} + +ok(1); +1; diff --git a/test_regress/t/t_var_pins_sc32.pl b/test_regress/t/t_var_pins_sc32.pl index e76bf2761..eedfdd46c 100755 --- a/test_regress/t/t_var_pins_sc32.pl +++ b/test_regress/t/t_var_pins_sc32.pl @@ -14,19 +14,19 @@ compile ( ) if $Self->{v3}; if ($Self->{v3}) { - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_in \s+ i1;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_in \s+ i8;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_in \s+ i16;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_in \s+ i32;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_in\s> \s+ i64;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_in\s> \s+ i65;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i1;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i8;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i16;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i32;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i64;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i65;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_out \s+ o1;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_out \s+ o8;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_out \s+ o16;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_out \s+ o32;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_out\s> \s+ o64;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc32.sp", qr/sc_out\s> \s+ o65;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o1;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o8;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o16;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o32;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o64;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o65;/x); } ok(1); diff --git a/test_regress/t/t_var_pins_sc64.pl b/test_regress/t/t_var_pins_sc64.pl index 4e58b89d7..40945af0d 100755 --- a/test_regress/t/t_var_pins_sc64.pl +++ b/test_regress/t/t_var_pins_sc64.pl @@ -14,19 +14,19 @@ compile ( ) if $Self->{v3}; if ($Self->{v3}) { - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_in \s+ i1;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_in \s+ i8;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_in \s+ i16;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_in \s+ i32;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_in \s+ i64;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_in\s> \s+ i65;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i1;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i8;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i16;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i32;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in \s+ i64;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_in\s> \s+ i65;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_out \s+ o1;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_out \s+ o8;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_out \s+ o16;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_out \s+ o32;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_out \s+ o64;/x); - file_grep ("$Self->{obj_dir}/Vt_var_pins_sc64.sp", qr/sc_out\s> \s+ o65;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o1;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o8;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o16;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o32;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out \s+ o64;/x); + file_grep ("$Self->{obj_dir}/$Self->{VM_PREFIX}.sp", qr/sc_out\s> \s+ o65;/x); } ok(1);