【问题标题】:Multiple clock generation [Verilog] [Using fork-join]多时钟生成 [Verilog] [使用 fork-join]
【发布时间】:2017-09-16 19:07:00
【问题描述】:

我生成了以下代码:

module clk_gen();
    reg clk, clk1 , clk2, clk3 , clk4 ;  

always 
    fork 
       #5 clk = ~clk ;
       #1 clk1 = ~clk1 ;
       #3 clk2 = ~clk2 ;
       #4 clk3 = ~clk3 ;
       #3 clk4 = ~clk4 ;
    join


 initial begin
    clk = 1'b0 ;  
    clk1 = 1'b0 ;  
    clk2 = 1'b0 ;  
    clk3 = 1'b0 ;  
    clk4 = 1'b0 ;  
    $monitor ("Time : %0t ,RealTime : %0t ,Clk Value : %0d,Clk1 Value : %0d,Clk2 Value : %0d,Clk3 Value : %0d,Clk4 Value : %0d,$time,$realtime,clk,clk1,clk2,clk3,clk4) ;

    #30 $finish ;
 end

endmodule : clk_gen

我无法使用 fork-join 语句生成时钟。生成的所有时钟都具有相同的频率,即 #5 延迟。

【问题讨论】:

    标签: verilog clock fork-join


    【解决方案1】:

    join 将等待所有线程完成,因此实际上是最长的线程(#5)。这就是为什么所有时钟都以 5 个周期同步的原因。

    那里不需要叉子。只需使用多个 always 语句。

    always 
       #5 clk = ~clk ;
    always
       #1 clk1 = ~clk1 ;
    always    
       #3 clk2 = ~clk2 ;
       ...
    

    您可以像这样使用 fork/join:

    initial begin
        fork
            forever #5 clk = ~clk;
            forever #4 clk1 = ~clk1;
            ...
        join 
     end
    

    这与使用多个初始块相同

     initial forever #5 clk = ~clk;
    

    【讨论】:

    • 我一直在写使用多个always语句。但是想知道是否有一种方法可以仅使用 fork-join 来编写它
    • 可能有一种方法,即您可以在 fork 线程中延迟启动 forever 循环。但是为什么会出现这样的并发症呢?
    • 读到有一种在另一个线程中使用 fork join 的方法。所以自己尝试了,但没有成功。而那个线程现在已经关闭了
    • @NitinSharma 我添加了一个 fork/join 的示例,这可能对我的回答有用
    • 我有一个后续问题。在我的情况下,始终循环如何工作,因为没有提供敏感度列表。当我做“总是@*”时,模拟结果是不同的。总是和总是@(*)有什么区别
    【解决方案2】:

    这种时钟生成方式无法通过任何fork-join 方法(fork-join、fork-join_any、fork-join_none)来完成。

    原因是

    • 使用fork-join,它将等待最长的线程完成,因此周期将等于最长的线程延迟。
    • 使用fork-join_any,它将在第一个最短延迟线程完成后立即完成,但之后它将产生多个线程,因此周期将等于最短线程延迟。
    • 使用fork-join_none,将生成无限线程。

    因此理想的解决方案是为每个时钟制作单独的always 块。

    always #5 clk = ~clk ;
    always #1 clk1 = ~clk1 ;
    always #3 clk2 = ~clk2 ;
    always #4 clk3 = ~clk3 ;
    always #3 clk4 = ~clk4 ;
    

    【讨论】:

    • join_nonejoin_any 在 verilog 中均不可用。这些是system verilog 功能。
    • 是的。我只是在解释他们不会工作。
    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多