From e03ff763fbd50d4650654991ffc4e243d8a4ab75 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sat, 2 Oct 2010 10:13:11 -0700 Subject: [PATCH 01/16] Parse support for SystemVerilog atom2 types. --- parse.y | 65 +++++++++++++++++++++++++++++++++-------- pform.cc | 32 ++++++++++++++++++++ pform.h | 2 ++ scripts/devel-stub.conf | 2 +- 4 files changed, 88 insertions(+), 13 deletions(-) diff --git a/parse.y b/parse.y index fe87b00e7..1d0e3c4a9 100644 --- a/parse.y +++ b/parse.y @@ -319,7 +319,8 @@ static PECallFunction*make_call_function(perm_string tn, PExpr*arg1, PExpr*arg2) %type from_exclude %type number -%type signed_opt udp_reg_opt edge_operator automatic_opt +%type signed_opt signed_unsigned_opt +%type udp_reg_opt edge_operator automatic_opt %type drive_strength drive_strength_opt dr_strength0 dr_strength1 %type udp_input_sym udp_output_sym %type udp_input_list udp_sequ_entry udp_comb_entry @@ -516,18 +517,39 @@ block_item_decl if ($1) delete $1; } - /* Integer declarations are simpler in that they do not have all the - trappings of a general variable declaration. All of that is - implicit in the "integer" of the declaration. */ + /* Integer atom declarations are simpler in that they do not have + all the trappings of a general variable declaration. All of that + is implicit in the "integer" of the declaration. */ - | attribute_list_opt K_integer register_variable_list ';' - { pform_set_reg_integer($3); - if ($1) delete $1; - } + | attribute_list_opt K_integer register_variable_list ';' + { pform_set_reg_integer($3); + if ($1) delete $1; + } - | attribute_list_opt K_time register_variable_list ';' - { pform_set_reg_time($3); - } + | attribute_list_opt K_time register_variable_list ';' + { pform_set_reg_time($3); + if ($1) delete $1; + } + + | attribute_list_opt K_byte signed_unsigned_opt register_variable_list ';' + { pform_set_integer_2atom(8, $3, $4); + if ($1) delete $1; + } + + | attribute_list_opt K_shortint signed_unsigned_opt register_variable_list ';' + { pform_set_integer_2atom(16, $3, $4); + if ($1) delete $1; + } + + | attribute_list_opt K_int signed_unsigned_opt register_variable_list ';' + { pform_set_integer_2atom(32, $3, $4); + if ($1) delete $1; + } + + | attribute_list_opt K_longint signed_unsigned_opt register_variable_list ';' + { pform_set_integer_2atom(64, $3, $4); + if ($1) delete $1; + } /* real declarations are fairly simple as there is no range of signed flag in the declaration. Create the real as a NetNet::REG @@ -1981,7 +2003,26 @@ net_type_opt | { $$ = NetNet::IMPLICIT; } ; -signed_opt : K_signed { $$ = true; } | {$$ = false; } ; + /* + * The signed_opt rule will return "true" if K_signed is present, + * for "false" otherwise. This rule corresponds to the declaration + * defaults for reg/bit/logic. + * + * The signed_unsigned_opt rule with match K_signed or K_unsigned + * and return true or false as appropriate. The default is + * "true". This corresponds to the declaration defaults for + * byte/shortint/int/longint. + */ +signed_opt + : K_signed { $$ = true; } + | {$$ = false; } + ; + +signed_unsigned_opt + : K_signed { $$ = true; } + | K_unsigned { $$ = false; } + | { $$ = true; } + ; /* An lpvalue is the expression that can go on the left side of a procedural assignment. This rule handles only procedural diff --git a/pform.cc b/pform.cc index 7b5566018..150887cf2 100644 --- a/pform.cc +++ b/pform.cc @@ -2430,6 +2430,38 @@ void pform_set_reg_time(list*names) delete names; } +static void pform_set_integer_2atom(uint64_t width, bool signed_flag, perm_string name) +{ + PWire*cur = pform_get_wire_in_scope(name); + if (cur == 0) { + cur = new PWire(name, NetNet::REG, NetNet::NOT_A_PORT, IVL_VT_BOOL); + pform_put_wire_in_scope(name, cur); + } else { + bool rc = cur->set_wire_type(NetNet::REG); + assert(rc); + rc = cur->set_data_type(IVL_VT_BOOL); + assert(rc); + } + + assert(cur); + + cur->set_signed(signed_flag); + cur->set_range(new PENumber(new verinum(width-1, integer_width)), + new PENumber(new verinum((uint64_t)0, integer_width)), + SR_NET, false); +} + +void pform_set_integer_2atom(uint64_t width, bool signed_flag, list*names) +{ + for (list::iterator cur = names->begin() + ; cur != names->end() + ; cur ++ ) { + perm_string txt = *cur; + pform_set_integer_2atom(width, signed_flag, txt); + } + delete names; +} + svector* pform_make_udp_input_ports(list*names) { svector*out = new svector(names->size()); diff --git a/pform.h b/pform.h index ea50b318a..fa5debc72 100644 --- a/pform.h +++ b/pform.h @@ -275,6 +275,8 @@ extern void pform_set_reg_idx(perm_string name, PExpr*l, PExpr*r); extern void pform_set_reg_integer(list*names); extern void pform_set_reg_time(list*names); +extern void pform_set_integer_2atom(uint64_t width, bool signed_flag, list*names); + /* pform_set_attrib and pform_set_type_attrib exist to support the $attribute syntax, which can only set string values to attributes. The functions keep the value strings that are diff --git a/scripts/devel-stub.conf b/scripts/devel-stub.conf index 315c22ba0..01009dc3d 100644 --- a/scripts/devel-stub.conf +++ b/scripts/devel-stub.conf @@ -6,7 +6,7 @@ # # NOTE: DO NOT INSTALL THIS FILE! # -generation:2005 +generation:2009 generation:specify generation:xtypes generation:verilog-ams From af6fd666487c5bc16f15d69293b67b0f1bf86fc4 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sat, 2 Oct 2010 16:29:30 -0700 Subject: [PATCH 02/16] Tasks functions with atom2 arguments. Parse 2-value atoms as arguments to functions and tasks. --- PTask.h | 4 +- elab_sig.cc | 59 ++++++++++-- parse.y | 219 +++++++++++++++++++++++++------------------ tgt-vvp/draw_ufunc.c | 9 ++ 4 files changed, 194 insertions(+), 97 deletions(-) diff --git a/PTask.h b/PTask.h index a7fe3f7b5..949c6d20c 100644 --- a/PTask.h +++ b/PTask.h @@ -37,7 +37,9 @@ enum PTaskFuncEnum { PTF_INTEGER, PTF_REAL, PTF_REALTIME, - PTF_TIME + PTF_TIME, + PTF_ATOM2, + PTF_ATOM2_S }; struct PTaskFuncArg { diff --git a/elab_sig.cc b/elab_sig.cc index f78f4aae4..3f393b045 100644 --- a/elab_sig.cc +++ b/elab_sig.cc @@ -69,6 +69,15 @@ static bool get_const_argument(NetExpr*exp, verinum&res) return true; } +static bool get_const_argument(NetExpr*exp, long&res) +{ + verinum tmp; + bool rc = get_const_argument(exp, tmp); + if (rc == false) return false; + res = tmp.as_long(); + return true; +} + void Statement::elaborate_sig(Design*des, NetScope*scope) const { } @@ -472,18 +481,14 @@ void PFunction::elaborate_sig(Design*des, NetScope*scope) const need_constant_expr = false; long mnum = 0, lnum = 0; - if (NetEConst*tmp = dynamic_cast(me)) { - mnum = tmp->value().as_long(); - } else { + if ( ! get_const_argument(me, mnum) ) { cerr << me->get_fileline() << ": error: " "Unable to evaluate constant expression " << *me << "." << endl; des->errors += 1; } - if (NetEConst*tmp = dynamic_cast(le)) { - lnum = tmp->value().as_long(); - } else { + if ( ! get_const_argument(le, lnum) ) { cerr << le->get_fileline() << ": error: " "Unable to evaluate constant expression " << *le << "." << endl; @@ -534,6 +539,48 @@ void PFunction::elaborate_sig(Design*des, NetScope*scope) const ret_sig->data_type(IVL_VT_REAL); break; + case PTF_ATOM2: + case PTF_ATOM2_S: + ivl_assert(*this, return_type_.range != 0); + probe_expr_width(des, scope, (*return_type_.range)[0]); + probe_expr_width(des, scope, (*return_type_.range)[1]); + long use_wid; + { + need_constant_expr = true; + NetExpr*me = elab_and_eval(des, scope, + (*return_type_.range)[0], -1); + assert(me); + NetExpr*le = elab_and_eval(des, scope, + (*return_type_.range)[1], -1); + assert(le); + need_constant_expr = false; + + long mnum = 0, lnum = 0; + if ( ! get_const_argument(me, mnum) ) { + cerr << me->get_fileline() << ": error: " + "Unable to evaluate constant expression " + << *me << "." << endl; + des->errors += 1; + } + + if ( ! get_const_argument(le, lnum) ) { + cerr << le->get_fileline() << ": error: " + "Unable to evaluate constant expression " + << *le << "." << endl; + des->errors += 1; + } + + use_wid = mnum - lnum + 1; + } + ret_sig = new NetNet(scope, fname, NetNet::REG, use_wid); + ret_sig->set_line(*this); + ret_sig->set_signed(return_type_.type == PTF_ATOM2_S? true : false); + ret_sig->set_isint(true); + ret_sig->set_scalar(false); + ret_sig->port_type(NetNet::POUTPUT); + ret_sig->data_type(IVL_VT_BOOL); + break; + default: if (ports_) { cerr << get_fileline() << ": internal error: I don't know " diff --git a/parse.y b/parse.y index 1d0e3c4a9..502f6ac0a 100644 --- a/parse.y +++ b/parse.y @@ -106,6 +106,16 @@ static list >* make_port_list(list* make_range_from_width(uint64_t wid) +{ + svector*range = new svector(2); + + (*range)[0] = new PENumber(new verinum(wid-1, integer_width)); + (*range)[1] = new PENumber(new verinum((uint64_t)0, integer_width)); + + return range; +} + static list* list_from_identifier(char*id) { list*tmp = new list; @@ -167,6 +177,7 @@ static PECallFunction*make_call_function(perm_string tn, PExpr*arg1, PExpr*arg2) bool flag; char letter; + int int_val; /* text items are C strings allocated by the lexor using strdup. They can be put into lists with the texts type. */ @@ -394,6 +405,8 @@ static PECallFunction*make_call_function(perm_string tn, PExpr*arg1, PExpr*arg2) %type specify_simple_path specify_simple_path_decl %type specify_edge_path specify_edge_path_decl +%type atom2_type + %token K_TAND %right '?' ':' %left K_LOR @@ -531,23 +544,8 @@ block_item_decl if ($1) delete $1; } - | attribute_list_opt K_byte signed_unsigned_opt register_variable_list ';' - { pform_set_integer_2atom(8, $3, $4); - if ($1) delete $1; - } - - | attribute_list_opt K_shortint signed_unsigned_opt register_variable_list ';' - { pform_set_integer_2atom(16, $3, $4); - if ($1) delete $1; - } - - | attribute_list_opt K_int signed_unsigned_opt register_variable_list ';' - { pform_set_integer_2atom(32, $3, $4); - if ($1) delete $1; - } - - | attribute_list_opt K_longint signed_unsigned_opt register_variable_list ';' - { pform_set_integer_2atom(64, $3, $4); + | attribute_list_opt atom2_type signed_unsigned_opt register_variable_list ';' + { pform_set_integer_2atom($2, $3, $4); if ($1) delete $1; } @@ -2024,6 +2022,17 @@ signed_unsigned_opt | { $$ = true; } ; + /* + * In some places we can take any of the 4 2-value atom-type + * names. All the context needs to know if that type is its width. + */ +atom2_type + : K_byte { $$ = 8; } + | K_shortint { $$ = 16; } + | K_int { $$ = 32; } + | K_longint { $$ = 64; } + ; + /* An lpvalue is the expression that can go on the left side of a procedural assignment. This rule handles only procedural assignments. It is more limited then the general expr_primary @@ -2680,10 +2689,11 @@ net_decl_assigns ; primitive_type - : K_logic { $$ = IVL_VT_LOGIC; } - | K_bool { $$ = IVL_VT_BOOL; } - | K_real { $$ = IVL_VT_REAL; } - ; + : K_logic { $$ = IVL_VT_LOGIC; } + | K_bool { $$ = IVL_VT_BOOL; /* Icarus Verilog xtypes */} + | K_bit { $$ = IVL_VT_BOOL; /* IEEE1800 / IEEE1364-2009 */} + | K_real { $$ = IVL_VT_REAL; } +; primitive_type_opt : primitive_type { $$ = $1; } | { $$ = IVL_VT_NO_TYPE; } ; @@ -3236,14 +3246,17 @@ dimensions /* This is used to express the return type of a function. */ function_range_or_type_opt - : range { $$.range = $1; $$.type = PTF_REG; } - | K_signed range { $$.range = $2; $$.type = PTF_REG_S; } - | K_integer { $$.range = 0; $$.type = PTF_INTEGER; } - | K_real { $$.range = 0; $$.type = PTF_REAL; } - | K_realtime { $$.range = 0; $$.type = PTF_REALTIME; } - | K_time { $$.range = 0; $$.type = PTF_TIME; } - | { $$.range = 0; $$.type = PTF_REG; } - ; + : range { $$.range = $1; $$.type = PTF_REG; } + | K_signed range { $$.range = $2; $$.type = PTF_REG_S; } + | K_integer { $$.range = 0; $$.type = PTF_INTEGER; } + | K_real { $$.range = 0; $$.type = PTF_REAL; } + | K_realtime { $$.range = 0; $$.type = PTF_REALTIME; } + | K_time { $$.range = 0; $$.type = PTF_TIME; } + | atom2_type { $$.range = make_range_from_width($1); $$.type = PTF_ATOM2_S; } + | atom2_type K_signed { $$.range = make_range_from_width($1); $$.type = PTF_ATOM2_S; } + | atom2_type K_unsigned { $$.range = make_range_from_width($1); $$.type = PTF_ATOM2; } + | { $$.range = 0; $$.type = PTF_REG; } + ; /* The register_variable rule is matched only when I am parsing variables in a "reg" definition. I therefore know that I am @@ -4356,66 +4369,48 @@ task_port_decl /* Ports can be time with a width of [63:0] (unsigned). */ - | K_input K_time IDENTIFIER - { svector*range_stub = new svector(2); - PExpr*re; - re = new PENumber(new verinum((uint64_t)63, integer_width)); - (*range_stub)[0] = re; - re = new PENumber(new verinum((uint64_t)0, integer_width)); - (*range_stub)[1] = re; - port_declaration_context.port_type = NetNet::PINPUT; - port_declaration_context.var_type = IVL_VT_LOGIC; - port_declaration_context.sign_flag = false; - delete port_declaration_context.range; - port_declaration_context.range = copy_range(range_stub); - svector*tmp - = pform_make_task_ports(NetNet::PINPUT, - IVL_VT_LOGIC, false, - range_stub, - list_from_identifier($3), - @1.text, @1.first_line); - $$ = tmp; - } - | K_output K_time IDENTIFIER - { svector*range_stub = new svector(2); - PExpr*re; - re = new PENumber(new verinum((uint64_t)63, integer_width)); - (*range_stub)[0] = re; - re = new PENumber(new verinum((uint64_t)0, integer_width)); - (*range_stub)[1] = re; - port_declaration_context.port_type = NetNet::POUTPUT; - port_declaration_context.var_type = IVL_VT_LOGIC; - port_declaration_context.sign_flag = false; - delete port_declaration_context.range; - port_declaration_context.range = copy_range(range_stub); - svector*tmp - = pform_make_task_ports(NetNet::POUTPUT, - IVL_VT_LOGIC, false, - range_stub, - list_from_identifier($3), - @1.text, @1.first_line); - $$ = tmp; - } - | K_inout K_time IDENTIFIER - { svector*range_stub = new svector(2); - PExpr*re; - re = new PENumber(new verinum((uint64_t)63, integer_width)); - (*range_stub)[0] = re; - re = new PENumber(new verinum((uint64_t)0, integer_width)); - (*range_stub)[1] = re; - port_declaration_context.port_type = NetNet::PINOUT; - port_declaration_context.var_type = IVL_VT_LOGIC; - port_declaration_context.sign_flag = false; - delete port_declaration_context.range; - port_declaration_context.range = copy_range(range_stub); - svector*tmp - = pform_make_task_ports(NetNet::PINOUT, - IVL_VT_LOGIC, false, - range_stub, - list_from_identifier($3), - @1.text, @1.first_line); - $$ = tmp; - } + | K_input K_time IDENTIFIER + { svector*range_stub = make_range_from_width(64); + port_declaration_context.port_type = NetNet::PINPUT; + port_declaration_context.var_type = IVL_VT_LOGIC; + port_declaration_context.sign_flag = false; + delete port_declaration_context.range; + port_declaration_context.range = copy_range(range_stub); + svector*tmp = pform_make_task_ports(NetNet::PINPUT, + IVL_VT_LOGIC, false, + range_stub, + list_from_identifier($3), + @1.text, @1.first_line); + $$ = tmp; + } + | K_output K_time IDENTIFIER + { svector*range_stub = make_range_from_width(64); + port_declaration_context.port_type = NetNet::POUTPUT; + port_declaration_context.var_type = IVL_VT_LOGIC; + port_declaration_context.sign_flag = false; + delete port_declaration_context.range; + port_declaration_context.range = copy_range(range_stub); + svector*tmp = pform_make_task_ports(NetNet::POUTPUT, + IVL_VT_LOGIC, false, + range_stub, + list_from_identifier($3), + @1.text, @1.first_line); + $$ = tmp; + } + | K_inout K_time IDENTIFIER + { svector*range_stub = make_range_from_width(64); + port_declaration_context.port_type = NetNet::PINOUT; + port_declaration_context.var_type = IVL_VT_LOGIC; + port_declaration_context.sign_flag = false; + delete port_declaration_context.range; + port_declaration_context.range = copy_range(range_stub); + svector*tmp = pform_make_task_ports(NetNet::PINOUT, + IVL_VT_LOGIC, false, + range_stub, + list_from_identifier($3), + @1.text, @1.first_line); + $$ = tmp; + } /* Ports can be real or realtime. */ @@ -4458,7 +4453,51 @@ task_port_decl @1.text, @1.first_line); $$ = tmp; } - ; + + /* Ports can be 2-value atom types. */ + + | K_input atom2_type signed_unsigned_opt IDENTIFIER + { svector*range_stub = make_range_from_width($2); + port_declaration_context.port_type = NetNet::PINPUT; + port_declaration_context.var_type = IVL_VT_BOOL; + port_declaration_context.sign_flag = $3; + delete port_declaration_context.range; + port_declaration_context.range = copy_range(range_stub); + svector*tmp = pform_make_task_ports(NetNet::PINPUT, + IVL_VT_BOOL, $3, + range_stub, list_from_identifier($4), + @1.text, @1.first_line); + $$ = tmp; + } + + | K_output atom2_type signed_unsigned_opt IDENTIFIER + { svector*range_stub = make_range_from_width($2); + port_declaration_context.port_type = NetNet::POUTPUT; + port_declaration_context.var_type = IVL_VT_BOOL; + port_declaration_context.sign_flag = $3; + delete port_declaration_context.range; + port_declaration_context.range = copy_range(range_stub); + svector*tmp = pform_make_task_ports(NetNet::POUTPUT, + IVL_VT_BOOL, $3, + range_stub, list_from_identifier($4), + @1.text, @1.first_line); + $$ = tmp; + } + + | K_inout atom2_type signed_unsigned_opt IDENTIFIER + { svector*range_stub = make_range_from_width($2); + port_declaration_context.port_type = NetNet::PINOUT; + port_declaration_context.var_type = IVL_VT_BOOL; + port_declaration_context.sign_flag = $3; + delete port_declaration_context.range; + port_declaration_context.range = copy_range(range_stub); + svector*tmp = pform_make_task_ports(NetNet::PINOUT, + IVL_VT_BOOL, $3, + range_stub, list_from_identifier($4), + @1.text, @1.first_line); + $$ = tmp; + } +; task_port_decl_list : task_port_decl_list ',' task_port_decl diff --git a/tgt-vvp/draw_ufunc.c b/tgt-vvp/draw_ufunc.c index 8e0f8fcfa..554462193 100644 --- a/tgt-vvp/draw_ufunc.c +++ b/tgt-vvp/draw_ufunc.c @@ -55,6 +55,12 @@ static void function_argument_real(ivl_signal_t port, ivl_expr_t expr) clr_word(res); } +static void function_argument_bool(ivl_signal_t port, ivl_expr_t expr) +{ + /* For now, treat bit2 variables as bit4 variables. */ + function_argument_logic(port, expr); +} + static void draw_function_argument(ivl_signal_t port, ivl_expr_t expr) { ivl_variable_type_t dtype = ivl_signal_data_type(port); @@ -65,6 +71,9 @@ static void draw_function_argument(ivl_signal_t port, ivl_expr_t expr) case IVL_VT_REAL: function_argument_real(port, expr); break; + case IVL_VT_BOOL: + function_argument_bool(port, expr); + break; default: fprintf(stderr, "XXXX function argument %s type=%d?!\n", ivl_signal_basename(port), dtype); From 6a0cbc5fa82e924e8f99ef155619ea654a37aa44 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 7 Oct 2010 18:01:11 -0700 Subject: [PATCH 03/16] VPI access to atom2 types. Create the .var/2u and .var/2s variable records and give them basic implementations. Make available to VPI the proper types for the SystemVerilog types that these variables represent. --- Makefile.in | 5 ++- vpi/sys_display.c | 4 ++ vpi/sys_priv.h | 2 +- vvp/README.txt | 6 ++- vvp/array.h | 3 -- vvp/compile.cc | 4 ++ vvp/compile.h | 11 +++-- vvp/lexor.lex | 2 + vvp/parse.y | 15 +++++-- vvp/vpi_priv.cc | 16 ++++--- vvp/vpi_priv.h | 13 +++--- vvp/vpi_signal.cc | 112 ++++++++++++++++++++++++++++++++++++++++------ vvp/words.cc | 49 ++++++++++---------- 13 files changed, 177 insertions(+), 65 deletions(-) diff --git a/Makefile.in b/Makefile.in index fc291bf98..8b879a9cf 100644 --- a/Makefile.in +++ b/Makefile.in @@ -292,7 +292,7 @@ else WIN32_INSTALL = $(bindir)/iverilog-vpi$(suffix) endif -install: all installdirs $(libdir)/ivl$(suffix)/ivl@EXEEXT@ $(libdir)/ivl$(suffix)/include/constants.vams $(libdir)/ivl$(suffix)/include/disciplines.vams $(includedir)/ivl_target.h $(includedir)/_pli_types.h $(includedir)/vpi_user.h $(includedir)/acc_user.h $(includedir)/veriuser.h $(WIN32_INSTALL) $(INSTALL_DOC) +install: all installdirs $(libdir)/ivl$(suffix)/ivl@EXEEXT@ $(libdir)/ivl$(suffix)/include/constants.vams $(libdir)/ivl$(suffix)/include/disciplines.vams $(includedir)/ivl_target.h $(includedir)/_pli_types.h $(includedir)/sv_vpi_user.h $(includedir)/vpi_user.h $(includedir)/acc_user.h $(includedir)/veriuser.h $(WIN32_INSTALL) $(INSTALL_DOC) $(foreach dir,$(SUBDIRS),$(MAKE) -C $(dir) $@ && ) true $(bindir)/iverilog-vpi$(suffix): ./iverilog-vpi @@ -313,6 +313,9 @@ $(includedir)/ivl_target.h: $(srcdir)/ivl_target.h $(includedir)/_pli_types.h: _pli_types.h $(INSTALL_DATA) $< "$(DESTDIR)$(includedir)/_pli_types.h" +$(includedir)/sv_vpi_user.h: $(srcdir)/sv_vpi_user.h + $(INSTALL_DATA) $(srcdir)/sv_vpi_user.h "$(DESTDIR)$(includedir)/sv_vpi_user.h" + $(includedir)/vpi_user.h: $(srcdir)/vpi_user.h $(INSTALL_DATA) $(srcdir)/vpi_user.h "$(DESTDIR)$(includedir)/vpi_user.h" diff --git a/vpi/sys_display.c b/vpi/sys_display.c index 2ea8e830f..6069974e2 100644 --- a/vpi/sys_display.c +++ b/vpi/sys_display.c @@ -1047,6 +1047,10 @@ static int sys_check_args(vpiHandle callh, vpiHandle argv, const PLI_BYTE8*name, case vpiNet: case vpiReg: case vpiIntegerVar: + case vpiByteVar: + case vpiShortIntVar: + case vpiIntVar: + case vpiLongIntVar: case vpiTimeVar: case vpiRealVar: case vpiSysFuncCall: diff --git a/vpi/sys_priv.h b/vpi/sys_priv.h index 094416f28..f384cdef7 100644 --- a/vpi/sys_priv.h +++ b/vpi/sys_priv.h @@ -20,7 +20,7 @@ */ #include "vpi_config.h" -#include "vpi_user.h" +#include "sv_vpi_user.h" /* * Context structure for PRNG in mt19937int.c diff --git a/vvp/README.txt b/vvp/README.txt index 8e43030b5..817df5b67 100644 --- a/vvp/README.txt +++ b/vvp/README.txt @@ -278,8 +278,10 @@ A variable is a bit vector that can be written by behavioral code (so has no structural input) and propagates its output to a functor. The general syntax of a variable is: -