From cb82c42e3592a7c2490a31fec2d080f7bf5c84ce Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Mon, 28 Aug 2017 22:41:38 -0400 Subject: [PATCH] Test for bug1191. --- include/verilated_dpi.cpp | 20 ++++++++++---------- test_regress/t/t_dpi_import.v | 9 +++++++++ test_regress/t/t_dpi_import_c.cpp | 21 +++++++++++++++++++-- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/include/verilated_dpi.cpp b/include/verilated_dpi.cpp index 8da503135..79b03acce 100644 --- a/include/verilated_dpi.cpp +++ b/include/verilated_dpi.cpp @@ -58,31 +58,31 @@ const char* svDpiVersion() { //====================================================================== // Bit-select utility functions. -svBit svGetBitselBit(const svBitVecVal* s, int i) { - _VL_SVDPI_UNIMP(); return 0; +svBit svGetBitselBit(const svBitVecVal* sp, int bit) { + return VL_BITISSET_W(sp,bit); } -svLogic svGetBitselLogic(const svLogicVecVal* s, int i) { +svLogic svGetBitselLogic(const svLogicVecVal* sp, int bit) { _VL_SVDPI_UNIMP(); return 0; } -void svPutBitselBit(svBitVecVal* d, int i, svBit s) { - _VL_SVDPI_UNIMP(); +void svPutBitselBit(svBitVecVal* dp, int bit, svBit s) { + VL_ASSIGNBIT_WI(32, bit, dp, s); } -void svPutBitselLogic(svLogicVecVal* d, int i, svLogic s) { +void svPutBitselLogic(svLogicVecVal* dp, int bit, svLogic s) { _VL_SVDPI_UNIMP(); } -void svGetPartselBit(svBitVecVal* d, const svBitVecVal* s, int i, int w) { +void svGetPartselBit(svBitVecVal* dp, const svBitVecVal* sp, int i, int w) { _VL_SVDPI_UNIMP(); } -void svGetPartselLogic(svLogicVecVal* d, const svLogicVecVal* s, int i, int w) { +void svGetPartselLogic(svLogicVecVal* dp, const svLogicVecVal* sp, int i, int w) { _VL_SVDPI_UNIMP(); } -void svPutPartselBit(svBitVecVal* d, const svBitVecVal s, int i, int w) { +void svPutPartselBit(svBitVecVal* dp, const svBitVecVal s, int i, int w) { _VL_SVDPI_UNIMP(); } -void svPutPartselLogic(svLogicVecVal* d, const svLogicVecVal* s, int i, int w) { +void svPutPartselLogic(svLogicVecVal* dp, const svLogicVecVal* sp, int i, int w) { _VL_SVDPI_UNIMP(); } diff --git a/test_regress/t/t_dpi_import.v b/test_regress/t/t_dpi_import.v index 48ce47db3..5f9cd0c1a 100644 --- a/test_regress/t/t_dpi_import.v +++ b/test_regress/t/t_dpi_import.v @@ -22,6 +22,7 @@ module t (/*AUTOARG*/ input clk; typedef struct packed { bit [47:0] lo; bit [47:0] hi; } str_t; + typedef struct packed { int a; int b; } substr_t; // Allowed import return types: // void, byte, shortint, int, longint, real, shortreal, chandle, and string @@ -56,6 +57,7 @@ module t (/*AUTOARG*/ import "DPI-C" pure function void dpii_v_shortint (input shortint i, output shortint o); import "DPI-C" pure function void dpii_v_longint (input longint i, output longint o); import "DPI-C" pure function void dpii_v_struct (input str_t i, output str_t o); + import "DPI-C" pure function void dpii_v_substruct(input substr_t i, output int o); import "DPI-C" pure function void dpii_v_chandle (input chandle i, output chandle o); import "DPI-C" pure function void dpii_v_string (input string i, output string o); import "DPI-C" pure function void dpii_v_real (input real i, output real o); @@ -100,6 +102,8 @@ module t (/*AUTOARG*/ shortint i_s, o_s; longint i_l, o_l; str_t i_t, o_t; + substr_t i_ss; + int o_ss; int unsigned i_iu, o_iu; shortint unsigned i_su, o_su; longint unsigned i_lu, o_lu; @@ -139,6 +143,10 @@ module t (/*AUTOARG*/ i_lu= {1'b1,wide[64-2:0]}; i_t = {1'b1,wide[95-1:0]}; i_d = 32.1; + + i_ss.a = 32'h054321ab; + i_ss.b = 32'h05a43b21; + `ifndef NO_SHORTREAL i_f = 30.2; `endif @@ -179,6 +187,7 @@ module t (/*AUTOARG*/ dpii_v_ushort (i_su,o_su); if (o_su !== ~i_su) $stop; dpii_v_ulong (i_lu,o_lu); if (o_lu !== ~i_lu) $stop; dpii_v_struct (i_t,o_t); if (o_t !== ~i_t) $stop; + dpii_v_substruct(i_ss,o_ss); if (o_ss !== i_ss.a - i_ss.b) $stop; dpii_v_chandle (i_c,o_c); if (o_c !== i_c) $stop; dpii_v_string (i_n,o_n); if (o_n != i_n) $stop; dpii_v_real (i_d,o_d); if (o_d != i_d+1.5) $stop; diff --git a/test_regress/t/t_dpi_import_c.cpp b/test_regress/t/t_dpi_import_c.cpp index e3fab93c7..8f5a7b7d0 100644 --- a/test_regress/t/t_dpi_import_c.cpp +++ b/test_regress/t/t_dpi_import_c.cpp @@ -29,8 +29,12 @@ # error "Unknown simulator for DPI test" #endif +typedef struct { int a; int b; } substruct_t; + #ifdef NEED_EXTERNS extern "C" { + // If get ncsim: *F,NOFDPI: Function {foo} not found in default libdpi. + // Then probably forgot to list a function here. extern unsigned char dpii_f_bit (unsigned char i); extern svBitVecVal dpii_f_bit8 (const svBitVecVal* i); @@ -59,18 +63,25 @@ extern "C" { extern void dpii_v_longint (long long i, long long *o); extern void dpii_v_ulong (unsigned long long i, unsigned long long *o); extern void dpii_v_struct (const svBitVecVal* i, svBitVecVal* o); + extern void dpii_v_substruct (const svBitVecVal* i, int* o); extern void dpii_v_chandle (void* i, void* *o); extern void dpii_v_string (const char* i, const char** o); extern void dpii_v_real (double i, double* o); extern void dpii_v_shortreal(float i, float* o); + extern void dpii_v_struct (const svBitVecVal* i, svBitVecVal* o); + extern void dpii_v_substruct (const svBitVecVal* i, int* o); + extern void dpii_v_bit64(const svBitVecVal* i, svBitVecVal* o); + extern void dpii_v_bit95(const svBitVecVal* i, svBitVecVal* o); + extern void dpii_v_bit96(const svBitVecVal* i, svBitVecVal* o); + + extern int dpii_f_strlen (const char* i); + extern void dpii_f_void (); extern int dpii_t_void (); extern int dpii_t_void_context (); extern int dpii_t_int (int i, int *o); - extern int dpii_f_strlen (const char* i); - extern int dpii_fa_bit(int i); } #endif @@ -115,6 +126,12 @@ void dpii_v_struct (const svBitVecVal* i, svBitVecVal* o) { o[3] = ~i[3]; o[4] = ~i[4]; } +void dpii_v_substruct (const svBitVecVal* i, int* o) { + // To be most like other tools, this should automagically take the substruct_t + // as an argument, and not require this cast... + substruct_t* issp = (substruct_t*) i; + o[0] = issp->b - issp->a; +} void dpii_v_bit64(const svBitVecVal* i, svBitVecVal* o) { o[0] = ~i[0]; o[1] = ~i[1];