diff options
-rw-r--r-- | frontends/ast/simplify.cc | 8 | ||||
-rw-r--r-- | tests/various/const_arg_loop.v | 10 |
2 files changed, 18 insertions, 0 deletions
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index fb6623f02..8cd459913 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -3337,6 +3337,14 @@ skip_dynamic_range_lvalue_expansion:; wire->type = AST_LOCALPARAM; wire->attributes.erase(ID::nosync); wire->children.insert(wire->children.begin(), arg->clone()); + // args without a range implicitly have width 1 + if (wire->children.back()->type != AST_RANGE) { + AstNode* range = new AstNode(); + range->type = AST_RANGE; + wire->children.push_back(range); + range->children.push_back(mkconst_int(0, true)); + range->children.push_back(mkconst_int(0, true)); + } continue; } AstNode *wire_id = new AstNode(AST_IDENTIFIER); diff --git a/tests/various/const_arg_loop.v b/tests/various/const_arg_loop.v index 3bfff4acd..567bccc25 100644 --- a/tests/various/const_arg_loop.v +++ b/tests/various/const_arg_loop.v @@ -39,6 +39,12 @@ module top; end endfunction + function automatic [16:0] operation4; + input [15:0] a; + input b; + operation4 = {a, b}; + endfunction + wire [31:0] a; assign a = 2; @@ -53,6 +59,9 @@ module top; wire [31:0] x3; assign x3 = operation3(A, a); + wire [16:0] x4; + assign x4 = operation4(a[15:0], 0); + // `define VERIFY `ifdef VERIFY assert property (a == 2); @@ -60,5 +69,6 @@ module top; assert property (x1 == 16); assert property (x2 == 4); assert property (x3 == 16); + assert property (x4 == a << 1); `endif endmodule |