мне нужно реализовать блок (поведенческий, чтобы не быть синтезированы), которое либо вызваносамостоятельно срабатывает всегда блокировать с помощью задержки
а) внешний eflag события, или, б) в зависимости от его состояния, в внутреннее событие iflag, запланированное через несколько секунд, в зависимости от того, что наступит раньше.
Мои испытания с использованием оператора задержки (#) приводили к поведению блокировки, например. длинный dt блокировал следующий eflag. Если возможно, я бы избегал dtmax, считая накладные расходы длинным dt.
Работа и предназначена, но, не код:
`timescale 1ns/100fs
`define tick 1.0e-9
parameter real dtmax = 1;
initial iflag=1'b0;
initial toggle=1'b0;
always @(eflag, iflag) begin
// time step control
dt = ...;
iticks = dt/`tick;
toggle = !toggle;
end
//------------------------------------------------------
/*
a) time step counter - working
always #1 begin
iticks = iticks - 1;
if (iticks < 1) begin
iflag = !iflag;
iticks=dtmax/`tick;
end
end
*/
// b) intended
always @(toggle) begin
#(iticks) iflag <= !iflag; // failing, not changing iflag
// #(iticks) iflag = !iflag; // failing, blocking simulation
end
Вы можете попробовать его на edaplayground link
Thx
спасибо за ваш ответ, на самом деле я хотел избавиться от пешеходного стиля декрементации. См. Мой отредактированный код в вопросе. – bardo
Что делать, если вы измените его на iflag <= # (iticks)! Iflag; – Laleh
Можете изменить свой вопрос, чтобы быть более ясным и опубликовать весь свой код, чтобы я мог его отладить. – Laleh