【问题标题】:How to phase clock in system-verilog?如何在 system-verilog 中调整时钟相位?
【发布时间】:2019-07-25 13:10:41
【问题描述】:

在 System-verilog 中,可以通过以下代码初始化时钟并使其滴答作响:

bit clk;
initial begin
    clk <= 0;
end

always #CLOCK_SEMI_PERIOD begin
    clk <= ~clk;
end

但是如果我想让时钟在某个阶段滴答作响呢?例如,我们有两个时钟,具有不同的半周期,我希望第一个时钟从零开始计时,而第二个时钟从 $urandom_range(6)ns 开始计时。

         ___     ___     ___     ___     
clk1 ___|   |___|   |___|   |___|   |___   
           ____      ____      ____      
clk2 _____|    |____|    |____|    |____ 

我不能只写这样的东西:

module top(output bit clk1,clk2);
    parameter CLOCK1_SEMI_PERIOD = 10;
    parameter CLOCK2_SEMI_PERIOD = 13;
    int phase;
    initial begin
        clk1 <= 0;
        clk2 <= 0;
        phase = $urandom_range(9);
    end
    always #(CLOCK1_SEMI_PERIOD) begin
        clk1 <= ~clk1;
    end
    always #(CLOCK2_SEMI_PERIOD) begin
        #phase;
        clk2 <= ~clk2;
    end
endmodule

因为它会将第二个时钟周期增加phase ns。
那么我该如何实现这种滴答声呢?

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    使用initial/forever 循环

    initial begin
            clk1 <= 0;
            clk2 <= 0;
            phase = $urandom_range(9);
            fork
               forever #(CLOCK1_SEMI_PERIOD) 
                  clk1 <= ~clk1;
               #phase forever #(CLOCK2_SEMI_PERIOD) 
                  clk2 <= ~clk2;
           join
    end
    

    【讨论】:

      【解决方案2】:

      assignment skew 概念也可用于引入所需阶段,

      module top(output bit clk1,clk2);
      parameter CLOCK1_SEMI_PERIOD = 10;
      parameter CLOCK2_SEMI_PERIOD = 13;
      int phase;
      
      reg  temp_1_clk2;//Added
      wire temp_2_clk2;//Added
      
      initial begin
          clk1 <= 0;
          clk2 <= 0;
          phase           = $urandom_range(9);
          temp_1_clk2 = 0;
      end
      always #(CLOCK1_SEMI_PERIOD) begin
          clk1 <= ~clk1;
      end
      always #(CLOCK2_SEMI_PERIOD) begin
          temp_1_clk2 <= ~ temp_1_clk2;
      end
      
      assign #(phase) temp_2_clk2  =  temp_1_clk2;//Introduces the required phase
      
      always @(temp_2_clk2) begin //Output the clock
           clk2 = ~ temp_2_clk2;
      end
      endmodule
      

      如果上述代码有任何复杂之处,或者是否可以进行任何优化,请告诉我

      谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 1970-01-01
        • 2021-11-29
        相关资源
        最近更新 更多