首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间-否则语句与Mux语句

时间-否则语句与Mux语句
EN

Stack Overflow用户
提问于 2020-12-03 23:44:12
回答 1查看 90关注 0票数 2

我想知道使用Mux语句与使用when- there语句之间是否有根本的区别?

例如:

代码语言:javascript
复制
    when(read){ 
       dataReg := inValue
    }.otherwise{
       dataReg := 0.U
    }

代码语言:javascript
复制
    dataReg := Mux (read, inValue, 0.U)

他们中的一个应该有什么偏好吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-04 00:47:20

您可以将when-otherwise看作是一个较高级别的构造,它被降为一个或多个MuxesMux对于简单的情况很有用(特别是当您希望代码适合1行时),但是有很多东西更便于用when-otherwise来表达。

例如,可以使用when-otherwiseMux不允许的方便方式表示双向连接。

代码语言:javascript
复制
  val producer_1 = IO(Flipped(Decoupled(UInt(8.W))))
  val producer_2 = IO(Flipped(Decoupled(UInt(8.W))))
  val select = IO(Input(Bool()))
  val consumer = IO(Decoupled(UInt(8.W)))

  when(select) {
    consumer <> producer_1
    producer_2.ready := false.B
  } .otherwise {
    consumer <> producer_2
    producer_1.ready := false.B
  }

这就产生了:

代码语言:javascript
复制
  assign producer_1_ready = select & consumer_ready;
  assign producer_2_ready = select ? 1'h0 : consumer_ready;
  assign consumer_valid = select ? producer_1_valid : producer_2_valid;
  assign consumer_bits = select ? producer_1_bits : producer_2_bits;

(可执行示例链接:https://scastie.scala-lang.org/GVH1zA2MTQ2fhm4yENijbg)

此外,when-otherwise还可用于同时连接多个事物:

代码语言:javascript
复制
  val a   = IO(Input(Bool()))
  val b   = IO(Input(Bool()))
  val foo = IO(Input(UInt(8.W)))
  val bar = IO(Input(UInt(8.W)))
  val out = IO(Output(UInt(8.W)))

  val reg1 = RegInit(0.U(8.W))
  val reg2 = RegInit(0.U(8.W))
  
  out := reg1
  when (a) {
    reg1 := foo
  } .elsewhen (b) {
    reg1 := bar
    reg2 := foo
  } .otherwise {
    out := reg2
  }

(可执行示例链接:https://scastie.scala-lang.org/q9WNZVDoSpufRCyBeukCEg)

请注意,在不同的路径上都有到reg1reg2out的连接,甚至在每个路径中都没有一个连接。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65135886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档