Skip to content

Why use a Mux to reset a register, instead of creating a CompRegOp with the reset signal and the reset value? #9310

@XunChangqing

Description

@XunChangqing

This results in Arcilator being unable to perform effective reset grouping in the GroupResetAndEnable pass.

      // Canonicalize registers.
      if (auto reg = dyn_cast<seq::FirRegOp>(&op)) {
        OpBuilder builder(reg);
        Value next;
        // Note: this register will have an sync reset regardless.
        if (reg.hasReset())
          next = comb::MuxOp::create(builder, reg.getLoc(), reg.getReset(),
                                     reg.getResetValue(), reg.getNext(), false);
        else
          next = reg.getNext();

        Value presetValue;
        // Materialize initial value, assume zero initialization as default.
        if (reg.getPreset() && !reg.getPreset()->isZero()) {
          assert(hw::type_isa<IntegerType>(reg.getType()) &&
                 "cannot lower non integer preset");
          presetValue = circt::seq::createConstantInitialValue(
              builder, reg.getLoc(),
              IntegerAttr::get(reg.getType(), *reg.getPreset()));
        }

        Value compReg = seq::CompRegOp::create(
            builder, reg.getLoc(), next.getType(), next, reg.getClk(),
            reg.getNameAttr(), Value{}, Value{}, /*initialValue*/ presetValue,
            reg.getInnerSymAttr());
        reg.replaceAllUsesWith(compReg);
        opsToDelete.push_back(reg);
        continue;
      }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions