Optimize VPI callValueCbs (#4155)

Co-authored-by: Oleh Maks <olehmaksa@gmail.com>
This commit is contained in:
Hennadii Chernyshchyk 2023-05-02 14:28:56 +03:00 committed by GitHub
parent 3e986517c3
commit 949be9d0a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 23 deletions

View File

@ -43,6 +43,7 @@ Guokai Chen
Gustav Svensk Gustav Svensk
G-A. Kamendje G-A. Kamendje
Harald Heckmann Harald Heckmann
Hennadii Chernyshchyk
Howard Su Howard Su
Huang Rui Huang Rui
Huanghuang Zhou Huanghuang Zhou
@ -108,6 +109,7 @@ Mostafa Gamal
Nandu Raj Nandu Raj
Nathan Kohagen Nathan Kohagen
Nathan Myers Nathan Myers
Oleh Maksymenko
Patrick Stewart Patrick Stewart
Paul Wright Paul Wright
Pawel Sagan Pawel Sagan

View File

@ -165,6 +165,7 @@ class VerilatedVpioVarBase VL_NOT_FINAL : public VerilatedVpio {
protected: protected:
const VerilatedVar* m_varp = nullptr; const VerilatedVar* m_varp = nullptr;
const VerilatedScope* m_scopep = nullptr; const VerilatedScope* m_scopep = nullptr;
std::string m_fullname;
const VerilatedRange& get_range() const { const VerilatedRange& get_range() const {
// Determine number of dimensions and return outermost // Determine number of dimensions and return outermost
return (m_varp->dims() > 1) ? m_varp->unpacked() : m_varp->packed(); return (m_varp->dims() > 1) ? m_varp->unpacked() : m_varp->packed();
@ -173,11 +174,13 @@ protected:
public: public:
VerilatedVpioVarBase(const VerilatedVar* varp, const VerilatedScope* scopep) VerilatedVpioVarBase(const VerilatedVar* varp, const VerilatedScope* scopep)
: m_varp{varp} : m_varp{varp}
, m_scopep{scopep} {} , m_scopep{scopep}
, m_fullname{std::string{m_scopep->name()} + '.' + name()} {}
explicit VerilatedVpioVarBase(const VerilatedVpioVarBase* varp) { explicit VerilatedVpioVarBase(const VerilatedVpioVarBase* varp) {
if (varp) { if (varp) {
m_varp = varp->m_varp; m_varp = varp->m_varp;
m_scopep = varp->m_scopep; m_scopep = varp->m_scopep;
m_fullname = varp->m_fullname;
} }
} }
static VerilatedVpioVarBase* castp(vpiHandle h) { static VerilatedVpioVarBase* castp(vpiHandle h) {
@ -188,11 +191,7 @@ public:
uint32_t size() const override { return get_range().elements(); } uint32_t size() const override { return get_range().elements(); }
const VerilatedRange* rangep() const override { return &get_range(); } const VerilatedRange* rangep() const override { return &get_range(); }
const char* name() const override { return m_varp->name(); } const char* name() const override { return m_varp->name(); }
const char* fullname() const override { const char* fullname() const override { return m_fullname.c_str(); }
static thread_local std::string t_out;
t_out = std::string{m_scopep->name()} + "." + name();
return t_out.c_str();
}
}; };
class VerilatedVpioParam final : public VerilatedVpioVarBase { class VerilatedVpioParam final : public VerilatedVpioVarBase {
@ -646,23 +645,22 @@ public:
continue; continue;
} }
VerilatedVpiCbHolder& ho = *it++; VerilatedVpiCbHolder& ho = *it++;
if (VerilatedVpioVar* const varop = VerilatedVpioVar::castp(ho.cb_datap()->obj)) { VerilatedVpioVar* const varop = reinterpret_cast<VerilatedVpioVar*>(ho.cb_datap()->obj);
void* const newDatap = varop->varDatap(); void* const newDatap = varop->varDatap();
void* const prevDatap void* const prevDatap
= varop->prevDatap(); // Was malloced when we added the callback = varop->prevDatap(); // Was malloced when we added the callback
VL_DEBUG_IF_PLI(VL_DBG_MSGF("- vpi: value_test %s v[0]=%d/%d %p %p\n", VL_DEBUG_IF_PLI(VL_DBG_MSGF("- vpi: value_test %s v[0]=%d/%d %p %p\n",
varop->fullname(), *(static_cast<CData*>(newDatap)), varop->fullname(), *(static_cast<CData*>(newDatap)),
*(static_cast<CData*>(prevDatap)), newDatap, *(static_cast<CData*>(prevDatap)), newDatap,
prevDatap);); prevDatap););
if (std::memcmp(prevDatap, newDatap, varop->entSize()) != 0) { if (std::memcmp(prevDatap, newDatap, varop->entSize()) != 0) {
VL_DEBUG_IF_PLI(VL_DBG_MSGF("- vpi: value_callback %" PRId64 " %s v[0]=%d\n", VL_DEBUG_IF_PLI(VL_DBG_MSGF("- vpi: value_callback %" PRId64 " %s v[0]=%d\n",
ho.id(), varop->fullname(), ho.id(), varop->fullname(),
*(static_cast<CData*>(newDatap)));); *(static_cast<CData*>(newDatap))););
update.insert(varop); update.insert(varop);
vpi_get_value(ho.cb_datap()->obj, ho.cb_datap()->value); vpi_get_value(ho.cb_datap()->obj, ho.cb_datap()->value);
(ho.cb_rtnp())(ho.cb_datap()); (ho.cb_rtnp())(ho.cb_datap());
called = true; called = true;
}
} }
if (was_last) break; if (was_last) break;
} }