2012-04-02 10 views
5

Czytam niektóre osoby trzeciej Verilog, i znalazłem to:Jaki jest sens "prostego" bloku początkowego?

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 

Wydaje się, że begin i end słowa kluczowe są tu zbędne. Czy oni są? Jakie są ich zastosowania?

Odpowiedz

8

nie wiem o ogólnym przypadku, ale w tym konkretnym przypadku:

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

Źródło: Verilog Golden Reference Guide

+0

'rozpocząć/end' nie jest już wymagane dla' 'task' zakresie funkcji lub z wielu wypowiedzi w SystemVerilog. Zobacz inne odpowiedzi. –

1

Zgodnie z rozszerzeniem SystemVerilog (standard IEEE 1800-2009), rozpoczęcia/zakończenia są opcjonalne wewnątrz function. Jednak Twój zestaw narzędzi (symulator, itp.) Musi być w stanie zrozumieć tę składnię, która została wprowadzona w 2005 roku.

6

Obie odpowiedzi są poprawne. Jeśli zadanie lub funkcja Verilog zawierał wiele instrukcji, wymagane były również instrukcje na początku. Zaczynając od SystemVerilog-2005, usunęliśmy wymóg umieszczenia początku-końca wewnątrz czegoś, co już miało początek. Większość z nas w komisji uważała, że ​​głupotą jest wymagać od początku czegoś wewnątrz czegoś, co już miało mieć funkcję endfunction/endtask. Daj spokój! Nie sądzisz, że kompilator może dowiedzieć się, że kiedy dostał instrukcję endtask/endfunction, że był na końcu zadania lub funkcji? Usunięcie początkującego z zadań i funkcji wycina zaskakującą ilość bezużytecznego kodu. Zdobądź kolejny punkt dla SystemVerilog!

Pozdrawiam - Cliff Cummings - Verilog & SystemVerilog Guru