diff --git a/elab_pexpr.cc b/elab_pexpr.cc index 553e776c2..1231119a7 100644 --- a/elab_pexpr.cc +++ b/elab_pexpr.cc @@ -508,7 +508,7 @@ void NetEParam::resolve_pexpr_type(void) if (reference_->second.signed_flag) { cast_signed_base_(true); - } else { + } else if (reference_->second.expr) { cast_signed_base_( reference_->second.expr->has_sign() ); } } diff --git a/eval_tree.cc b/eval_tree.cc index 38c37dca3..6f744f452 100644 --- a/eval_tree.cc +++ b/eval_tree.cc @@ -1231,7 +1231,15 @@ NetExpr* NetEParam::eval_tree(int prune_to_width) assert(scope_); perm_string name = (*reference_).first; const NetExpr*expr = (*reference_).second.expr; - ivl_assert(*this, expr); + // Since constant user functions are not supported we can get + // parameters/localparams that are not defined. For now generate + // an appropriate error message. + if (expr == NULL) { + cerr << get_fileline() << ": internal error: parameter/localparam " + << *this << " cannot be evaluated." << endl; + return 0; + } +// ivl_assert(*this, expr); NetExpr*nexpr = expr->dup_expr(); assert(nexpr);