У меня есть следующий Код:
`timescale 1ps / 1ps
module tb;
localparam t_CLOCK_PERIOD = 1000;
bit clk;
bit clk_del;
always #(t_CLOCK_PERIOD/2) clk = ~clk;
assign #490 clk_del = clk;// clk_del toggling normally
//assign #510 clk_del = clk;// clk_del not toggling
initial begin
clk =1'b1;
$display("waiting for Clock delayed");
@(posedge clk_del);
$display("Clock delayed");
$finish;
end
endmodule
Я пытаюсь задержать тактовый сигнал, но когда я делаю это более чем на половину периода, сигнал остается неназначенным (он не переключается).
Что я делаю неправильно? Как я могу задержать этот сигнал более чем на половину периода?
Ваш оператор clk_del
assign не работает с задержкой 510, потому что RHS (clk) изменяется быстрее, чем задержка. Это похоже на то, что вы всегда сэмплируете clk, когда он равен 0. Оператор assign сбивает с толку, и это неправильный способ генерации двух связанных тактовых сигналов.
Вы можете управлять соотношением фаз между двумя часами, используя начальную задержку для часов с задержкой. Этот подход более традиционен и его легче понять:
always #(t_CLOCK_PERIOD/2) clk = ~clk;
initial begin
clk_del = 1;
#10;
forever #(t_CLOCK_PERIOD/2) clk_del = ~clk_del;
end
Изменяя начальное значение clk_del
и начальное значение задержки, вы можете добиться любого желаемого фазового соотношения.
Как указывает инструмент, проблема связана с изменением clk
до задержки назначения.
Эта проблема не зависит от тактового сигнала и может возникнуть и при передаче сигналов данных. Подробное объяснение использования задержек в verilog можно найти здесь.
Правильное решение моей проблемы состояло в том, чтобы изменить
assign #510 clk_del = clk;
к
always @(clk) clk_del <= #510 clk;