在 Verilog 中定义 void 函数?

Defining void function in Verilog?

我知道我们可以在 verilog 中编写函数来显示某事。如下例所示:

function ex_func;
    input op;
    input [1:0] in1;
    input [1:0] in2;
    input [1:0] out1;
    begin
        if(op)
            $display("%d <-- %d, %d", out1, in1, in2);
        else 
            $display("%d --> %d, %d", out1, in1, in2);
            
        ex_func = 0;
    end
endfunction

但是我不能把它写成 void(不是 returning 一个值),所以如果不等同于一个不必要的临时变量就不能使用。我可以用丑陋的方式使用:

// ...

reg temp; // temporary variable required for the function to work

initial begin
// ...

temp = ex_func(op[0], in1[0], in2[0], out1[0]);
#10;

// ...

temp = ex_func(op[1], in1[1], in2[1], out1[1]);
#10;

// ...
end

这完美无缺,但正如我所说,我想编写一个没有 return 值 (void) 的函数,并摆脱这些丑陋的东西。似乎 SystemVerilog 支持 void definition: https://verificationguide.com/systemverilog/systemverilog-functions/#Void_function ,但相同的语法不适用于 Verilog(“错误:'void' 是未知类型”)并且我在 Verilog 中找不到任何其他方式或文档。

所以,问题是:有没有办法在 Verilog 中定义 void 函数?

对于您的情况,我会使用任务而不是函数,因为您使用它仅显示信息。

task ex_task;
    input op;
    input [1:0] in1;
    input [1:0] in2;
    input [1:0] out1;
    begin
        if(op)
            $display("%d <-- %d, %d", out1, in1, in2);
        else 
            $display("%d --> %d, %d", out1, in1, in2);
    end
endtask

然后你会如你所愿调用任务:

ex_task(op[0], in1[0], in2[0], out1[0]);

你甚至可以在任务本身添加延迟,这是功能和任务之间的另一个区别。

task ex_task;
    input op;
    input [1:0] in1;
    input [1:0] in2;
    input [1:0] out1;
    begin
        if(op)
            $display("%d <-- %d, %d", out1, in1, in2);
        else 
            $display("%d --> %d, %d", out1, in1, in2);
        #10;
    end
endtask