Как кодировать асинхронный сброс в долоте
Как добавить сигнал сброса в список чувствительности в сгенерированном коде 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
.