6

我正在阅读一些第三方 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

看来beginandend关键字在这里是多余的。他们是吗?它们的用途是什么?

4

3 回答 3

8

我不知道一般情况,但在这种特殊情况下:

If a function contains more than one statement, the statements must be
enclosed in a begin-end or fork-join block. 

资料来源:Verilog 黄金参考指南

于 2012-04-02T16:02:56.877 回答
7

两个答案都是正确的。如果 Verilog 任务或函数有多个语句,它们也需要有 begin-end 语句。从 SystemVerilog-2005 开始,我们删除了将 begin-end 放在已经有 begin-end 的东西中的要求。我们委员会中的大多数人都认为在已经具有 endfunction/endtask 的东西中要求一个 begin-end 是愚蠢的。我的意思是,来吧!难道你不认为编译器可以弄清楚当它得到 endtask/endfunction 语句时,它是在任务或函数的末尾吗?从任务和函数中删除开始端会减少大量无用的代码。为 SystemVerilog 再添一分!

问候 - Cliff Cummings - Verilog 和 SystemVerilog 大师

于 2012-06-27T20:47:21.973 回答
1

根据 SystemVerilog 扩展(IEEE 标准 1800-2009),开始/结束在function. 但是,您的工具集(模拟器等)必须能够理解这种在 2005 年引入的语法。

于 2012-04-03T23:40:02.767 回答