@@ -101,14 +101,16 @@ int yylex(void);
101
101
%type <node> gate_declaration single_input_gate_instance
102
102
%type <node> module_instantiation module_instance function_instance list_of_module_connections list_of_function_connections
103
103
%type <node> list_of_multiple_inputs_gate_connections
104
- %type <node> module_connection always statement function_statement blocking_assignment generate
105
- %type <node> non_blocking_assignment case_item_list case_items seq_block generate_for
106
- %type <node> stmt_list delay_control event_expression_list event_expression
104
+ %type <node> module_connection always statement function_statement blocking_assignment
105
+ %type <node> non_blocking_assignment conditional_statement case_statement case_item_list case_items seq_block
106
+ %type <node> stmt_list delay_control event_expression_list event_expression loop_statement
107
107
%type <node> expression primary probable_expression_list expression_list module_parameter
108
- %type <node> list_of_module_parameters
108
+ %type <node> list_of_module_parameters localparam_declaration
109
109
%type <node> specify_block list_of_specify_items specify_item specparam_declaration
110
110
%type <node> specify_pal_connect_declaration c_function_expression_list c_function
111
111
%type <node> initial_block parallel_connection list_of_blocking_assignment
112
+ %type <node> list_of_generate_items generate_item generate loop_generate_construct if_generate_construct
113
+ %type <node> case_generate_construct case_generate_item_list case_generate_items generate_block
112
114
113
115
%%
114
116
@@ -193,19 +195,31 @@ module_item:
193
195
| input_declaration {$$ = $1 ;}
194
196
| output_declaration {$$ = $1 ;}
195
197
| inout_declaration {$$ = $1 ;}
196
- | net_declaration {$$ = $1 ;}
197
- | genvar_declaration {$$ = $1 ;}
198
- | integer_declaration {$$ = $1 ;}
199
- | continuous_assign {$$ = $1 ;}
200
- | gate_declaration {$$ = $1 ;}
201
- | generate {$$ = $1 ;}
202
- | module_instantiation {$$ = $1 ;}
203
- | function_declaration {$$ = $1 ;}
204
- | initial_block {$$ = $1 ;}
205
- | always {$$ = $1 ;}
206
- | defparam_declaration {$$ = $1 ;}
207
198
| specify_block {$$ = $1 ;}
208
- | c_function ' ;' {$$ = $1 ;}
199
+ | generate_item {$$ = $1 ;}
200
+ | generate {$$ = $1 ;}
201
+ ;
202
+
203
+ list_of_generate_items :
204
+ list_of_generate_items generate_item {$$ = newList_entry($1 , $2 );}
205
+ | generate_item {$$ = newList(BLOCK, $1 );}
206
+
207
+ generate_item :
208
+ localparam_declaration {$$ = $1 ;}
209
+ | net_declaration {$$ = $1 ;}
210
+ | genvar_declaration {$$ = $1 ;}
211
+ | integer_declaration {$$ = $1 ;}
212
+ | continuous_assign {$$ = $1 ;}
213
+ | gate_declaration {$$ = $1 ;}
214
+ | module_instantiation {$$ = $1 ;}
215
+ | function_declaration {$$ = $1 ;}
216
+ | initial_block {$$ = $1 ;}
217
+ | always {$$ = $1 ;}
218
+ | defparam_declaration {$$ = $1 ;}
219
+ | c_function ' ;' {$$ = $1 ;}
220
+ | if_generate_construct {$$ = $1 ;}
221
+ | case_generate_construct {$$ = $1 ;}
222
+ | loop_generate_construct {$$ = $1 ;}
209
223
;
210
224
211
225
function_declaration :
@@ -242,8 +256,11 @@ function_input_declaration:
242
256
243
257
parameter_declaration :
244
258
vPARAMETER vSIGNED variable_list ' ;' {$$ = markAndProcessSymbolListWith(MODULE,PARAMETER, $3 , true );}
245
- | vLOCALPARAM vSIGNED variable_list ' ;' {$$ = markAndProcessSymbolListWith(MODULE,LOCALPARAM, $3 , true );}
246
259
| vPARAMETER variable_list ' ;' {$$ = markAndProcessSymbolListWith(MODULE,PARAMETER, $2 , false );}
260
+ ;
261
+
262
+ localparam_declaration :
263
+ vLOCALPARAM vSIGNED variable_list ' ;' {$$ = markAndProcessSymbolListWith(MODULE,LOCALPARAM, $3 , true );}
247
264
| vLOCALPARAM variable_list ' ;' {$$ = markAndProcessSymbolListWith(MODULE,LOCALPARAM, $2 , false );}
248
265
;
249
266
@@ -424,28 +441,65 @@ always:
424
441
;
425
442
426
443
generate :
427
- vGENERATE generate_for vENDGENERATE {$$ = newGenerate($2 , yylineno);}
444
+ vGENERATE list_of_generate_items vENDGENERATE {$$ = newGenerate($2 , yylineno);}
445
+ ;
446
+
447
+ loop_generate_construct :
448
+ vFOR ' (' blocking_assignment ' ;' expression ' ;' blocking_assignment ' )' generate_block {$$ = newFor($3 , $5 , $7 , $9 , yylineno);}
449
+ ;
450
+
451
+ if_generate_construct :
452
+ vIF ' (' expression ' )' generate_block %prec LOWER_THAN_ELSE {$$ = newIf($3 , $5 , NULL , yylineno);}
453
+ | vIF ' (' expression ' )' generate_block vELSE generate_block {$$ = newIf($3 , $5 , $7 , yylineno);}
454
+ ;
455
+
456
+ case_generate_construct :
457
+ vCASE ' (' expression ' )' case_generate_item_list vENDCASE {$$ = newCase($3 , $5 , yylineno);}
458
+ ;
459
+
460
+ case_generate_item_list :
461
+ case_generate_item_list case_generate_items {$$ = newList_entry($1 , $2 );}
462
+ | case_generate_items {$$ = newList(CASE_LIST, $1 );}
463
+ ;
464
+
465
+ case_generate_items :
466
+ expression ' :' generate_block {$$ = newCaseItem($1 , $3 , yylineno);}
467
+ | vDEFAULT ' :' generate_block {$$ = newDefaultCase($3 , yylineno);}
468
+ ;
469
+
470
+ generate_block :
471
+ generate_item {$$ = $1 ;}
472
+ | vBEGIN list_of_generate_items vEND {$$ = $2 ;}
473
+ | vBEGIN ' :' vSYMBOL_ID list_of_generate_items vEND {$$ = $4 ;}
428
474
;
429
475
430
476
function_statement :
431
477
statement {$$ = newAlways(NULL , $1 , yylineno);}
432
478
;
433
479
434
- generate_for :
435
- vFOR ' (' blocking_assignment ' ;' expression ' ;' blocking_assignment ' )' vBEGIN module_instantiation vEND {$$ = newFor($3 , $5 , $7 , $10 , yylineno);}
436
- ;
437
-
438
480
statement :
439
481
seq_block {$$ = $1 ;}
440
482
| c_function ' ;' {$$ = $1 ;}
441
483
| blocking_assignment ' ;' {$$ = $1 ;}
442
484
| non_blocking_assignment ' ;' {$$ = $1 ;}
443
- | vIF ' (' expression ' )' statement %prec LOWER_THAN_ELSE {$$ = newIf($3 , $5 , NULL , yylineno);}
444
- | vIF ' (' expression ' )' statement vELSE statement {$$ = newIf($3 , $5 , $7 , yylineno);}
445
- | vCASE ' (' expression ' )' case_item_list vENDCASE {$$ = newCase($3 , $5 , yylineno);}
446
- | vFOR ' (' blocking_assignment ' ;' expression ' ;' blocking_assignment ' )' statement {$$ = newFor($3 , $5 , $7 , $9 , yylineno);}
485
+ | conditional_statement {$$ = $1 ;}
486
+ | case_statement {$$ = $1 ;}
487
+ | loop_statement {$$ = $1 ;}
488
+ | ' ;' {$$ = NULL ;}
489
+ ;
490
+
491
+ loop_statement :
492
+ vFOR ' (' blocking_assignment ' ;' expression ' ;' blocking_assignment ' )' statement {$$ = newFor($3 , $5 , $7 , $9 , yylineno);}
447
493
| vWHILE ' (' expression ' )' statement {$$ = newWhile($3 , $5 , yylineno);}
448
- | ' ;' {$$ = NULL ;}
494
+ ;
495
+
496
+ case_statement :
497
+ vCASE ' (' expression ' )' case_item_list vENDCASE {$$ = newCase($3 , $5 , yylineno);}
498
+ ;
499
+
500
+ conditional_statement :
501
+ vIF ' (' expression ' )' statement %prec LOWER_THAN_ELSE {$$ = newIf($3 , $5 , NULL , yylineno);}
502
+ | vIF ' (' expression ' )' statement vELSE statement {$$ = newIf($3 , $5 , $7 , yylineno);}
449
503
;
450
504
451
505
list_of_specify_items :
0 commit comments