在 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
我知道我们可以在 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