2012-04-02 9 views
5

estoy leyendo un tercero Verilog, y encontramos que:¿Cuál es el sentido de un bloque inicial "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 

Parece que los begin y end palabras clave son redundantes aquí. ¿Son ellos? ¿Cuál es su uso?

Respuesta

8

No sé sobre el caso general, pero en este caso concreto:

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

Fuente: Verilog Golden Reference Guide

+0

'begin/end' ya no es necesario para un' 'function' o task' con múltiples declaraciones en SystemVerilog. Ver otras respuestas –

1

De acuerdo con la extensión SystemVerilog (Norma IEEE 1800-2009), comienzo/fin son opcionales dentro de un function. Sin embargo, su conjunto de herramientas (simulador, etc.) debe ser capaz de comprender esta sintaxis, que se introdujo en 2005.

6

Ambas respuestas son correctas. Si la tarea o función Verilog tenía varias declaraciones, también se requería que tuvieran estados de inicio y fin. Comenzando en SystemVerilog-2005, eliminamos el requisito de poner begin-end dentro de algo que ya tenía un comienzo-final. La mayoría de nosotros en el comité pensamos que era una tontería requerir un comienzo-final dentro de algo que ya iba a tener una función/final final. ¡Ya pues! ¿No crees que un compilador podría darse cuenta de que cuando obtuvo la sentencia endtask/endfunction de que estaba al final de la tarea o función? Al eliminar el comienzo de las tareas y funciones, se elimina una sorprendente cantidad de código inútil. ¡Califica otro punto para SystemVerilog!

Saludos - Acantilado Cummings - Verilog & SystemVerilog Guru

Cuestiones relacionadas