我正在阅读一些第三方Verilog,并发现了这个:
function [31:0] factorial;
input [3:0] operand;
reg [3:0] index;
begin
factorial = operand ? 1 : 0;
for(index = 2; index <= operand; index = index + 1)
factorial = index * factorial;
end
endfunction
begin
和end
关键字似乎在这里是多余的。是吗?它们的用途是什么?
答案 0 :(得分:8)
我不知道一般情况,但在这个特定情况下:
If a function contains more than one statement, the statements must be
enclosed in a begin-end or fork-join block.
答案 1 :(得分:6)
两个答案都是正确的。如果Verilog任务或函数有多个语句,则还要求它们具有begin-end语句。从SystemVerilog-2005开始,我们删除了将begin-end放在已经有一个开始端的东西的要求。我们委员会中的大多数人都认为要求一个已经具有endfunction / endtask的东西的开端内容是愚蠢的。我的意思是,来吧!难道你不认为编译器可以弄清楚当它得到endtask / endfunction语句时它是在任务或函数的末尾?从任务和函数中删除开头可以减少大量无用的代码。为SystemVerilog评分另一点!
问候 - Cliff Cummings - Verilog&amp; SystemVerilog Guru
答案 2 :(得分:1)
根据SystemVerilog扩展(IEEE标准1800-2009),function
内的开始/结束是可选的。但是,您的工具集(模拟器等)必须能够理解2005年引入的语法。