gpt4 book ai didi

vhdl - Verilog 相当于 "wait until ... for ..."?

转载 作者:行者123 更新时间:2023-12-04 04:18:16 25 4
gpt4 key购买 nike

在 Verilog 测试平台中,我正在尝试编写以下行为:

  • 等待事件发生(上升沿/下降沿)最长时间,即相当于 VHDL 指令:
    wait until <event> for <duration>;

  • 它具有以下行为(提醒):
  • 事件发生;
  • 或期限届满。

  • 除非我弄错了,否则我在 Verilog 中没有找到此函数的任何直接等效项……所以我尝试了以下代码:
    reg watchdog;
    // ...

    // Set a signal 'watchdog' in background which will be triggered in 10 us.
    fork
    watchdog <= #10_000 1'b1;
    join

    // Wait until SIGNAL is set to '1' *OR* watchdog event occurs.
    @(posedge SIGNAL or posedge watchdog);

    // Reset the watchdog
    watchdog <= 1'b0;

    这段代码可以工作,但最后一条指令不会取消或取代 fork操作说明。因此,在第二次调用此代码时(例如 watchdog <= #50_000 1'b1; ),第一个 watchdog可能会被触发(不幸的是太快了)。

    有更好的主意吗? (是否等效或取消第一个计划 fork 的方法?)

    P-S:在 SystemVerilog 中执行此操作不是一种选择... ;-)

    最佳答案

    要在 Verilog 中执行此操作,您需要使用 disable .我建议摆脱 watchdog完全发出信号,仅使用 fork 的两个分支.

    下面是一个工作示例。请注意,fork 的每个分支调用 disable f如果该分支成功。禁用 fork 将终止未成功的分支。

    module top;

    reg signal;

    task test();
    fork : f
    begin
    // Timeout check
    #10
    $display("%t : timeout", $time);
    disable f;
    end
    begin
    // Wait on signal
    @(posedge signal);
    $display("%t : posedge signal", $time);
    disable f;
    end
    join
    endtask

    initial begin
    // test signal before timeout
    fork
    test;
    begin
    signal = 0;
    #5;
    signal = 1;
    #5;
    signal = 0;
    #10;
    end
    join
    // test signal after timeout
    fork
    test;
    begin
    signal = 0;
    #15;
    signal = 1;
    #5;
    end
    join
    end

    关于vhdl - Verilog 相当于 "wait until ... for ..."?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12370324/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com