考虑一个执行一些简单算术的模块,并由一些参数控制。一个参数控制顶级行为:模块从其模块端口或其他参数读取其输入。因此,结果将被动态计算,或在编译(咳嗽,合成)时静态知道。
Chisel生成的Verilog对于此模块的各种风格具有不同的模块名称,如预期的那样。对于静态已知结果的情况,有一个模块只有一个输出端口和一组内部连线,它们被赋予常量,然后实现算法来驱动该输出。
是否有可能要求Chisel或FIRRTL进一步完全优化它,即在下一级层次结构中,只需用实例和静态已知结果替换实例化模块? (授予这些常数值应该在综合过程中优化掉,但也许有复杂的用例,这种精化时间优化可能很有用)。
答案 0 :(得分:2)
对于Firrtl目前知道如何不断传播的简单事物,它实际上已经做到了这一点。问题是它目前不支持算术运算符。我计划扩展在新年期间预期的Chisel 3.1版本中可以不断传播的操作符。
以下是3.0行为常量传播逻辑AND和MUX的示例。
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看起来像:
module Optimize(
input clock,
input reset,
output [31:0] io_out
);
assign io_out = 32'hdead0000;
endmodule