2017-06-21 13 views
5

Tôi có một mô-đun được chuyển qua một số parameter rồi khởi tạo mô-đun khác tương ứng với tham số đã xác định.Tuyên bố an toàn LINT/tổng hợp là gì để ném lỗi vào thời gian biên dịch?

Tuy nhiên, trong trường hợp một trường hợp không được định nghĩa cho một sự kết hợp nhất định các thông số, tôi xin lỗi được ném vào thời gian biên dịch để làm nổi bật vấn đề, như vậy:

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin 

    // instantiate module logic_A 

end else if (PARAM1 == 2 && PARAM2 == 1) begin    

    // instantiate module logic_B 

end else begin 

    // throw an error at compile time if we haven't 
    // defined a case for those parameters 

end 
endgenerate 

Tuy nhiên , mã này vẫn cần phải được tổng hợp (trong Verilog, không SystemVerilog) và vượt qua LINTing, mặc dù đã chèn lỗi.

Có ai biết những gì tôi có thể sử dụng trong tình huống này không? Cảm ơn bạn trước.

Trả lời

4

Tôi đã trả lời câu hỏi rất giống nhau trên trang web chị em, Điện tử StackExchange, cho "a way of conditionally triggering a compile-time error in verilog". Giải pháp là điều kiện để khởi tạo một mô-đun không tồn tại. Tôi khuyên các mô-đun không tồn tại có một tên rất dài và có ý nghĩa tên giải thích lỗi. Điều này cũng làm giảm nguy cơ của các mô-đun không tồn tại vô tình có cùng tên với mô-đun hiện có.

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA 
    // instantiate module logic_A 
end 
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB 
    // instantiate module logic_B 
end 
else begin : illegal 
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module(); 
end 
endgenerate 

Điều này hoạt động vì kiểm tra sự tồn tại của mô-đun không tồn tại không được thực hiện cho đến sau khi các giá trị tham số được đánh giá trong giai đoạn xây dựng.


Giải pháp tốt hơn là sử dụng phương pháp SystemVerilog; cụ thể với phần bổ trợ giả lập với chuẩn IEEE Std 1800-2009 hoặc mới hơn. Sau đó, bạn có thể sử dụng $error() và cung cấp thông báo có ý nghĩa hơn để đi kèm với lỗi (Ví dụ: in các giá trị tham số đã kích hoạt điều kiện lỗi). Bạn có thể đọc thêm về nó trong IEEE Std 1800-2012 20.11 hệ thống Lập nhiệm vụ

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA 
    // instantiate module logic_A 
end 
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB 
    // instantiate module logic_B 
end 
else begin : illegal 
    $error("Expected PRAM1/2 to be 1/2 or 2/1, but was %0d/%0d", PARAM1, PARAM2); 
end 
endgenerate 
0

Không. Không có gì trong verilog cho việc này. Bạn không thể làm điều đó khi biên dịch.

Nhưng bạn có thể làm điều gì đó để loại bỏ lỗi và thoát tại thời điểm '0' trong mô phỏng.

Trong hệ thống Verilog bạn có thể thêm một khẳng định:

initial assert(0) else $fatal("--error--"); 

hoặc chỉ

initial $fatal("--error--"); 

khác một cái gì đó như thế:

initial begin $display("--error--"); $finish; end 

Cả hai sẽ cung cấp một thông báo ở đầu mô phỏng.

+2

Trong SystemVerilog, bạn chỉ có thể làm '$ gây tử vong ("Thông điệp") trong mệnh đề khác của' generate-if'. –

+0

Chỉ cần kiểm tra, trong vcs 2015 nó được thực hiện nhưng đòi hỏi một chuyển đổi biên dịch đặc biệt "-assert svaext". vcs tạo thông báo thời gian biên dịch tốt đẹp trong trường hợp này. Nếu không, nó phát hiện lỗi cú pháp. Với 'ban đầu' nó biên dịch mà không có vấn đề và tạo ra thông điệp vi phạm thời gian chạy. – Serge

1

Đó là một chút vụng về và tôi không biết những gì công cụ lint của bạn được kiểm tra, nhưng làm thế nào về điều này:

generate 
    if (PARAM1 == 1 && PARAM2 == 2) begin 

    // instantiate module logic_A 

    end else if (PARAM1 == 2 && PARAM2 == 1) begin    

    // instantiate module logic_B 

    end else begin 

    reg ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2; 
    reg DUMMYO, DUMMYI; 
    always @(posedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2 or negedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2) 
     DUMMYO <= DUMMYI; 

    end 
endgenerate 

này cung cấp cho các lỗi sau trên Quartus khi tôi đặt PARAM1-3:

lỗi (10.239): Verilog HDL Luôn Xây dựng lỗi tại synth_assertion.v (18): kiểm soát sự kiện không thể kiểm tra cho cả hai cạnh tích cực và tiêu cực của biến "ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2"

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