sim: Run a comb-only update step to set past values during FST cosim

The previous approach only initialized past_d and past_ad while for FST
cosim we also need to initialize the other past values like past_clk,
etc. Also to properly initialize them, we need to run a combinational
update step in case any of the wires feeding into the FF are private or
otherwise not part of the FST.
This commit is contained in:
Jannis Harder 2022-11-07 14:09:33 +01:00
parent cff42f0af5
commit 9b4fba3870
1 changed files with 11 additions and 12 deletions

View File

@ -813,18 +813,6 @@ struct SimInstance
std::string v = shared->fst->valueOf(item.second); std::string v = shared->fst->valueOf(item.second);
did_something |= set_state(item.first, Const::from_string(v)); did_something |= set_state(item.first, Const::from_string(v));
} }
for (auto &it : ff_database)
{
ff_state_t &ff = it.second;
SigSpec dsig = it.second.data.sig_d;
Const value = get_state(dsig);
if (dsig.is_wire()) {
ff.past_d = value;
if (ff.data.has_aload)
ff.past_ad = value;
did_something |= true;
}
}
for (auto cell : module->cells()) for (auto cell : module->cells())
{ {
if (cell->is_mem_cell()) { if (cell->is_mem_cell()) {
@ -1019,6 +1007,16 @@ struct SimWorker : SimShared
top->update_ph3(); top->update_ph3();
} }
void initialize_stable_past()
{
if (debug)
log("\n-- ph1 (initialize) --\n");
top->update_ph1();
if (debug)
log("\n-- ph3 (initialize) --\n");
top->update_ph3();
}
void set_inports(pool<IdString> ports, State value) void set_inports(pool<IdString> ports, State value)
{ {
for (auto portname : ports) for (auto portname : ports)
@ -1191,6 +1189,7 @@ struct SimWorker : SimShared
if (initial) { if (initial) {
did_something |= top->setInitState(); did_something |= top->setInitState();
initialize_stable_past();
initial = false; initial = false;
} }
if (did_something) if (did_something)