You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Chisel中禁用`ifdef FIRRTL_BEFORE_INITIAL`宏?

如何禁用Chisel/Firrtl生成的冗余初始化宏代码?

问题描述

我在使用Chisel生成SystemVerilog代码时,得到了大量冗余的初始化宏代码:

`ifdef ENABLE_INITIAL_REG_
    `ifdef FIRRTL_BEFORE_INITIAL
      `FIRRTL_BEFORE_INITIAL
    `endif // FIRRTL_BEFORE_INITIAL
    initial begin
      automatic logic [31:0] _RANDOM[0:0];
      `ifdef INIT_RANDOM_PROLOG_
        `INIT_RANDOM_PROLOG_
      `endif // INIT_RANDOM_PROLOG_
      `ifdef RANDOMIZE_REG_INIT
        _RANDOM[/*Zero width*/ 1'b0] = `RANDOM;
        shifter_0 = _RANDOM[/*Zero width*/ 1'b0][1:0];
        shifter_1 = _RANDOM[/*Zero width*/ 1'b0][3:2];
        shifter_2 = _RANDOM[/*Zero width*/ 1'b0][5:4];
      `endif // RANDOMIZE_REG_INIT
      if (reset) begin
        shifter_0 = 2'h0;
        shifter_1 = 2'h0;
        shifter_2 = 2'h0;
      end
    end // initial

当前使用的生成参数如下:

ChiselStage.emitSystemVerilog(
      gen = new top(0.U(2.W), 3),
      firtoolOpts = Array(
        "-disable-all-randomization",
        "-strip-debug-info",
        "-o",
        folderPath.toString + "/top.sv"
      )
    )

请问有没有方法禁用这些宏,生成更简洁的代码?

解决方案

你需要添加两个关键的firtool选项来彻底移除这些冗余代码:

  • 添加-no-initial:直接禁止生成所有initial块,从根源上消除包含宏的初始化代码框架
  • 添加-disable-initialization:配合已有选项,彻底关闭寄存器初始化相关的逻辑生成

修改后的生成参数代码如下:

ChiselStage.emitSystemVerilog(
      gen = new top(0.U(2.W), 3),
      firtoolOpts = Array(
        "-disable-all-randomization",
        "-disable-initialization",
        "-no-initial",
        "-strip-debug-info",
        "-o",
        folderPath.toString + "/top.sv"
      )
    )

选项说明

  • -no-initial:移除所有生成的initial块,直接去掉冗余的宏包裹代码
  • -disable-initialization:禁止生成任何寄存器初始化逻辑,包括复位初始化相关的宏定义
  • 原有的-disable-all-randomization仅关闭随机初始化,需要前两个选项配合才能完全清除初始化相关的冗余代码

修改后生成的SystemVerilog代码将不再包含这些冗余的宏和初始化块,代码结构会更简洁。

内容的提问来源于stack exchange,提问作者Саша Коваленко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:43:24