【问题标题】:How to generate verilog code like "reg[n-1:0] = 90" with chisel3?如何使用 chisel3 生成类似“reg[n-1:0] = 90”的verilog代码?
【发布时间】:2021-09-01 01:45:49
【问题描述】:

我使用chisel进行FPGA开发,因为Vivado“reg[n-1:0] = 90”是有效的。很多模块没有复位输入,所以我不能使用RegInit。 我在google chisel-users forum看到了同样的问题,但没有回复。

【问题讨论】:

    标签: chisel


    【解决方案1】:

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

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

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

    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))
    //..
    

    rst 信号为 1 时,myreg 将被初始化为 90。

    【讨论】:

    • 我的意思是在verilog中声明时的初始reg。不是子词分配。
    • 谢谢,我找到了朋友表格 gitter 的答案。本质上,您需要:extend Module with RequireAsyncReset 注释重置:annotate(new ChiselAnnotation { override def toFirrtl = PresetAnnotation(reset.toTarget) }) 之后,您的所有RegInit(...) 寄存器将按照您希望的方式进行初始化
    • 好的,你能详细解释一下你的问题吗?
    • 链接到 Gitter 线程 (gitter.im/freechipsproject/chisel3?at=612ef0168065e87a8ebb7dc4) 但如果您可以将其转换为下面的完整答案,它仍然会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多