2012-04-02 2 views
5

Je lis une tierce partie Verilog, et a trouvé ceci:Quel est le but d'un bloc débutant «simple»?

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 

Il semble que les begin et end mots-clés sont redondants ici. Sont-ils? Quelle est leur utilisation?

Répondre

8

Je ne sais pas le cas général, mais dans ce cas précis:

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

Source: Verilog Golden Reference Guide

+0

'commencer/end' n'est plus nécessaire pour un' 'function' ou task' avec plusieurs déclarations dans SystemVerilog. Voir d'autres réponses –

1

Selon l'extension SystemVerilog (norme IEEE 1800-2009), début/fin sont optionnels à l'intérieur d'un function. Cependant, votre jeu d'outils (simulateur, etc.) doit être capable de comprendre cette syntaxe introduite en 2005.

6

Les deux réponses sont correctes. Si la tâche ou la fonction Verilog comportait plusieurs instructions, elles devaient également avoir des instructions begin-end. À partir de SystemVerilog-2005, nous avons supprimé l'obligation de mettre begin-end à l'intérieur de quelque chose qui avait déjà un début-fin. La plupart d'entre nous au comité pensaient qu'il était stupide d'exiger un début de début de quelque chose qui allait déjà avoir une fin de fonction. Je veux dire, viens! Ne pensez-vous pas qu'un compilateur pourrait comprendre que lorsqu'il a reçu l'instruction endtask/endfunction à la fin de la tâche ou de la fonction? Supprimer le début des tâches et des fonctions supprime une quantité surprenante de code inutile. Marquez un autre point pour SystemVerilog!

Cordialement - Cummings Cliff - Verilog & SystemVerilog Guru