首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Chisel/FIRRTL跨层次的常数传播和优化

Chisel/FIRRTL跨层次的常数传播和优化
EN

Stack Overflow用户
提问于 2017-12-20 03:13:20
回答 1查看 202关注 0票数 1

考虑一个模块,它执行一些简单的算术运算,并由几个参数控制。一个参数控制顶层行为:模块从其模块端口或从其他参数读取其输入。因此,结果要么是动态计算的,要么是在编译(咳嗽、合成)时静态知道的。

正如预期的那样,Chisel生成的Verilog对于此模块的不同风格具有不同的模块名称。对于静态已知结果的情况,有一个模块只有一个输出端口和一组内部导线,这些导线被分配常量,然后实现算法来驱动输出。

是否有可能要求Chisel或FIRRTL进一步彻底优化这一点,即在层次结构的下一层中,只需用其常量和静态已知结果替换实例化的模块?(假设这些常量值应该在合成过程中被优化掉,但也许在复杂的用例中,这种细化时间优化可能是有用的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-20 09:04:45

对于Firrtl目前知道如何常量传播的简单事情,它实际上已经这样做了。问题是,它目前不包含prop算术运算符。我计划在新年前后的Chisel 3.1版本中扩展可以不断传播的运算符。

下面是3.0行为常量传播逻辑AND和MUX的示例。

代码语言:javascript
复制
import chisel3._

class OptChild extends Module {
  val io = IO(new Bundle {
    val a = Input(UInt(32.W))
    val b = Input(UInt(32.W))
    val s = Input(Bool())
    val z = Output(UInt(32.W))
  })

  when (io.s) {
    io.z := io.a & "hffff0000".U
  } .otherwise {
    io.z := io.b & "h0000ffff".U
  }
}

class Optimize extends Module {
  val io = IO(new Bundle {
    val out = Output(UInt())
  })
  val child = Module(new OptChild)
  child.io.a := "hdeadbeef".U
  child.io.b := "hbadcad00".U
  child.io.s := true.B
  io.out := child.io.z

}

object OptimizeTop extends App {
  chisel3.Driver.execute(args, () => new Optimize)
}

发出的Verilog如下所示:

代码语言:javascript
复制
module Optimize(
  input         clock,
  input         reset,
  output [31:0] io_out
);
  assign io_out = 32'hdead0000;
endmodule
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47893734

复制
相关文章

相似问题

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