【发布时间】:2021-09-01 01:45:49
【问题描述】:
我使用chisel进行FPGA开发,因为Vivado“reg[n-1:0] = 90”是有效的。很多模块没有复位输入,所以我不能使用RegInit。 我在google chisel-users forum看到了同样的问题,但没有回复。
【问题讨论】:
标签: chisel
我使用chisel进行FPGA开发,因为Vivado“reg[n-1:0] = 90”是有效的。很多模块没有复位输入,所以我不能使用RegInit。 我在google chisel-users forum看到了同样的问题,但没有回复。
【问题讨论】:
标签: chisel
重置在 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。
【讨论】:
extend Module with RequireAsyncReset 注释重置:annotate(new ChiselAnnotation { override def toFirrtl = PresetAnnotation(reset.toTarget) }) 之后,您的所有RegInit(...) 寄存器将按照您希望的方式进行初始化