xref: /XiangShan/src/main/scala/utils/BitsUtils.scala (revision f7af4c746b893ede5aa64c681f8da182c602efe0)
1*f7af4c74Schengguanghui/***************************************************************************************
2*f7af4c74Schengguanghui * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3*f7af4c74Schengguanghui * Copyright (c) 2020-2021 Peng Cheng Laboratory
4*f7af4c74Schengguanghui *
5*f7af4c74Schengguanghui * XiangShan is licensed under Mulan PSL v2.
6*f7af4c74Schengguanghui * You can use this software according to the terms and conditions of the Mulan PSL v2.
7*f7af4c74Schengguanghui * You may obtain a copy of Mulan PSL v2 at:
8*f7af4c74Schengguanghui *          http://license.coscl.org.cn/MulanPSL2
9*f7af4c74Schengguanghui *
10*f7af4c74Schengguanghui * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11*f7af4c74Schengguanghui * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12*f7af4c74Schengguanghui * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13*f7af4c74Schengguanghui *
14*f7af4c74Schengguanghui * See the Mulan PSL v2 for more details.
15*f7af4c74Schengguanghui ***************************************************************************************/
16*f7af4c74Schengguanghui
17*f7af4c74Schengguanghuipackage utils
18*f7af4c74Schengguanghui
19*f7af4c74Schengguanghuiimport chisel3._
20*f7af4c74Schengguanghuiimport chisel3.util._
21*f7af4c74Schengguanghui
22*f7af4c74Schengguanghuiimport scala.math.min
23*f7af4c74Schengguanghui
24*f7af4c74Schengguanghui/** Scan an input signal with fixed length.
25*f7af4c74Schengguanghui * Set 1 at the end of the length-fixed scan chain if the scanned bits meet the condition.
26*f7af4c74Schengguanghui *
27*f7af4c74Schengguanghui * @example {{{
28*f7af4c74Schengguanghui * val data = Seq(false.B, true.B, true.B, false.B, true.B)
29*f7af4c74Schengguanghui * def condition(input: Seq[Bool]) : Bool = input(0) && input(1)
30*f7af4c74Schengguanghui * val onesLen2EndVec = FixLengthScanSetEnd(data, 2, condition)
31*f7af4c74Schengguanghui * assert(VecInit(onesLen2EndVec).asUInt === VecInit(Seq(false.B, false.B, true.B, false.B, false.B)).asUInt)
32*f7af4c74Schengguanghui * }}}
33*f7af4c74Schengguanghui */
34*f7af4c74Schengguanghuiobject FixedLengthScanSetEnd {
35*f7af4c74Schengguanghui  def apply(input: Seq[Bool], scanLen: Int, condition: Seq[Bool] => Bool) : Seq[Bool] = {
36*f7af4c74Schengguanghui    require(scanLen > 0)
37*f7af4c74Schengguanghui    val res: Vec[Bool] = VecInit(Seq.fill(input.size)(false.B))
38*f7af4c74Schengguanghui    for (i <- (scanLen - 1) until input.size) {
39*f7af4c74Schengguanghui      res(i) := condition((1 - scanLen until 1).map(_ + i).map(input(_)))
40*f7af4c74Schengguanghui    }
41*f7af4c74Schengguanghui    res
42*f7af4c74Schengguanghui  }
43*f7af4c74Schengguanghui}
44*f7af4c74Schengguanghui
45*f7af4c74Schengguanghuiobject ConsecutiveOnesSetEnd {
46*f7af4c74Schengguanghui  def apply(input: Seq[Bool], thres: Int): Seq[Bool] = {
47*f7af4c74Schengguanghui    def condition(input: Seq[Bool]): Bool = input.reduce(_ && _)
48*f7af4c74Schengguanghui    FixedLengthScanSetEnd(input, thres, condition)
49*f7af4c74Schengguanghui  }
50*f7af4c74Schengguanghui}
51*f7af4c74Schengguanghui
52*f7af4c74Schengguanghuiobject ConsecutiveOnes {
53*f7af4c74Schengguanghui  def apply(input: Seq[Bool], thres: Int): Bool = {
54*f7af4c74Schengguanghui    require(thres > 0)
55*f7af4c74Schengguanghui    ConsecutiveOnesSetEnd(input, thres).reduce(_ || _)
56*f7af4c74Schengguanghui  }
57*f7af4c74Schengguanghui}