使用任务在verilog中生成可变时钟

时间:2015-01-21 05:42:39

标签: verilog clock

我已经使用以下代码生成时钟(我通过任务创建该频率的任何值),但代码仅在我使用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

1 个答案:

答案 0 :(得分:2)

这个解决方案感觉像是一个讨厌的黑客,但我认为达到了要求。更改时钟频率时,它将在下一个边沿发生变化,但允许@(posedge clk)用于要更改它的边缘。在正边缘之后,变化实际上是1ns

通常情况下,您可以设置频率并使其在边缘生效,从而提供完整的设置周期。

Timing Diagram

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的工作副本。

相关问题