Как кодировать асинхронный сброс в долоте

Как добавить сигнал сброса в список чувствительности в сгенерированном коде Verilog при написании кода Чизеля, например код ниже для D триггера:

val x = Reg(init = UInt(0, width = 1))
    x := io.D
    io.Q := x 

сгенерирует код Verilog так:

always @(posedge clk) begin
    if(reset) begin
      x <= 1'h0;
    end else begin
      x <= io_D;
    end
end

Как видно, сброс происходит синхронно с часами, как кодировать долото, чтобы сгенерировать что-то вроде этого:

always @(posedge clk or posedge reset) begin
    if(reset) begin
      x <= 1'h0;
    end else begin
      x <= io_D;
    end
end

где сигнал сброса находится в списке чувствительности и, следовательно, асинхронный.

Редактировать: Как указано в chrisvp, здесь есть еще один вопрос и обсуждение в группе Google для пользователей зубил здесь.

1 ответ

Решение

Этот вопрос является копией Как создать Verilog асинхронного сброса всегда блоки с долотом

Если действительно необходимо, вы можете рассмотреть возможность форсирования этого, рассматривая первый в качестве второго тактового домена, как описано в руководстве по долотам, хотя я бы не рекомендовал это делать.

Начиная с Chisel 3.2.0, поддерживается асинхронный сброс. Пример кода может быть реализован следующим образом:

import chisel3._
import chisel3.stage.ChiselStage

class Foo extends RawModule {
  val clk   = IO(Input(Clock()))
  val reset = IO(Input(AsyncReset()))
  val io    = IO(Input(new Bundle{ val D = UInt(1.W) }))
  val out   = IO(Output(Bool()))

  val x = withClockAndReset(clk, reset) { RegNext(io.D, init=0.U) }
  out := x
}

Затем это создаст следующую логику Verilog для регистра x:

always @(posedge clk or posedge reset) begin
  if (reset) begin
    x <= 1'h0;
  end else begin
    x <= io_D;
  end
end

Чтобы использовать синхронный сброс, измените тип reset из AsyncReset к Bool.

Другие вопросы по тегам