vvp: Initialize automatic 2-state vectors to 0
Automatic 2-state vectors currently get initialized to 'hx, while their default value should be 0. Make sure the vector is initialized to 0 at the beginning of the automatic context. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
999bcb6935
commit
0dfbcbdf47
|
|
@ -1794,17 +1794,29 @@ void vvp_vector4_t::change_z2x()
|
|||
}
|
||||
}
|
||||
|
||||
void vvp_vector4_t::set_to_x()
|
||||
void vvp_vector4_t::fill_bits(vvp_bit4_t bit)
|
||||
{
|
||||
/* note: this relies on the bit encoding for the vvp_bit4_t. */
|
||||
static const unsigned long init_atable[4] = {
|
||||
WORD_0_ABITS,
|
||||
WORD_1_ABITS,
|
||||
WORD_Z_ABITS,
|
||||
WORD_X_ABITS };
|
||||
static const unsigned long init_btable[4] = {
|
||||
WORD_0_BBITS,
|
||||
WORD_1_BBITS,
|
||||
WORD_Z_BBITS,
|
||||
WORD_X_BBITS };
|
||||
|
||||
if (size_ <= BITS_PER_WORD) {
|
||||
abits_val_ = vvp_vector4_t::WORD_X_ABITS;
|
||||
bbits_val_ = vvp_vector4_t::WORD_X_BBITS;
|
||||
abits_val_ = init_atable[bit];
|
||||
bbits_val_ = init_btable[bit];
|
||||
} else {
|
||||
unsigned words = (size_+BITS_PER_WORD-1) / BITS_PER_WORD;
|
||||
for (unsigned idx = 0 ; idx < words ; idx += 1) {
|
||||
abits_ptr_[idx] = vvp_vector4_t::WORD_X_ABITS;
|
||||
bbits_ptr_[idx] = vvp_vector4_t::WORD_X_BBITS;
|
||||
}
|
||||
unsigned words = (size_ + BITS_PER_WORD - 1) / BITS_PER_WORD;
|
||||
for (unsigned idx = 0; idx < words; idx += 1) {
|
||||
abits_ptr_[idx] = init_atable[bit];
|
||||
bbits_ptr_[idx] = init_btable[bit];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -312,8 +312,11 @@ class vvp_vector4_t {
|
|||
// Change all Z bits to X bits.
|
||||
void change_z2x();
|
||||
|
||||
// Set all bits to the specified value.
|
||||
void fill_bits(vvp_bit4_t bit);
|
||||
|
||||
// Change all bits to X bits.
|
||||
void set_to_x();
|
||||
void set_to_x() { fill_bits(BIT4_X); }
|
||||
|
||||
// Display the value into the buf as a string.
|
||||
char*as_string(char*buf, size_t buf_len) const;
|
||||
|
|
|
|||
|
|
@ -333,12 +333,9 @@ const vvp_vector4_t& vvp_fun_signal4_sa::vec4_unfiltered_value() const
|
|||
|
||||
vvp_fun_signal4_aa::vvp_fun_signal4_aa(unsigned wid, vvp_bit4_t init)
|
||||
{
|
||||
/* To make init work we would need to save it and then use the
|
||||
* saved value when we ran reset_instance(). For now just make
|
||||
* sure it matches the value we use in reset_instance(). */
|
||||
assert(init == BIT4_X);
|
||||
context_idx_ = vpip_add_item_to_context(this, vpip_peek_context_scope());
|
||||
size_ = wid;
|
||||
init_ = init;
|
||||
}
|
||||
|
||||
vvp_fun_signal4_aa::~vvp_fun_signal4_aa()
|
||||
|
|
@ -348,7 +345,7 @@ vvp_fun_signal4_aa::~vvp_fun_signal4_aa()
|
|||
|
||||
void vvp_fun_signal4_aa::alloc_instance(vvp_context_t context)
|
||||
{
|
||||
vvp_set_context_item(context, context_idx_, new vvp_vector4_t(size_));
|
||||
vvp_set_context_item(context, context_idx_, new vvp_vector4_t(size_, init_));
|
||||
}
|
||||
|
||||
void vvp_fun_signal4_aa::reset_instance(vvp_context_t context)
|
||||
|
|
@ -356,7 +353,7 @@ void vvp_fun_signal4_aa::reset_instance(vvp_context_t context)
|
|||
vvp_vector4_t*bits = static_cast<vvp_vector4_t*>
|
||||
(vvp_get_context_item(context, context_idx_));
|
||||
|
||||
bits->set_to_x();
|
||||
bits->fill_bits(init_);
|
||||
}
|
||||
|
||||
#ifdef CHECK_WITH_VALGRIND
|
||||
|
|
|
|||
|
|
@ -190,6 +190,7 @@ class vvp_fun_signal4_aa : public vvp_fun_signal_vec, public automatic_signal_ba
|
|||
private:
|
||||
unsigned context_idx_;
|
||||
unsigned size_;
|
||||
vvp_bit4_t init_;
|
||||
};
|
||||
|
||||
class vvp_fun_signal_real : public vvp_fun_signal_base {
|
||||
|
|
|
|||
13
vvp/words.cc
13
vvp/words.cc
|
|
@ -176,15 +176,18 @@ void compile_variable(char*label, char*name,
|
|||
|
||||
vvp_net_t*net = new vvp_net_t;
|
||||
|
||||
vvp_bit4_t init;
|
||||
if (vpi_type_code == vpiIntVar)
|
||||
init = BIT4_0;
|
||||
else
|
||||
init = BIT4_X;
|
||||
|
||||
if (vpip_peek_current_scope()->is_automatic()) {
|
||||
vvp_fun_signal4_aa*tmp = new vvp_fun_signal4_aa(wid);
|
||||
vvp_fun_signal4_aa*tmp = new vvp_fun_signal4_aa(wid, init);
|
||||
net->fil = tmp;
|
||||
net->fun = tmp;
|
||||
} else if (vpi_type_code == vpiIntVar) {
|
||||
net->fil = new vvp_wire_vec4(wid, BIT4_0);
|
||||
net->fun = new vvp_fun_signal4_sa(wid);
|
||||
} else {
|
||||
net->fil = new vvp_wire_vec4(wid, BIT4_X);
|
||||
net->fil = new vvp_wire_vec4(wid, init);
|
||||
net->fun = new vvp_fun_signal4_sa(wid);
|
||||
}
|
||||
vvp_signal_value*vfil = dynamic_cast<vvp_signal_value*>(net->fil);
|
||||
|
|
|
|||
Loading…
Reference in New Issue