2014-09-15 14 views
8

Đôi khi tôi thấy hữu ích khi sử dụng các bài tập chặn cho "biến cục bộ" bên trong đồng hồ luôn luôn chặn. Điều này có thể giúp giảm bớt mã lặp lại.Biến Verilog có thể được cung cấp phạm vi cục bộ để luôn chặn không?

Để tránh vô tình sử dụng cùng một biến trong một khối luôn luôn khác nhau (có thể không xác định cho mô phỏng), tôi muốn cung cấp cho nó phạm vi địa phương. Có một cách tổng hợp tốt đẹp để làm điều này?

Cái gì như:

module sum3(
    input   clk, 
    input  [7:0] in1, 
    input  [7:0] in2, 
    input  [7:0] in3, 
    output reg [7:0] result, 
    output reg [7:0] result_p1); 

    begin :sum 
    reg [7:0] sum_temp; // local variable 
    always @(posedge clk) begin 
     sum_temp = in1 + in2 + in3; 
     result <= sum_temp; 
     result_p1 <= sum_temp + 1; 
    end 
    end 

endmodule 

(. ModelSim có vẻ là ổn với điều này, nhưng Synplify dường như không thích nó)

+0

Mã của bạn có nhiều lỗi biên dịch với 2 trình mô phỏng tôi đã sử dụng (VCS và Incisive). – toolic

+0

Đã chỉnh sửa để sửa lỗi biên dịch. – mksuth

+0

Bất kỳ phản hồi từ cử tri xuống? – mksuth

Trả lời

10

Tôi không chắc chắn về ngữ nghĩa trong đồng bằng Verilog, nhưng theo SystemVerilog LRM phần 6.21:

Tuyên bố biến sẽ đứng trước bất kỳ câu lệnh nào trong một khối thủ tục.

Vì vậy sau đây là cú pháp pháp lý trong SystemVerilog:

module sum3(
    input   clk, 
    input  [7:0] in1, 
    input  [7:0] in2, 
    input  [7:0] in3, 
    output reg [7:0] result, 
    output reg [7:0] result_p1); 

    always @(posedge clk) begin : sum 
    reg [7:0] sum_temp; // local variable (scope limited to process) 
    sum_temp = in1 + in2 + in3; 
    result <= sum_temp; 
    result_p1 <= sum_temp + 1; 
    end 

endmodule 

Lưu ý rằng tôi đã chuyển việc kê khai biến sum_temp vào quá trình này, do đó hạn chế phạm vi và loại bỏ sự cần thiết của các tên sum khối. Điều này biên dịch trên Modelsim và Riviera (ví dụ: EDA Playground).

Nếu công cụ của bạn không hỗ trợ cú pháp này, hãy sửa lỗi!

+1

Điều này không biên dịch ở đồng bằng Verilog, tuy nhiên, chỉ cần thêm nhãn vào câu lệnh 'begin' của khối luôn thực hiện thủ thuật, ví dụ: 'begin: sum'. @Chiggs, Nếu bạn muốn thực hiện chỉnh sửa đó, thì tôi nghĩ đây là câu trả lời hay nhất. – mksuth

2

Mặc dù phương châm chung, sử dụng bài tập chặn bên trong tốc độ luôn khối là ok, và đôi khi như bạn đã đề cập hữu ích. Xem tại đây: https://stackoverflow.com/a/4774450/1383356

Tuy nhiên, một số công cụ có thể không hỗ trợ các biến cục bộ được xác định bên trong khối bắt đầu.

Ngoài ra, bạn có thể thử đặt một số hoặc tất cả các cơ thể của luôn chặn trong một nhiệm vụ:

task SUM_TASK(); 
    reg [7:0] sum_temp; // local variable 
    sum_temp = in1 + in2 + in3; 
    result <= sum_temp; 
    result_p1 <= sum_temp + 1; 
endtask 

always @(posedge clk) begin 
    SUM_TASK(); 
end 

Verilog nhiệm vụ có thể được tiếp cận với các biến toàn cầu cũng như những người địa phương. Ngoài ra, chúng có thể bao gồm các bài tập không chặn.

2

Cách sythesizable tiêu chuẩn là sử dụng một giao liên tục với một wire:

module sum3(
    input  clk, 
    input [7:0] in1, 
    input [7:0] in2, 
    input [7:0] in3, 
    output reg [7:0] result, 
    output reg [7:0] result_p1); 

    wire [7:0] sum_temp = in1 + in2 + in3; 
    always @(posedge clk) begin 
     result <= sum_temp; 
     result_p1 <= sum_temp + 1; 
    end 
endmodule 
+0

Điều này làm việc cho ví dụ đơn giản (và giả tạo) này, nhưng trong các trường hợp phức tạp hơn, điều này có thể làm tổn thương khả năng đọc (các bài tập kết thúc ở xa các biến được sử dụng). Ngoài ra, có những trường hợp khi bạn có thể muốn sử dụng các giá trị trung gian khác nhau của "biến cục bộ". – mksuth

+0

@mksuth Tôi sẽ không làm tổn thương khả năng đọc. 'bài tập kết thúc ở xa nơi mà các biến được sử dụng': Bạn có ý nghĩa gì ở xa? Đó là công việc của placer và router mà bạn không cần phải lo lắng. Nếu bạn muốn sử dụng 'các giá trị trung gian khác nhau', hãy sử dụng một' reg' khác cho nó bên trong khối luôn luôn. – tod

+0

@tod, tôi chỉ đề cập đến khả năng đọc mã của con người.Nếu khối 'luôn' chiếm hàng trăm dòng mã, sau đó sử dụng' wire' cho một biến trung gian ", có thể dẫn đến việc gán cách xa (trong mã) từ nơi' wire' thực sự được sử dụng bên trong khối 'luôn luôn'. Theo tôi, mã có thể đọc được nhiều hơn khi việc gán biến và việc sử dụng biến được nhóm lại với nhau trong mã. – mksuth

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