xref: /XiangShan/src/main/scala/utils/LowPowerState.scala (revision 814aa9ec6f137d36a5efd6cf61fb0833cf156a4a)
14d7fbe77Syulightenyu/***************************************************************************************
24d7fbe77Syulightenyu * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
34d7fbe77Syulightenyu * Copyright (c) 2020-2021 Peng Cheng Laboratory
44d7fbe77Syulightenyu *
54d7fbe77Syulightenyu * XiangShan is licensed under Mulan PSL v2.
64d7fbe77Syulightenyu * You can use this software according to the terms and conditions of the Mulan PSL v2.
74d7fbe77Syulightenyu * You may obtain a copy of Mulan PSL v2 at:
84d7fbe77Syulightenyu *          http://license.coscl.org.cn/MulanPSL2
94d7fbe77Syulightenyu *
104d7fbe77Syulightenyu * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
114d7fbe77Syulightenyu * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
124d7fbe77Syulightenyu * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
134d7fbe77Syulightenyu *
144d7fbe77Syulightenyu * See the Mulan PSL v2 for more details.
154d7fbe77Syulightenyu ***************************************************************************************/
164d7fbe77Syulightenyu
174d7fbe77Syulightenyupackage utils
184d7fbe77Syulightenyu
194d7fbe77Syulightenyuimport chisel3._
204d7fbe77Syulightenyuimport chisel3.util._
214d7fbe77Syulightenyu
224d7fbe77Syulightenyu/* WFI state Update */
234d7fbe77Syulightenyuobject WfiStateNext {
24ce80648bSyulightenyu  val sNORMAL :: sGCLOCK :: sAWAKE :: sFLITWAKE :: Nil = Enum(4)
254d7fbe77Syulightenyu
264d7fbe77Syulightenyu  def apply(wfiState: UInt, isWFI: Bool, isNormal: Bool, flitpend: Bool, intSrc: UInt): UInt = {
274d7fbe77Syulightenyu    val nextState = MuxCase(wfiState, Array(
284d7fbe77Syulightenyu      (wfiState === sNORMAL && isWFI && isNormal && !intSrc.orR) -> sGCLOCK,
294d7fbe77Syulightenyu      (wfiState === sGCLOCK && intSrc.orR) -> sAWAKE,
30ce80648bSyulightenyu      (wfiState === sGCLOCK && flitpend)   -> sFLITWAKE,
31ce80648bSyulightenyu      (wfiState === sFLITWAKE && ~isWFI)   -> sNORMAL,
324d7fbe77Syulightenyu      (wfiState === sAWAKE && !intSrc.orR) -> sNORMAL
334d7fbe77Syulightenyu    ).toIndexedSeq)
344d7fbe77Syulightenyu
354d7fbe77Syulightenyu    nextState
364d7fbe77Syulightenyu  }
374d7fbe77Syulightenyu}
384d7fbe77Syulightenyu
394d7fbe77Syulightenyu/* Core low power state Update  */
404d7fbe77Syulightenyuobject lpStateNext {
41*814aa9ecSyulightenyu  val sIDLE :: sL2FLUSH :: sWAITWFI :: sEXITCO :: sWAITQ :: sQREQ :: sPOFFREQ :: Nil = Enum(7)
424d7fbe77Syulightenyu
43*814aa9ecSyulightenyu  def apply(lpState: UInt, l2flush: Bool, l2FlushDone: Bool, isWFI: Bool, exitco: Bool, QACTIVE: Bool, QACCEPTn: Bool): UInt = {
444d7fbe77Syulightenyu    val nextState = MuxCase(lpState, Array(
454d7fbe77Syulightenyu      (lpState === sIDLE && l2flush) -> sL2FLUSH,
464d7fbe77Syulightenyu      (lpState === sL2FLUSH && l2FlushDone) -> sWAITWFI,
474d7fbe77Syulightenyu      (lpState === sWAITWFI && isWFI ) -> sEXITCO,
48*814aa9ecSyulightenyu      (lpState === sEXITCO && exitco ) -> sWAITQ,
49*814aa9ecSyulightenyu      (lpState === sWAITQ && !QACTIVE ) -> sQREQ,
50*814aa9ecSyulightenyu      (lpState === sQREQ && !QACCEPTn ) -> sPOFFREQ
514d7fbe77Syulightenyu    ).toIndexedSeq)
524d7fbe77Syulightenyu
534d7fbe77Syulightenyu    nextState
544d7fbe77Syulightenyu  }
554d7fbe77Syulightenyu}
56