【问题标题】:Can I pass a clock signal as an input argument in a Verilog task?我可以在 Verilog 任务中将时钟信号作为输入参数传递吗?
【发布时间】:2015-04-10 04:19:49
【问题描述】:

我在 VCS(G-2012.09) 中编写了一个测试平台来验证一个 SPI 模块。

这是从 SPI 主机获取字节的任务:

task get_byte;
begin
    repeat(8) @(posedge spck)
    begin
        if (spss == 1'b0)
            tmp = {tmp[6:0], mosi};
    end
    $display ("[Time:%dns]---->Get a byte: 0x%h", $stime, tmp);
end
endtask

它有效。然后我想参数化这个任务并将代码替换为:

task get_byte;
    input clk, oen, din;
    output [7:0] byte;
begin
    byte = 8'd0;
    repeat(8) @(posedge clk)
    begin
        if (oen == 1'b0)
            byte = {byte[6:0], din};
    end
    $display ("[Time:%dns]---->Get a byte: 0x%h", $stime, byte);
end
endtask

但是当我使用 get_byte(spck, spss, mosi, tmp) 调用任务并在 VCS 中运行测试平台时,它卡住了。 spck 似乎没有通过在此任务中作为 clk 工作。

那么有没有规定时钟信号不能用作任务中的输入参数,还是我做错了什么?

【问题讨论】:

    标签: arguments task verilog clock


    【解决方案1】:

    在旧的 stackoverflow 问题之一中,您可以找到以下answer

    在 Verilog 中,参数按值传递给任务。这意味着clock 的值将在任务调用的生命周期内固定。您的任务永远不会找到clock 中的posedge,并且会一直等待。

    所以答案是:您可以使用clk 作为任务的输入参数,但它不能用作“标准”时钟。

    【讨论】:

      【解决方案2】:

      如果您将任务声明为 automatic 并通过引用传递输入(使用 ref 关键字而不是 input 任务端口定义中的关键字)

      【讨论】:

        【解决方案3】:

        使用时钟而不将其声明为输入,就像您在第一个任务中所做的那样。通过引用传递也不起作用,因为任务会在任务结束时尝试设置时钟信号,模拟器会抛出错误。

        您可能希望有几个任务引用不同的 clk 名称,即:

        get_byte_spclk(...)
        get_byte_clk(...)
        

        【讨论】:

          【解决方案4】:

          正如邱所说,这行不通。 但是,您可以做一招。 看下面的代码:

          task my_task;
          @(posedge testbench.name_of_the_signal_you_want_to_use_as_refernce)
          Do something here
          endtask
          

          所以你基本上必须给时钟信号提供路径,就像这样:

          testbech.instance_of_instantiated_module.clock_signal_name

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-04-10
            • 1970-01-01
            • 2023-04-01
            • 2012-04-22
            • 2015-12-29
            • 1970-01-01
            • 2021-02-02
            • 2017-09-19
            相关资源
            最近更新 更多