如何使用Chisel3生成类似reg[n-1:0] = 90的无复位初始化Verilog代码
Chisel3无复位寄存器初始值实现方案
在Chisel3中可以不依赖复位信号实现Verilog reg[n-1:0] = 90 这类寄存器初始值定义,对应初始值会直接写入FPGA比特流,和Verilog原生写法行为完全一致,有两种常用实现方式:
方案1:使用底层RegMake接口
这是最直接的无复位寄存器初始值实现方式,不会生成任何复位逻辑:
import chisel3._ import chisel3.util.RegMake val n = 8 // 可自定义位宽 val targetReg = RegMake( tpe = UInt(n.W), init = Some(90.U(n.W)), // 指定初始值 clock = None, // 继承当前作用域时钟 reset = None // 不关联任何复位信号 )
上述代码生成的Verilog会直接输出 reg [7:0] targetReg = 90;,完全匹配原生Verilog写法的效果。
方案2:给普通寄存器添加初始值注解
如果已经定义了无复位的普通Reg,可以通过注解的方式追加初始值:
import chisel3._ import chisel3.experimental.{annotate, ChiselAnnotation} import firrtl.annotations.MemoryScalarInitAnnotation val n = 8 val targetReg = Reg(UInt(n.W)) // 给寄存器添加初始值注解 annotate(new ChiselAnnotation { override def toFirrtl = MemoryScalarInitAnnotation(targetReg.toTarget, 90) })
这种方式不会修改寄存器的复位逻辑,仅在Verilog生成阶段追加初始值定义,Vivado等FPGA工具可以正常识别该初始值并写入比特流。
注意事项
- 两种方案生成的初始值仅在FPGA加载比特流时生效,运行过程中寄存器被赋值后不会自动回到初始值,和Verilog原生写法行为完全一致
- 不需要对现有模块的端口做任何修改,不需要新增复位信号
内容的提问来源于stack exchange,提问作者cobb
相关产品推荐
相关产品推荐

