Optimize VPI callValueCbs (#4155)
Co-authored-by: Oleh Maks <olehmaksa@gmail.com>
This commit is contained in:
parent
3e986517c3
commit
949be9d0a1
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue