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}