Merge from Tristate branch, part 1 of 2. No functional change intended

This commit is contained in:
Wilson Snyder 2012-04-21 19:30:08 -04:00
parent c361932fe2
commit 0048b04540
9 changed files with 51 additions and 24 deletions

View File

@ -3463,9 +3463,9 @@ Many people have provided ideas and other assistance with Verilator.
The major corporate sponsors of Verilator, by providing significant The major corporate sponsors of Verilator, by providing significant
contributions of time or funds include include Cavium Networks, Compaq contributions of time or funds include include Cavium Networks, Compaq
Corporation, Digital Equipment Corporation, Embecosm Ltd., Intel Corporation, Digital Equipment Corporation, Embecosm Ltd., Hicamp Systems,
Corporation, Mindspeed Technologies Inc., MicroTune Inc., picoChip Designs Intel Corporation, Mindspeed Technologies Inc., MicroTune Inc., picoChip
Ltd., Sun Microsystems, Nauticus Networks, and SiCortex Inc. Designs Ltd., Sun Microsystems, Nauticus Networks, and SiCortex Inc.
The people who have contributed major functionality are Byron Bradley, The people who have contributed major functionality are Byron Bradley,
Jeremy Bennett, Lane Brooks, Duane Galbi, Paul Wasson, and Wilson Snyder. Jeremy Bennett, Lane Brooks, Duane Galbi, Paul Wasson, and Wilson Snyder.

View File

@ -365,6 +365,8 @@ public:
WIRE, WIRE,
IMPLICITWIRE, IMPLICITWIRE,
TRIWIRE, TRIWIRE,
TRI0,
TRI1,
PORT, // Temp type used in parser only PORT, // Temp type used in parser only
BLOCKTEMP, BLOCKTEMP,
MODULETEMP, MODULETEMP,
@ -380,7 +382,9 @@ public:
static const char* names[] = { static const char* names[] = {
"?","GPARAM","LPARAM","GENVAR", "?","GPARAM","LPARAM","GENVAR",
"VAR","INPUT","OUTPUT","INOUT", "VAR","INPUT","OUTPUT","INOUT",
"SUPPLY0","SUPPLY1","WIRE","IMPLICITWIRE","TRIWIRE","PORT", "SUPPLY0","SUPPLY1","WIRE","IMPLICITWIRE",
"TRIWIRE","TRI0","TRI1",
"PORT",
"BLOCKTEMP","MODULETEMP","STMTTEMP","XTEMP"}; "BLOCKTEMP","MODULETEMP","STMTTEMP","XTEMP"};
return names[m_e]; } return names[m_e]; }
}; };

View File

@ -83,7 +83,8 @@ void AstVar::combineType(AstVarType type) {
m_input = true; m_input = true;
if (type==AstVarType::OUTPUT || type==AstVarType::INOUT) if (type==AstVarType::OUTPUT || type==AstVarType::INOUT)
m_output = true; m_output = true;
if (type==AstVarType::INOUT || type==AstVarType::TRIWIRE) if (type==AstVarType::INOUT || type==AstVarType::TRIWIRE
|| type==AstVarType::TRI0 || type==AstVarType::TRI1)
m_tristate = true; m_tristate = true;
} }

View File

@ -2715,6 +2715,8 @@ struct AstNot : public AstNodeUniop {
struct AstExtend : public AstNodeUniop { struct AstExtend : public AstNodeUniop {
// Expand a value into a wider entity by 0 extension. Width is implied from nodep->width() // Expand a value into a wider entity by 0 extension. Width is implied from nodep->width()
AstExtend(FileLine* fl, AstNode* lhsp) : AstNodeUniop(fl, lhsp) {} AstExtend(FileLine* fl, AstNode* lhsp) : AstNodeUniop(fl, lhsp) {}
AstExtend(FileLine* fl, AstNode* lhsp, int width) : AstNodeUniop(fl, lhsp) {
dtypeSetLogicSized(width,width,AstNumeric::UNSIGNED); }
ASTNODE_NODE_FUNCS(Extend, EXTEND) ASTNODE_NODE_FUNCS(Extend, EXTEND)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opAssign(lhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opAssign(lhs); }
virtual string emitVerilog() { return "%l"; } virtual string emitVerilog() { return "%l"; }
@ -2726,6 +2728,8 @@ struct AstExtend : public AstNodeUniop {
struct AstExtendS : public AstNodeUniop { struct AstExtendS : public AstNodeUniop {
// Expand a value into a wider entity by sign extension. Width is implied from nodep->width() // Expand a value into a wider entity by sign extension. Width is implied from nodep->width()
AstExtendS(FileLine* fl, AstNode* lhsp) : AstNodeUniop(fl, lhsp) {} AstExtendS(FileLine* fl, AstNode* lhsp) : AstNodeUniop(fl, lhsp) {}
AstExtendS(FileLine* fl, AstNode* lhsp, int width) : AstNodeUniop(fl, lhsp) {
dtypeSetLogicSized(width,width,AstNumeric::UNSIGNED); }
ASTNODE_NODE_FUNCS(ExtendS, EXTENDS) ASTNODE_NODE_FUNCS(ExtendS, EXTENDS)
virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opExtendS(lhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs) { out.opExtendS(lhs); }
virtual string emitVerilog() { return "%l"; } virtual string emitVerilog() { return "%l"; }
@ -3670,6 +3674,7 @@ struct AstReplicate : public AstNodeBiop {
}; };
struct AstBufIf1 : public AstNodeBiop { struct AstBufIf1 : public AstNodeBiop {
// lhs is enable, rhs is data to drive // lhs is enable, rhs is data to drive
// Note unlike the Verilog bufif1() UDP, this allows any width; each lhsp bit enables respective rhsp bit
AstBufIf1(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstBufIf1(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
if (lhsp) widthSignedFrom(lhsp); } if (lhsp) widthSignedFrom(lhsp); }
ASTNODE_NODE_FUNCS(BufIf1, BUFIF1) ASTNODE_NODE_FUNCS(BufIf1, BUFIF1)

View File

@ -241,14 +241,16 @@ public:
//###################################################################### //######################################################################
// Inst class functions // Inst class functions
void V3Inst::pinReconnectSimple(AstPin* pinp, AstCell* cellp, AstNodeModule* modp) { AstAssignW* V3Inst::pinReconnectSimple(AstPin* pinp, AstCell* cellp, AstNodeModule* modp) {
// If a pin connection is "simple" leave it as-is // If a pin connection is "simple" leave it as-is
// Else create a intermediate wire to perform the interconnect // Else create a intermediate wire to perform the interconnect
// Return the new assignment, if one was made
// Note this module calles cloneTree() via new AstVar // Note this module calles cloneTree() via new AstVar
AstVar* pinVarp = pinp->modVarp(); AstVar* pinVarp = pinp->modVarp();
AstVarRef* connectRefp = pinp->exprp()->castVarRef(); AstVarRef* connectRefp = pinp->exprp()->castVarRef();
AstBasicDType* pinBasicp = pinVarp->dtypep()->basicp(); // Maybe NULL AstBasicDType* pinBasicp = pinVarp->dtypep()->basicp(); // Maybe NULL
AstBasicDType* connBasicp = NULL; AstBasicDType* connBasicp = NULL;
AstAssignW* assignp = NULL;
if (connectRefp) connBasicp = connectRefp->varp()->dtypep()->basicp(); if (connectRefp) connBasicp = connectRefp->varp()->dtypep()->basicp();
// //
if (connectRefp if (connectRefp
@ -268,7 +270,6 @@ void V3Inst::pinReconnectSimple(AstPin* pinp, AstCell* cellp, AstNodeModule* mod
} else { } else {
// Make a new temp wire // Make a new temp wire
//if (1||debug()>=9) { pinp->dumpTree(cout,"in_pin:"); } //if (1||debug()>=9) { pinp->dumpTree(cout,"in_pin:"); }
AstAssignW* assignp = NULL;
AstNode* pinexprp = pinp->exprp()->unlinkFrBack(); AstNode* pinexprp = pinp->exprp()->unlinkFrBack();
string newvarname = "__Vcellinp__"+cellp->name()+"__"+pinp->name(); string newvarname = "__Vcellinp__"+cellp->name()+"__"+pinp->name();
AstVar* newvarp = new AstVar (pinVarp->fileline(), AstVarType::MODULETEMP, newvarname, pinVarp); AstVar* newvarp = new AstVar (pinVarp->fileline(), AstVarType::MODULETEMP, newvarname, pinVarp);
@ -303,6 +304,7 @@ void V3Inst::pinReconnectSimple(AstPin* pinp, AstCell* cellp, AstNodeModule* mod
//if (1||debug()) { pinp->dumpTree(cout," out:"); } //if (1||debug()) { pinp->dumpTree(cout," out:"); }
//if (1||debug()) { assignp->dumpTree(cout," aout:"); } //if (1||debug()) { assignp->dumpTree(cout," aout:"); }
} }
return assignp;
} }
//###################################################################### //######################################################################

View File

@ -33,7 +33,7 @@ class V3Inst {
public: public:
static void instAll(AstNetlist* nodep); static void instAll(AstNetlist* nodep);
static void dearrayAll(AstNetlist* nodep); static void dearrayAll(AstNetlist* nodep);
static void pinReconnectSimple(AstPin* nodep, AstCell* cellp, AstNodeModule* modp); static AstAssignW* pinReconnectSimple(AstPin* nodep, AstCell* cellp, AstNodeModule* modp);
}; };
#endif // Guard #endif // Guard

View File

@ -26,17 +26,23 @@ double sc_time_stamp() {
bool check() { bool check() {
bool pass; bool pass;
int c = (tb->A >> tb->SEL) & 0x1; int c = (tb->A >> tb->SEL) & 0x1;
#ifdef TEST_VERBOSE
bool verbose = true;
#else
bool verbose = false;
#endif
if(tb->Z == c && tb->Y == c && tb->X == c && tb->W == c) { if(tb->W == c && tb->X == c && tb->Y == c && tb->Z == c) {
pass = true; pass = true;
printf("PASS: "); if (verbose) printf("- pass: ");
} else { } else {
pass = false; pass = false;
printf("FAIL: "); verbose = true;
printf("%%E-FAIL: ");
}
if (verbose) {
printf("SEL=%d A=%d W=%d X=%d Y=%d Z=%d c=%d\n", tb->SEL, tb->A, tb->W, tb->X, tb->Y, tb->Z, c);
} }
#ifdef TEST_VERBOSE
printf("SEL=%d A=%d W=%d X=%d Y=%d Z=%d\n", tb->SEL, tb->A, tb->W, tb->X, tb->Y, tb->Z);
#endif
return pass; return pass;
} }

View File

@ -24,16 +24,21 @@ bool check() {
X = 1; X = 1;
} }
#ifdef TEST_VERBOSE
bool verbose = true;
#else
bool verbose = false;
#endif
if (tb->Z == Z && tb->Y == Y && tb->X == X) { if (tb->Z == Z && tb->Y == Y && tb->X == X) {
printf("PASS: "); if (verbose) printf("PASS: ");
pass = true; pass = true;
} else { } else {
printf("FAIL: "); printf("%%E-FAIL: ");
verbose = true;
pass = false; pass = false;
} }
#ifdef TEST_VERBOSE if (verbose) printf("OE=%d A=%d X=%d xexp=%d Y=%d yexp=%d Z=%d zexp=%d\n", tb->OE, tb->A, tb->X,X, tb->Y,Y, tb->Z,Z);
printf("OE=%d A=%d X=%d Y=%d Z=%d\n", tb->OE, tb->A, tb->X, tb->Y, tb->Z);
#endif
return pass; return pass;
} }

View File

@ -10,6 +10,11 @@ double sc_time_stamp() {
bool check() { bool check() {
bool pass = true; bool pass = true;
#ifdef TEST_VERBOSE
bool verbose = true;
#else
bool verbose = false;
#endif
int Y = (tb->OE1 & !tb->OE2) ? tb->A1 int Y = (tb->OE1 & !tb->OE2) ? tb->A1
: (!tb->OE1 & tb->OE2) ? tb->A2 : (!tb->OE1 & tb->OE2) ? tb->A2
@ -21,15 +26,14 @@ bool check() {
if(tb->Y1 == tb->Y2 && tb->Y1 == Y && tb->W == W) { if(tb->Y1 == tb->Y2 && tb->Y1 == Y && tb->W == W) {
pass = true; pass = true;
printf("Pass: "); if (verbose) printf("- pass: ");
} else { } else {
pass = false; pass = false;
printf("Fail: "); verbose = true;
printf("%%E-Fail: ");
} }
#ifdef TEST_VERBOSE if (verbose) printf("Read: OE1=%d OE2=%d A1=0x%x A2=0x%x Y1=0x%x Y2=0x%x W=0x%x Expected: Y1=Y2=%d and W=0x%x\n", tb->OE1, tb->OE2, tb->A1, tb->A2, tb->Y1, tb->Y2, tb->W, Y,W);
printf("Read: OE1=%d OE2=%d A1=0x%x A2=0x%x Y1=0x%x Y2=0x%x W=0x%x Expected: Y1=Y2=%d and W=0x%x\n", tb->OE1, tb->OE2, tb->A1, tb->A2, tb->Y1, tb->Y2, tb->W, Y,W);
#endif
return pass; return pass;
} }