2012-04-02 22 views
5

Tôi đọc một số bên thứ ba Verilog, và thấy điều này:Điểm của khối bắt đầu "đơn giản" là gì?

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 

Dường như beginend từ khóa là không cần thiết ở đây. Có phải không? Sử dụng của họ là gì?

Trả lời

8

Tôi không biết về trường hợp chung, nhưng trong trường hợp cụ thể này:

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

Nguồn: Verilog Golden Reference Guide

+0

'bắt đầu/end' không còn cần thiết cho một' function' hoặc 'task' với nhiều báo cáo trong SystemVerilog. Xem các câu trả lời khác. –

1

Theo phần mở rộng SystemVerilog (IEEE tiêu chuẩn 1800-2009), bắt đầu/kết thúc là tùy chọn bên trong một function. Tuy nhiên, bộ công cụ của bạn (trình mô phỏng, v.v.) phải có khả năng hiểu cú pháp này, được giới thiệu vào năm 2005.

6

Cả hai câu trả lời là chính xác. Nếu nhiệm vụ hoặc hàm Verilog có nhiều câu lệnh, chúng cũng được yêu cầu có các câu lệnh bắt đầu. Bắt đầu từ SystemVerilog-2005, chúng tôi đã xóa yêu cầu để đặt nội dung bắt đầu vào bên trong nội dung nào đó đã bắt đầu. Hầu hết chúng ta trong ủy ban nghĩ rằng thật ngớ ngẩn khi yêu cầu một bên trong bắt đầu từ một thứ gì đó đã có kết thúc/kết thúc. Ý tôi là, thôi nào! Bạn không nghĩ rằng một trình biên dịch có thể tìm ra rằng khi nó có câu lệnh endtask/endfunction mà nó đã ở cuối nhiệm vụ hoặc chức năng? Việc xóa phần đầu của các nhiệm vụ và chức năng sẽ cắt ra một lượng mã vô dụng đáng ngạc nhiên. Ghi điểm khác cho SystemVerilog!

Trân - Cliff Cummings - Verilog & SystemVerilog Guru

Các vấn đề liên quan