2012-04-02 13 views
5

lese ich einige Dritten Verilog, und dies gefunden:Was ist der Sinn eines "einfachen" Anfangsblocks?

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 

Es scheint, dass die begin und end Stichworte sind hier überflüssig. Sind sie? Was ist ihre Verwendung?

Antwort

8

Ich weiß nicht, über den allgemeinen Fall, aber in diesem speziellen Fall:

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

Quelle: Verilog Golden Reference Guide

+0

'begin/end' nicht mehr erforderlich ist für eine' function' oder 'task' mit mehreren Anweisungen in SystemVerilog. Siehe andere Antworten. –

1

Nach der SystemVerilog-Erweiterung (IEEE-Standard 1800-2009), Beginn/Ende sind optional in einem function. Ihr Toolset (Simulator usw.) muss jedoch in der Lage sein, diese 2005 eingeführte Syntax zu verstehen.

6

Beide Antworten sind korrekt. Wenn die Verilog-Task oder -Funktion mehrere Anweisungen hatte, mussten sie auch Anfangs- und Endanweisungen haben. In SystemVerilog-2005 haben wir die Anforderung entfernt, das Anfangselement in etwas einzufügen, das bereits einen Anfangspunkt hatte. Die meisten von uns im Komitee dachten, es sei albern, einen Anfang in etwas zu verlangen, das bereits eine Endfunktion/Endtask hatte. Ich meine, komm schon! Glaubst du nicht, dass ein Compiler herausfinden könnte, dass wenn er die endtask/endfunction-Anweisung hatte, dass er am Ende der Aufgabe oder Funktion war? Durch das Entfernen des Beginns von Aufgaben und Funktionen wird überraschend viel nutzloser Code entfernt. Erzielen Sie einen anderen Punkt für SystemVerilog!

Grüße - Cliff Cummings - Verilog & SystemVerilog Guru