Merge pull request #617 from larsclausen/generate-invalid

Generate error for invalid declarations within generate block
This commit is contained in:
Stephen Williams 2022-02-18 08:26:08 -08:00 committed by GitHub
commit afaaaed0a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 113 additions and 8 deletions

View File

@ -0,0 +1,16 @@
// Check that declaring a module inside a generate block is an error
module test #(
parameter A = 1
);
generate
if (A) begin
// Error
module inner;
initial $display("FAILED");
endmodule
end
endgenerate
endmodule

View File

@ -0,0 +1,18 @@
// Check that a specify block inside a generate block is an error
module test #(
parameter A = 1
);
generate
if (A) begin
specify // Error
endspecify
end
endgenerate
initial begin
$display("FAILED");
end
endmodule

View File

@ -0,0 +1,17 @@
// Check that declaring a specparam inside a generate block is an error
module test #(
parameter A = 1
);
generate
if (A) begin
specparam x = 10; // Error
end
endgenerate
initial begin
$display("FAILED");
end
endmodule

View File

@ -0,0 +1,17 @@
// Check that declaring a timeunit inside a generate block is an error
module test #(
parameter A = 1
);
generate
if (A) begin
timeunit 10ns/1ns; // Error
end
endgenerate
initial begin
$display("FAILED");
end
endmodule

View File

@ -269,6 +269,8 @@ function10 CO,-g2005-sv ivltests
function11 CE,-g2005-sv ivltests
function12 normal,-g2005-sv ivltests gold=function12.gold
genvar_inc_dec normal,-g2009 ivltests
generate_module CE,-g2005-sv ivltests
generate_timeunit CE,-g2005-sv ivltests
ibit_test normal,-g2005-sv ivltests
ibyte_test normal,-g2005-sv ivltests
iint_test normal,-g2005-sv ivltests

View File

@ -570,6 +570,8 @@ generate_case normal ivltests
generate_case2 normal ivltests
generate_case3 normal ivltests
generate_multi_loop normal ivltests gold=generate_multi_loop.gold
generate_specify CE,-g2005-sv ivltests
generate_specparam CE,-g2005-sv ivltests
genloop normal ivltests
genvar_scopes normal ivltests
hello1 normal ivltests

26
parse.y
View File

@ -4868,10 +4868,22 @@ module
keyword. The syntax for modules programs, and interfaces is
almost identical, so let semantics sort out the differences. */
module_start
: K_module { $$ = K_module; }
| K_macromodule { $$ = K_module; }
| K_program { $$ = K_program; }
| K_interface { $$ = K_interface; }
: K_module
{ pform_error_in_generate(@1, "module declaration");
$$ = K_module;
}
| K_macromodule
{ pform_error_in_generate(@1, "module declaration");
$$ = K_module;
}
| K_program
{ pform_error_in_generate(@1, "program declaration");
$$ = K_program;
}
| K_interface
{ pform_error_in_generate(@1, "interface declaration");
$$ = K_interface;
}
;
module_end
@ -5262,6 +5274,7 @@ module_item
| attribute_list_opt assertion_item
| timeunits_declaration
{ pform_error_in_generate(@1, "timeunit declaration"); }
| class_declaration
@ -5330,8 +5343,9 @@ module_item
| attribute_list_opt K_specparam
{ if (pform_in_interface())
yyerror(@1, "error: specparam declarations are not allowed "
yyerror(@2, "error: specparam declarations are not allowed "
"in interfaces.");
pform_error_in_generate(@2, "specparam declaration");
}
specparam_decl ';'
@ -5341,7 +5355,9 @@ module_item
{ if (pform_in_interface())
yyerror(@1, "error: specify blocks are not allowed "
"in interfaces.");
pform_error_in_generate(@1, "specify block");
}
specify_item_list_opt K_endspecify
| K_specify error K_endspecify

View File

@ -780,6 +780,15 @@ PGenerate* pform_parent_generate(void)
return pform_cur_generate;
}
bool pform_error_in_generate(const vlltype&loc, const char *type)
{
if (!pform_parent_generate())
return false;
VLerror(loc, "error: %s is not allowed in generate block.", type);
return true;
}
void pform_bind_attributes(map<perm_string,PExpr*>&attributes,
list<named_pexpr_t>*attr, bool keep_attrs)
{
@ -1212,7 +1221,8 @@ void pform_set_timeunit(const char*txt, bool initial_decl)
if (get_time_unit_prec(txt, val, true)) return;
PScopeExtra*scope = dynamic_cast<PScopeExtra*>(lexical_scope);
assert(scope);
if (!scope)
return;
if (initial_decl) {
scope->time_unit = val;
@ -1249,7 +1259,8 @@ void pform_set_timeprec(const char*txt, bool initial_decl)
if (get_time_unit_prec(txt, val, false)) return;
PScopeExtra*scope = dynamic_cast<PScopeExtra*>(lexical_scope);
assert(scope);
if (!scope)
return;
if (initial_decl) {
scope->time_precision = val;
@ -3295,7 +3306,11 @@ void pform_set_specparam(const struct vlltype&loc, perm_string name,
{
assert(! pform_cur_module.empty());
Module*scope = pform_cur_module.front();
assert(scope == lexical_scope);
if (scope != lexical_scope) {
delete range;
delete expr;
return;
}
assert(expr);
Module::param_expr_t*parm = new Module::param_expr_t();

View File

@ -323,6 +323,8 @@ extern void pform_endgenerate(bool end_conditional);
*/
extern PGenerate* pform_parent_generate(void);
bool pform_error_in_generate(const vlltype&loc, const char *type);
extern void pform_make_elab_task(const struct vlltype&li,
perm_string name,
const std::list<PExpr*>&params);