Есть ли поддержка ECC для чипа ракеты в DefaultConfig? - PullRequest
1 голос
/ 05 июля 2019

В ECC.scala, на мой взгляд, существует простой механизм выбора типа кодирования ECC для ICache и DCache, который в конечном итоге будет определять тип ECC по строке, которую мы присваиваем "tagCode" и "dataCode ".

В" DefaultConfig "Rocket значения" tagCode "и" dataCode "для ICache и DCache равны" None ".Поэтому я думаю, что в окончательных файлах verilog нет кодирования ECC.Но я видел, что в окончательных файлах verilog есть много связанных с ECC кодов, таких как «eccmask».

Тогда я не знаю, эффективна ли поддержка ECC в «DefaultConfig» Rocket.

//selector of ECC type
object Code {
    def fromString(s: Option[String]): Code = fromString(s.getOrElse("none"))
    def fromString(s: String): Code = s.toLowerCase match {
        case "none" => new IdentityCode
        case "identity" => new IdentityCode
        case "parity" => new ParityCode
        case "sec" => new SECCode
        case "secded" => new SECDEDCode
        case _ => throw new IllegalArgumentException("Unknown ECC type")
    }
}

//the params of ICache
case class ICacheParams(
    nSets: Int = 64,
    nWays: Int = 4,
    rowBits: Int = 128,
    nTLBEntries: Int = 32,
    cacheIdBits: Int = 0,
    tagECC: Option[String] = None,
    dataECC: Option[String] = None,
    itimAddr: Option[BigInt] = None,
    prefetch: Boolean = false,
    blockBytes: Int = 64,
    latency: Int = 2,
    fetchBytes: Int = 4) extends L1CacheParams {
        def tagCode: Code = Code.fromString(tagECC)
        def dataCode: Code = Code.fromString(dataECC)
        def replacement = new RandomReplacement(nWays)
    }

//the params of ICache
case class DCacheParams(
    nSets: Int = 64,
    nWays: Int = 4,
    rowBits: Int = 64,
    nTLBEntries: Int = 32,
    tagECC: Option[String] = None,
    dataECC: Option[String] = None,
    dataECCBytes: Int = 1,
    nMSHRs: Int = 1,
    nSDQ: Int = 17,
    nRPQ: Int = 16,
    nMMIOs: Int = 1,
    blockBytes: Int = 64,
    acquireBeforeRelease: Boolean = false,
    pipelineWayMux: Boolean = false,
    clockGate: Boolean = false,
    scratch: Option[BigInt] = None) 

extends L1CacheParams {
    def tagCode: Code = Code.fromString(tagECC)
    def dataCode: Code = Code.fromString(dataECC)
    //the final verilog file
    assign data_io_req_bits_eccMask = dataArb_io_out_bits_eccMask;
    assign data_io_req_bits_way_en = dataArb_io_out_bits_way_en;
    assign dataArb_io_in_0_valid = pstore_drain_structural | _T_1732;
    assign dataArb_io_in_0_bits_addr = _T_1829[11:0];
    assign dataArb_io_in_0_bits_wdata = pstore2_valid ? pstore2_storegen_data : a_data;
    assign dataArb_io_in_0_bits_eccMask = {_T_1866,_T_1863};
}
...