Có cách nào để kích hoạt một cách có điều kiện một lỗi thời gian biên dịch trong Verilog không?


9

Tôi có một mô-đun tham số hóa trong verilog, trong đó các tham số là tốc độ xung nhịp và tốc độ làm mới, được sử dụng để tính toán có bao nhiêu chu kỳ không hoạt động được chèn giữa các trường hợp của một hoạt động lặp lại. Tuy nhiên, rất dễ cài đặt các tham số không thể đạt được (vì thao tác mất một khoảng thời gian không tầm thường, do đó việc lặp lại sẽ phải xảy ra trước khi hoàn thành) và tại thời điểm thiết kế không đưa ra bất kỳ phản hồi nào về điều này

Tôi đã tự hỏi nếu có một số cách tôi có thể gây ra lỗi trong quá trình tổng hợp (hoặc biên dịch trước khi mô phỏng) nếu các điều kiện không thể được đáp ứng (nghĩa là nếu một localparam nhỏ hơn một cách khác)? Có lẽ một số tương đương với hack C-C ++ biên dịch thời gian xác nhận phổ biến, có lẽ.

Câu trả lời:


10

Tôi chắc chắn có một số cách để liên kết trong một cuộc gọi lại thời gian biên dịch C / C ++. Tuy nhiên, miễn là các generatekhối hỗ trợ của bạn (được giới thiệu trong IEEE Std 1364-2001), thì bạn có thể thực hiện một số việc như sau:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module();
end
endgenerate

Nếu điều kiện là đúng, thì trình biên dịch sẽ báo lỗi vì có yêu cầu cho thứ gì đó không tồn tại. Nếu điều kiện là sai, thì hoạt động được bỏ qua. Yêu cầu duy nhất là mã cho điều kiện bất hợp pháp tuân theo cú pháp Verilog hợp pháp và điều kiện bất hợp pháp sẽ không bao giờ vô tình trở thành hợp lệ (do đó tên mô-đun không tồn tại dài và dài dòng).

Nếu các công cụ giả lập và tổng hợp của bạn hỗ trợ IEEE Std 1800-2009 (bản sửa đổi SystemVerilog phát hành năm 2009) hoặc bản sửa đổi mới hơn, thì bạn có thể sử dụng $error()và đưa ra thông báo có ý nghĩa hơn khi gặp lỗi. Tôi không chắc có người bán nào đã triển khai tính năng này chưa. Nó sẽ trở thành phương thức ưa thích khi hầu hết người bán hàng thực hiện, do đó tôi sẽ đưa ra một ví dụ:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    $error("%m ** Illegal Condition ** CONDITION(%d) > MAX_ALLOWED(%d)", CONDITION, MAX_ALLOWED);
end
endgenerate

1

Bạn có thể làm một cái gì đó như thế này:

module test();

  parameter VALUE=16;

  // VALUE should be between 16 and 64
  wire [64:16] range_for_value;
  assign range_for_value[VALUE] = 1'b0;

endmodule

Các công cụ có thể xử lý điều này hơi khác một chút, nhưng nếu VALUEkhông nằm trong phạm vi dự kiến ​​thì đó thực sự là một lỗi vì chỉ số bit cho câu lệnh gán sẽ nằm ngoài giới hạn range_for_value.


1

Có thực sự đúng là không có gì giống như "khẳng định" trong Verilog? Đây là công cụ khá cơ bản!

Nếu các công cụ của bạn hỗ trợ ngôn ngữ hỗn hợp, bạn có thể thêm một mô-đun chỉ là một thực thể VHDL với các cổng hoặc tổng quát cần thiết và câu lệnh ASSERT rõ ràng. Đối với các điều kiện xác định thời gian biên dịch hoặc xây dựng, điều này sẽ hoạt động tốt như nhau trong sim hoặc tổng hợp (ít nhất là với XST hoặc Synplicity).

entity CheckSize is
   generic (depth : natural := 16);
   port (data : std_logic_vector);
end CheckSize;

architecture empty of CheckSize is
begin
   Assert depth * data'length <= 256 Report "Size too large!" 
      severity Failure;
end empty;

Không có câu trả lời nào cho đến nay là thực sự thỏa đáng, ngoại trừ lỗi "System Verilog 2009" $ () nhưng đây có lẽ là cách dễ nhất trong phạm vi rộng nhất của các công cụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.