Какой смысл в "простом" блоке начала-конца? - PullRequest
6 голосов
/ 02 апреля 2012

Я читаю какой-то сторонний Verilog, и нашел это:

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

Кажется, что ключевые слова begin и end здесь избыточны. Они? Как их использовать?

Ответы [ 3 ]

8 голосов
/ 02 апреля 2012

Я не знаю об общем случае, но в данном конкретном случае:

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

Источник: Справочное руководство Verilog Golden

6 голосов
/ 28 июня 2012

Оба ответа верны.Если у задачи или функции Verilog было несколько операторов, они также должны были иметь операторы начала и конца.Начиная с SystemVerilog-2005, мы сняли требование помещать начало в нечто, что уже имело начало.Большинство из нас в комитете считали глупым требовать начала внутри чего-то, что уже должно было иметь конечную функцию / конечную задачу.Я имею в виду давай!Не думаете ли вы, что компилятор может понять, что когда он получил инструкцию endtask / endfunction, он был в конце задачи или функции ??Удаление начала и конца из задач и функций избавляет от неожиданного количества бесполезного кода.Наберите еще одно очко для SystemVerilog!

С уважением - Клифф Каммингс - Verilog & SystemVerilog Guru

1 голос
/ 04 апреля 2012

В соответствии с расширением SystemVerilog (стандарт IEEE 1800-2009) начало / конец являются необязательными внутри function. Однако ваш набор инструментов (симулятор и т. Д.) Должен быть способен понимать этот синтаксис, который был введен в 2005 году.

...