2012-04-02 20 views
5

Sto leggendo alcuni terzi Verilog, e ho trovato questo:Qual è il punto di un blocco iniziale "normale"?

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 

Sembra che i begin e end parole chiave sono ridondanti qui. Sono loro? Qual è il loro uso?

risposta

8

Non so circa il caso generale, ma in questo caso specifico:

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

Fonte: Verilog Golden Reference Guide

+0

'iniziare/FINE' non è più necessaria per un' 'function' o task' con più istruzioni in SystemVerilog. Vedi altre risposte. –

1

Secondo l'estensione SystemVerilog (standard IEEE 1800-2009), comincio/fine sono opzionali all'interno di un function. Tuttavia, il set di strumenti (simulatore, etc.) deve essere in grado di comprendere questa sintassi, che è stato introdotto nel 2005.

6

Entrambe le risposte sono corrette. Se l'attività o la funzione Verilog aveva più istruzioni, era necessario anche che avessero istruzioni di inizio-fine. A partire dal SystemVerilog del 2005, abbiamo rimosso l'obbligo di mettere cominciare-end all'interno di qualcosa che già ha avuto un inizio-end. La maggior parte di noi nel comitato pensano che sia stupido da richiedere un inizio-end all'interno di qualcosa che già sta per avere endfunction/EndTask. Voglio dire, vieni! Non pensi che un compilatore riusciva a capire che quando ha ottenuto la dichiarazione EndTask/endfunction che era alla fine della attività o funzione ?? Rimuovendo l'inizio-fine da attività e funzioni si elimina una quantità sorprendente di codice inutile. Ottieni un altro punto per SystemVerilog!

Saluti - Scogliera Cummings - Verilog & SystemVerilog Guru