我可以在Verilog任务中传递时钟信号作为输入参数吗?

Mr.*_*hou 1 arguments verilog clock task

我在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
Run Code Online (Sandbox Code Playgroud)

有用.然后我想参数化这个任务并用以下代码替换代码:

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
Run Code Online (Sandbox Code Playgroud)

但是当我用get_byte(spck, spss, mosi, tmp)VCS 调用任务并运行测试平台时,它就停止了.似乎spck没有通过clk这项任务的内部工作.

那么有一个规则,即时钟信号不能用作任务中的输入参数,或者我做错了什么?

Qiu*_*Qiu 6

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

在Verilog中,参数按值传递给任务.这意味着clock将在任务调用的生命周期中固定值.你的任务将永远找不到posedgeclock,而且会永远等待.

所以答案是:你可以clk用作任务的输入参数,但它不能作为"标准"时钟工作.