CsrTop constructor

CsrTop({
  1. required CsrTopConfig config,
  2. required Logic clk,
  3. required Logic reset,
  4. required DataPortInterface? frontWrite,
  5. required DataPortInterface? frontRead,
  6. bool allowLargerRegisters = false,
  7. int logicalRegisterIncrement = 1,
  8. bool reserveName = false,
  9. bool reserveDefinitionName = false,
  10. String? definitionName,
})

Create the CsrBlock from a configuration

Implementation

CsrTop(
    {required CsrTopConfig super.config,
    required super.clk,
    required super.reset,
    required super.frontWrite,
    required super.frontRead,
    super.allowLargerRegisters,
    this.logicalRegisterIncrement = 1,
    super.reserveName,
    super.reserveDefinitionName,
    String? definitionName})
    : super(
          definitionName: definitionName ??
              'CsrTop_A${config.minAddrBits()}_'
                  'W${config.maxRegWidth()}_'
                  'BO${config.blockOffsetWidth}_'
                  'LR${allowLargerRegisters}_'
                  'RI$logicalRegisterIncrement') {
  _validate();

  for (final block in config.blocks) {
    DataPortInterface? blockFdWrite;
    DataPortInterface? blockFdRead;

    if (frontWritePresent) {
      blockFdWrite =
          DataPortInterface(frontWrite!.dataWidth, blockOffsetWidth);
      _fdWrites.add(blockFdWrite);
    }

    if (frontReadPresent) {
      blockFdRead = DataPortInterface(frontRead!.dataWidth, blockOffsetWidth);
      _fdReads.add(blockFdRead);
    }

    _blocks.add(CsrBlock(
        config: block,
        clk: clk,
        reset: reset,
        frontWrite: blockFdWrite,
        frontRead: blockFdRead,
        allowLargerRegisters: allowLargerRegisters));
  }

  for (var i = 0; i < blocks.length; i++) {
    _backdoorInterfaces.add([]);
    backdoorInterfaces.add([]);
    _backdoorIndexMaps.add({});
    for (var j = 0; j < blocks[i].registers.length; j++) {
      if (blocks[i].registers[j].backdoorAccessible) {
        _backdoorInterfaces[i]
            .add(CsrBackdoorInterface(config: blocks[i].registers[j]));
        backdoorInterfaces[i]
            .add(CsrBackdoorInterface(config: blocks[i].registers[j]));
        _backdoorInterfaces[i].last.connectIO(
            this, backdoorInterfaces[i].last,
            outputTags: {CsrBackdoorPortGroup.read},
            inputTags: {CsrBackdoorPortGroup.write},
            uniquify: (original) =>
                '${name}_${blocks[i].name}_${blocks[i].registers[j].name}'
                '_backdoor_$original');
        _backdoorIndexMaps[i][j] = _backdoorInterfaces[i].length - 1;
      }
    }
  }

  _buildLogic();
}