diff --git a/Changes b/Changes index b7afe9dca..5f6bcd63a 100644 --- a/Changes +++ b/Changes @@ -7,6 +7,8 @@ indicates the contributor was also the author of the fix; Thanks! **** Add error message when modules have duplicate names. [Stefan Thiede] +**** Fix "output reg name=expr;" syntax error. [Martin Scharrer] + **** Fix multiple .v files being read in random order. [Stefan Thiede] * Verilator 3.661 2008/04/04 diff --git a/src/verilog.y b/src/verilog.y index 1abb9a053..334000e82 100644 --- a/src/verilog.y +++ b/src/verilog.y @@ -376,7 +376,7 @@ class AstSenTree; // Trailing E indicates this type may have empty match %type modHdr %type modPortsE portList port -%type portV2kArgs portV2kList portV2kSecond portV2kSig +%type portV2kArgs portV2kList portV2kSecond portV2kInit portV2kSig %type portV2kDecl portDecl varDecl %type modParArgs modParSecond modParDecl modParList modParE %type modItem modItemList modItemListE modOrGenItem @@ -384,7 +384,7 @@ class AstSenTree; %type genItem genItemList genItemBegin genItemBlock genTopBlock genCaseListE genCaseList %type dlyTerm minTypMax %type delay -%type sigAndAttr sigId sigIdRange sigList regsig regsigList regSigId +%type sigAndAttr sigId sigIdRange regsig regsigList regSigId %type netSig netSigList %type rangeListE regrangeE anyrange rangeList delayrange portRangeE %type param paramList @@ -513,7 +513,12 @@ portV2kList: portV2kSecond { $$ = $1; } // Called only after a comma in a v2k list, to allow parsing "input a,b" portV2kSecond: portV2kDecl { $$ = $1; } - | portV2kSig { $$ = $1; } + | portV2kInit { $$ = $1; } + ; + +portV2kInit: portV2kSig { $$=$1; } + | portV2kSig '=' expr + { $$=$1; $$->addNext(new AstInitial($2,new AstAssign($2, new AstVarRef($2,V3Parse::s_varAttrp->name(),true), $3))); } ; portV2kSig: sigAndAttr { $$=$1; $$->addNext(new AstPort(CRELINE(),V3Parse::s_pinNum++, V3Parse::s_varAttrp->name())); } @@ -530,15 +535,11 @@ regsigList: regsig { $$ = $1; } | regsigList ',' regsig { $$ = $1;$1->addNext($3); } ; -portV2kDecl: varRESET varInput v2kVarDeclE signingE regrangeE portV2kSig { $$ = $6; } - | varRESET varInout v2kVarDeclE signingE regrangeE portV2kSig { $$ = $6; } - | varRESET varOutput v2kVarDeclE signingE regrangeE portV2kSig { $$ = $6; } +portV2kDecl: varRESET portDirection v2kVarDeclE signingE regrangeE portV2kInit { $$ = $6; } ; // IEEE: port_declaration - plus ';' -portDecl: varRESET varInput v2kVarDeclE signingE regrangeE sigList ';' { $$ = $6; } - | varRESET varInout v2kVarDeclE signingE regrangeE sigList ';' { $$ = $6; } - | varRESET varOutput v2kVarDeclE signingE regrangeE sigList ';' { $$ = $6; } +portDecl: varRESET portDirection v2kVarDeclE signingE regrangeE regsigList ';' { $$ = $6; } ; varDecl: varRESET varReg signingE regrangeE regsigList ';' { $$ = $5; } @@ -568,11 +569,12 @@ varGenVar: yGENVAR { VARDECL(GENVAR); } varReg: yREG { VARDECL(REG); } | yINTEGER { VARDECL(INTEGER); } ; -varInput: yINPUT { VARIO(INPUT); } - ; -varOutput: yOUTPUT { VARIO(OUTPUT); } - ; -varInout: yINOUT { VARIO(INOUT); } + +//IEEE: port_direction +portDirection: yINPUT { VARIO(INPUT); } + | yOUTPUT { VARIO(OUTPUT); } + | yINOUT { VARIO(INOUT); } +// | yREF { VARIO(REF); } ; // IEEE: signing - plus empty @@ -731,10 +733,6 @@ regSigId: yaID rangeListE { $$ = V3Parse::createVariable(CRELINE(), *$1, $2); sigId: yaID { $$ = V3Parse::createVariable(CRELINE(), *$1, NULL); } ; -sigList: sigAndAttr { $$ = $1; } - | sigList ',' sigAndAttr { $$ = $1; $1->addNext($3); } - ; - regsig: regSigId sigAttrListE {} ; diff --git a/test_regress/t/.gitattributes b/test_regress/t/.gitattributes new file mode 100644 index 000000000..35328347a --- /dev/null +++ b/test_regress/t/.gitattributes @@ -0,0 +1 @@ +t_dos*.pl -crlf diff --git a/test_regress/t/t_inst_v2k.v b/test_regress/t/t_inst_v2k.v index b98827272..debf2a0ac 100644 --- a/test_regress/t/t_inst_v2k.v +++ b/test_regress/t/t_inst_v2k.v @@ -23,8 +23,10 @@ module t (/*AUTOARG*/ `endif wire [7:0] osizedreg; // From sub of t_inst_v2k_sub.v + wire [1:0] tied; + wire [3:0] tied_also; - hello hsub; + hello hsub (.tied_also); t_inst_v2k_sub sub ( @@ -33,6 +35,7 @@ module t (/*AUTOARG*/ // verilator lint_off IMPLICIT .oonewire (oonewire), // verilator lint_on IMPLICIT + .tied (tied[1:0]), // Inputs .isizedwire (isizedwire[7:0]), .ionewire (ionewire)); @@ -49,6 +52,8 @@ module t (/*AUTOARG*/ if (high != 2'b11) $stop; if (oonewire !== 1'b1) $stop; if (isizedwire !== 8'd8) $stop; + if (tied != 2'b10) $stop; + if (tied_also != 4'b1010) $stop; $write("*-* All Finished *-*\n"); $finish; end @@ -57,8 +62,10 @@ module t (/*AUTOARG*/ endmodule -module hello; +module hello(tied_also); initial $write ("Hello\n"); + output reg [3:0] tied_also = 4'b1010; + endmodule // Local Variables: diff --git a/test_regress/t/t_inst_v2k_sub.vi b/test_regress/t/t_inst_v2k_sub.vi index 011cdc22a..3194501ab 100644 --- a/test_regress/t/t_inst_v2k_sub.vi +++ b/test_regress/t/t_inst_v2k_sub.vi @@ -1,4 +1,4 @@ -// $Id:$ -*- Verilog -*- +// $Id$ -*- Verilog -*- // DESCRIPTION: Verilator: Verilog Test module // // This file ONLY is placed into the Public Domain, for any use, @@ -10,7 +10,8 @@ module t_inst_v2k_sub output reg [7:0] osizedreg, output wire oonewire /*verilator public*/, input [7:0] isizedwire, - input wire ionewire + input wire ionewire, + output reg [1:0] tied = 2'b10 ); assign oonewire = ionewire;