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 ステートメントを受け取ったとき、それがタスクまたは関数の最後にあることをコンパイラーが理解できると思いませんか?? タスクと関数から begin-end を削除すると、驚くほど多くの無駄なコードが削減されます。SystemVerilog でもう 1 ポイント獲得しましょう!

よろしく - Cliff Cummings - Verilog & SystemVerilog Guru

于 2012-06-27T20:47:21.973 に答える
1

SystemVerilog 拡張機能 (IEEE Standard 1800-2009) によると、 内の begin/end はオプションですfunction。ただし、ツールセット (シミュレーターなど) は、2005 年に導入されたこの構文を理解できる必要があります。

于 2012-04-03T23:40:02.767 に答える