Fix wreal not handling continuous assign, bug1150.
This commit is contained in:
parent
e9125a3a22
commit
be6a3d0f10
2
Changes
2
Changes
|
|
@ -31,6 +31,8 @@ The contributors that suggested a given feature are shown in []. Thanks!
|
||||||
|
|
||||||
**** Fix error on parameters with dotted references, bug1146. [Johan Bjork]
|
**** Fix error on parameters with dotted references, bug1146. [Johan Bjork]
|
||||||
|
|
||||||
|
**** Fix wreal not handling continuous assign, bug1150. [J Briquet]
|
||||||
|
|
||||||
|
|
||||||
* Verilator 3.900 2017-01-15
|
* Verilator 3.900 2017-01-15
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -427,6 +427,7 @@ public:
|
||||||
SUPPLY0,
|
SUPPLY0,
|
||||||
SUPPLY1,
|
SUPPLY1,
|
||||||
WIRE,
|
WIRE,
|
||||||
|
WREAL,
|
||||||
IMPLICITWIRE,
|
IMPLICITWIRE,
|
||||||
TRIWIRE,
|
TRIWIRE,
|
||||||
TRI0,
|
TRI0,
|
||||||
|
|
@ -448,13 +449,13 @@ 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",
|
"SUPPLY0","SUPPLY1","WIRE","WREAL","IMPLICITWIRE",
|
||||||
"TRIWIRE","TRI0","TRI1",
|
"TRIWIRE","TRI0","TRI1",
|
||||||
"PORT",
|
"PORT",
|
||||||
"BLOCKTEMP","MODULETEMP","STMTTEMP","XTEMP",
|
"BLOCKTEMP","MODULETEMP","STMTTEMP","XTEMP",
|
||||||
"IFACEREF"};
|
"IFACEREF"};
|
||||||
return names[m_e]; }
|
return names[m_e]; }
|
||||||
bool isSignal() const { return (m_e==WIRE || m_e==IMPLICITWIRE
|
bool isSignal() const { return (m_e==WIRE || m_e==WREAL || m_e==IMPLICITWIRE
|
||||||
|| m_e==TRIWIRE
|
|| m_e==TRIWIRE
|
||||||
|| m_e==TRI0 || m_e==TRI1
|
|| m_e==TRI0 || m_e==TRI1
|
||||||
|| m_e==SUPPLY0 || m_e==SUPPLY1
|
|| m_e==SUPPLY0 || m_e==SUPPLY1
|
||||||
|
|
|
||||||
|
|
@ -195,6 +195,8 @@ string AstVar::verilogKwd() const {
|
||||||
return "tri";
|
return "tri";
|
||||||
} else if (varType()==AstVarType::WIRE) {
|
} else if (varType()==AstVarType::WIRE) {
|
||||||
return "wire";
|
return "wire";
|
||||||
|
} else if (varType()==AstVarType::WREAL) {
|
||||||
|
return "wreal";
|
||||||
} else {
|
} else {
|
||||||
return dtypep()->name();
|
return dtypep()->name();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -934,13 +934,13 @@ portDirNetE: // IEEE: part of port, optional net type and/or direction
|
||||||
// // Per spec, if direction given default the nettype.
|
// // Per spec, if direction given default the nettype.
|
||||||
// // The higher level rule may override this VARDTYPE with one later in the parse.
|
// // The higher level rule may override this VARDTYPE with one later in the parse.
|
||||||
| port_direction { VARDECL(PORT); VARDTYPE(NULL/*default_nettype*/); }
|
| port_direction { VARDECL(PORT); VARDTYPE(NULL/*default_nettype*/); }
|
||||||
| port_direction { VARDECL(PORT); } net_type { VARDTYPE(NULL/*default_nettype*/); } // net_type calls VARNET
|
| port_direction { VARDECL(PORT); } net_type { VARDTYPE(NULL/*default_nettype*/); } // net_type calls VARDECL
|
||||||
| net_type { } // net_type calls VARNET
|
| net_type { } // net_type calls VARDECL
|
||||||
;
|
;
|
||||||
|
|
||||||
port_declNetE: // IEEE: part of port_declaration, optional net type
|
port_declNetE: // IEEE: part of port_declaration, optional net type
|
||||||
/* empty */ { }
|
/* empty */ { }
|
||||||
| net_type { } // net_type calls VARNET
|
| net_type { } // net_type calls VARDECL
|
||||||
;
|
;
|
||||||
|
|
||||||
portSig<nodep>:
|
portSig<nodep>:
|
||||||
|
|
@ -1209,6 +1209,8 @@ net_type: // ==IEEE: net_type
|
||||||
//UNSUP yWAND { VARDECL(WAND); }
|
//UNSUP yWAND { VARDECL(WAND); }
|
||||||
| yWIRE { VARDECL(WIRE); }
|
| yWIRE { VARDECL(WIRE); }
|
||||||
//UNSUP yWOR { VARDECL(WOR); }
|
//UNSUP yWOR { VARDECL(WOR); }
|
||||||
|
// // VAMS - somewhat hackish
|
||||||
|
| yWREAL { VARDECL(WREAL); }
|
||||||
;
|
;
|
||||||
|
|
||||||
varGParamReset:
|
varGParamReset:
|
||||||
|
|
@ -1291,8 +1293,6 @@ non_integer_type<bdtypep>: // ==IEEE: non_integer_type
|
||||||
yREAL { $$ = new AstBasicDType($1,AstBasicDTypeKwd::DOUBLE); }
|
yREAL { $$ = new AstBasicDType($1,AstBasicDTypeKwd::DOUBLE); }
|
||||||
| yREALTIME { $$ = new AstBasicDType($1,AstBasicDTypeKwd::DOUBLE); }
|
| yREALTIME { $$ = new AstBasicDType($1,AstBasicDTypeKwd::DOUBLE); }
|
||||||
//UNSUP ySHORTREAL { $$ = new AstBasicDType($1,AstBasicDTypeKwd::FLOAT); }
|
//UNSUP ySHORTREAL { $$ = new AstBasicDType($1,AstBasicDTypeKwd::FLOAT); }
|
||||||
// // VAMS - somewhat hackish
|
|
||||||
| yWREAL { $$ = new AstBasicDType($1,AstBasicDTypeKwd::DOUBLE); VARDECL(WIRE); }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
signingE<signstate>: // IEEE: signing - plus empty
|
signingE<signstate>: // IEEE: signing - plus empty
|
||||||
|
|
@ -3803,6 +3803,10 @@ AstVar* V3ParseGrammar::createVariable(FileLine* fileline, string name, AstRange
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
AstVarType type = GRAMMARP->m_varIO;
|
AstVarType type = GRAMMARP->m_varIO;
|
||||||
|
if (GRAMMARP->m_varDecl == AstVarType::WREAL) {
|
||||||
|
// dtypep might not be null, might be implicit LOGIC before we knew better
|
||||||
|
dtypep = new AstBasicDType(fileline,AstBasicDTypeKwd::DOUBLE);
|
||||||
|
}
|
||||||
if (!dtypep) { // Created implicitly
|
if (!dtypep) { // Created implicitly
|
||||||
dtypep = new AstBasicDType(fileline, LOGIC_IMPLICIT);
|
dtypep = new AstBasicDType(fileline, LOGIC_IMPLICIT);
|
||||||
} else { // May make new variables with same type, so clone
|
} else { // May make new variables with same type, so clone
|
||||||
|
|
|
||||||
|
|
@ -9,20 +9,75 @@ module t (/*autoarg*/
|
||||||
// Outputs
|
// Outputs
|
||||||
aout,
|
aout,
|
||||||
// Inputs
|
// Inputs
|
||||||
in
|
clk, in
|
||||||
);
|
);
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
|
||||||
input [15:0] in;
|
input [15:0] in;
|
||||||
output aout;
|
output aout;
|
||||||
wreal aout;
|
wreal aout;
|
||||||
|
|
||||||
|
integer cyc=0;
|
||||||
|
|
||||||
|
real vin;
|
||||||
|
real gnd;
|
||||||
|
wire out;
|
||||||
|
within_range within_range (/*AUTOINST*/
|
||||||
|
// Interfaces
|
||||||
|
.vin (vin),
|
||||||
|
.gnd (gnd),
|
||||||
|
// Outputs
|
||||||
|
.out (out));
|
||||||
|
|
||||||
parameter real lsb = 1;
|
parameter real lsb = 1;
|
||||||
// verilator lint_off WIDTH
|
// verilator lint_off WIDTH
|
||||||
assign aout = $itor(in) * lsb;
|
assign aout = $itor(in) * lsb;
|
||||||
|
// verilator lint_on WIDTH
|
||||||
|
|
||||||
initial begin
|
always @ (posedge clk) begin
|
||||||
|
cyc <= cyc + 1;
|
||||||
|
`ifdef TEST_VERBOSE
|
||||||
|
$write("[%0t] cyc==%0d aout=%d (%f-%f=%f)\n",$time, cyc, out, vin, gnd, within_range.in_int);
|
||||||
|
`endif
|
||||||
|
if (cyc==0) begin
|
||||||
|
// Setup
|
||||||
|
gnd = 0.0;
|
||||||
|
vin = 0.2;
|
||||||
|
end
|
||||||
|
else if (cyc==2) begin
|
||||||
|
if (out != 0) $stop;
|
||||||
|
end
|
||||||
|
else if (cyc==3) begin
|
||||||
|
gnd = 0.0;
|
||||||
|
vin = 0.6;
|
||||||
|
end
|
||||||
|
else if (cyc==4) begin
|
||||||
|
if (out != 1) $stop;
|
||||||
|
end
|
||||||
|
else if (cyc==5) begin
|
||||||
|
gnd = 0.6;
|
||||||
|
vin = 0.8;
|
||||||
|
end
|
||||||
|
else if (cyc==6) begin
|
||||||
|
if (out != 0) $stop;
|
||||||
|
end
|
||||||
|
else if (cyc==99) begin
|
||||||
$write("*-* All Finished *-*\n");
|
$write("*-* All Finished *-*\n");
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
module within_range
|
||||||
|
(input wreal vin,
|
||||||
|
input wreal gnd,
|
||||||
|
output out);
|
||||||
|
|
||||||
|
parameter real V_MIN = 0.5;
|
||||||
|
parameter real V_MAX = 10;
|
||||||
|
|
||||||
|
wreal in_int = vin - gnd;
|
||||||
|
wire out = (V_MIN <= in_int && in_int <= V_MAX);
|
||||||
|
endmodule
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue