考虑一个模块,它执行一些简单的算术运算,并由几个参数控制。一个参数控制顶层行为:模块从其模块端口或从其他参数读取其输入。因此,结果要么是动态计算的,要么是在编译(咳嗽、合成)时静态知道的。
正如预期的那样,Chisel生成的Verilog对于此模块的不同风格具有不同的模块名称。对于静态已知结果的情况,有一个模块只有一个输出端口和一组内部导线,这些导线被分配常量,然后实现算法来驱动输出。
是否有可能要求Chisel或FIRRTL进一步彻底优化这一点,即在层次结构的下一层中,只需用其常量和静态已知结果替换实例化的模块?(假设这些常量值应该在合成过程中被优化掉,但也许在复杂的用例中,这种细化时间优化可能是有用的)。
发布于 2017-12-20 09:04:45
对于Firrtl目前知道如何常量传播的简单事情,它实际上已经这样做了。问题是,它目前不包含prop算术运算符。我计划在新年前后的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;
endmodulehttps://stackoverflow.com/questions/47893734
复制相似问题