首页 > 解决方案 > 如何用chisel3生成像“reg [n-1:0] = 90”这样的verilog代码?

问题描述

我使用凿子进行 FPGA 开发,因为 Vivado "reg[n-1:0] = 90" 是有效的。很多模块没有复位输入,所以我不能使用 RegInit。我在谷歌凿子用户论坛上看到了同样的问题,但没有回复。

标签: chisel

解决方案


重置在 Chisel 中是隐含的Module,所有Reg都会有一个重置。然后初始值将在以下代码重置时设置

val myreg = RegInit(90.U((n-1).W))

但是,对于没有复位输入的 FPGA,我们可以使用带有 Verilog“内联”的 BlackBox 生成它,如下所示

class ResetGen extends BlackBox with HasBlackBoxInline {
  val io = IO(new Bundle {
    val clk = Input(Clock())
    val rst = Output(Bool())
  })

  setInline("ResetGen.v",
    s"""
    |module ResetGen(
    |    input clk,
    |    output rst
    |);
    |
    |reg reset_reg = 0;
    |reg [7:0] reset_dly_cnt = 0;
    |always@(posedge clk) begin
    |  if(reset_dly_cnt < 8'hff)
    |      reset_dly_cnt <= reset_dly_cnt + 1'b1;
    |  else
    |      reset_reg <= 1;
    |end
    |
    |assign rst = !reset_reg;
    |endmodule
    """.stripMargin)
}

然后在您的 Top 中添加连接:

class TopMyModule extends RawModule {
  val gclk = IO(Input(Clock()))
//...
  /* Generate the reset pulse */
  val rst = Wire(Bool())
  val rstgen = Module(new ResetGen())
  rstgen.io.clk := gclk
  rst := rstgen.io.rst

  /* Wrap all in gclk, rst domain */
  withClockAndReset(gclk, rst) {
      val myreg = RegInit(90.U((n-1).W))
//..

myregrst当信号为 1时将初始化为 90 。


推荐阅读