我已经使用以下代码生成时钟(我通过任务创建该频率的任何值),但代码仅在我使用CLKSEL_global = clksel_local
(即阻塞分配)时才有效,但会产生增量延迟。 / p>
如何在不引入delta延迟的情况下生成可变时钟?是他们使用任务的另一种方式。我正在使用任务,以便我可以传递实际值
`timescale 1ns/1ps
module tb();
real CLKSEL_global;
reg CLK7;
new dut(clk,clk_out);
task task_CLOCK;
input real clksel_local;
begin
CLKSEL_global = clksel_local;
end
endtask
initial begin
CLK7 = 0;
forever begin
#(500.0/CLKSEL_global) CLK7 = 1;
#(500.0/CLKSEL_global) CLK7 = 0;
end
end
initial begin
task_CLOCK(340.0);
end
initial begin
#100 $finish ;
end
endmodule
答案 0 :(得分:2)
这个解决方案感觉像是一个讨厌的黑客,但我认为达到了要求。更改时钟频率时,它将在下一个边沿发生变化,但允许@(posedge clk)
用于要更改它的边缘。在正边缘之后,变化实际上是1ns
。
通常情况下,您可以设置频率并使其在边缘生效,从而提供完整的设置周期。
module tb();
real CLKSEL_global = 500;
reg clk;
task task_CLOCK;
input real clksel_local;
begin
CLKSEL_global <= clksel_local;
end
endtask
initial begin
#1ns;
clk = 1'b0;
forever begin
#((500.0ns/CLKSEL_global) -1ns) clk = ~clk;
end
end
initial begin
$dumpfile("dump.vcd"); $dumpvars;
task_CLOCK(1);
repeat(2)
@(posedge clk);
task_CLOCK(2);
repeat(2)
@(posedge clk);
$finish ;
end
endmodule
上述EDA Playground的工作副本。