diff options
author | Zachary Snow <zach@zachjs.com> | 2021-03-02 10:43:53 -0500 |
---|---|---|
committer | Zachary Snow <zach@zachjs.com> | 2021-03-02 10:43:53 -0500 |
commit | d738b2c1272b02d8799e9feda83b1eae8ba10c07 (patch) | |
tree | 5edd76126d7c9969f3dfd695e7fad415d364fec9 /frontends/verilog | |
parent | 375af199ef4df45ccf02c66e0171b4282c6cf1eb (diff) | |
download | yosys-d738b2c1272b02d8799e9feda83b1eae8ba10c07.tar.gz yosys-d738b2c1272b02d8799e9feda83b1eae8ba10c07.tar.bz2 yosys-d738b2c1272b02d8799e9feda83b1eae8ba10c07.zip |
sv: support for parameters without default values
- Modules with a parameter without a default value will be automatically
deferred until the hierarchy pass
- Allows for parameters without defaults as module items, rather than
just int the `parameter_port_list`, despite being forbidden in the LRM
- Check for parameters without defaults that haven't been overriden
- Add location info to parameter/localparam declarations
Diffstat (limited to 'frontends/verilog')
-rw-r--r-- | frontends/verilog/verilog_parser.y | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/frontends/verilog/verilog_parser.y b/frontends/verilog/verilog_parser.y index bcba9b76a..ea8cc0765 100644 --- a/frontends/verilog/verilog_parser.y +++ b/frontends/verilog/verilog_parser.y @@ -1462,7 +1462,26 @@ param_decl_list: single_param_decl | param_decl_list ',' single_param_decl; single_param_decl: - TOK_ID '=' expr { + single_param_decl_ident '=' expr { + AstNode *decl = ast_stack.back()->children.back(); + log_assert(decl->type == AST_PARAMETER || decl->type == AST_LOCALPARAM); + delete decl->children[0]; + decl->children[0] = $3; + } | + single_param_decl_ident { + AstNode *decl = ast_stack.back()->children.back(); + if (decl->type != AST_PARAMETER) { + log_assert(decl->type == AST_LOCALPARAM); + frontend_verilog_yyerror("localparam initialization is missing!"); + } + if (!sv_mode) + frontend_verilog_yyerror("Parameter defaults can only be omitted in SystemVerilog mode!"); + delete decl->children[0]; + decl->children.erase(decl->children.begin()); + }; + +single_param_decl_ident: + TOK_ID { AstNode *node; if (astbuf1 == nullptr) { if (!sv_mode) @@ -1473,10 +1492,9 @@ single_param_decl: node = astbuf1->clone(); } node->str = *$1; - delete node->children[0]; - node->children[0] = $3; ast_stack.back()->children.push_back(node); delete $1; + SET_AST_NODE_LOC(node, @1, @1); }; defparam_decl: |