2012-04-02 5 views
5

私はいくつかのサードパーティのVerilogを読み取り、これを見つけたよ:「プレーンな」begin-endブロックのポイントは何ですか?

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 

beginendキーワードはここで重複しているようです。彼らは?彼らの使用は何ですか?

答えて

8

私は一般的なケースについて知っているが、この特定のケースではありません:

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

が出典:Verilog Golden Reference Guide

+0

は、 '始める/ end'はもはやSystemVerilogの中に複数のステートメントを持つ' function'または 'task'のために必要とされません。他の答えを見てください。 –

1

SystemVerilogの拡張(IEEE規格1800から2009)によると、開始/終了functionの中ではオプションです。しかし、あなたのツールセット(シミュレータなど)は、2005年に導入されたこの構文を理解できなければなりません。

6

両方の答えは正しいです。 Verilogのタスクまたは関数に複数のステートメントが含まれている場合は、begin-endステートメントも必要です。 SystemVerilog-2005以降、begin-endを既に持っているものの中にbegin-endを入れるという要件を取り除きました。委員会の私たちの大部分は、すでにendfunction/endtaskを持つ予定のものの中にbegin-end insideを必要とするのは愚かだと考えました。私は、来ることを意味します!コンパイラは、タスクや関数の終わりにあるendtask/endfunction文を取得したときにそれを理解できると思いませんか?タスクや関数からbegin-endを削除すると、驚くほど無駄なコードが削除されます。 SystemVerilogの別のポイントを獲得してください!

よろしく - クリフ・カミングス - Verilogの& SystemVerilogの達人