Đơn giản hóa việc sử dụng lại thiết kế với những hạn chế SDC động

author-image

Bởi

Khi bạn tạo một khối thiết kế hoặc thành phần HDL có thể được tái sử dụng trong nhiều thiết kế, có thể cần phải tạo ra các ràng buộc SDC để đi cùng với nó. Việc tạo ra những hạn chế không đòi hỏi phải chỉnh sửa bởi nhà thiết kế tái sử dụng linh kiện là hữu ích. Các hạn chế phải chung chung, vì vậy chúng hoạt động bất kể khối được tạo tức thì ở đâu trong hệ thống phân cấp thiết kế và năng động để chúng hoạt động bất kể khối thiết kế được kết nối như thế nào. Nếu các hạn chế phải được chỉnh sửa theo cách thủ công để phản ánh các thay đổi thiết kế, các hạn chế này sẽ mất đồng bộ nếu nhà thiết kế thực hiện thay đổi thiết kế mà không đồng thời cập nhật các hạn chế.

Ví dụ thiết kế này bao gồm các kỹ thuật tạo ra các hạn chế SDC động giải quyết hai vấn đề sau:

  • Xác định tên của I/O cấp cao nhất được kết nối trực tiếp với mô-đun cấp thấp
  • Tạo đồng hồ được tạo trên logic trong các mô-đun cấp thấp

Biểu đồ trong Hình 1 cho thấy một thiết kế rất đơn giản cho ví dụ này. Nó bao gồm hai phiên bản của một khối thiết kế có thể tái sử dụng có reusable_block, được hiển thị màu vàng. Hình 2 cho thấy nội dung của reusable_block thiết kế. reusable_block năng như một đồng hồ tốc độ dữ liệu kép cho một bus đầu ra đồng bộ nguồn. Đầu ra của sản phẩm phải được kết nối với đầu ra cấp cao nhất. Các hạn chế đối với reusable_block phải bao gồm đồng hồ được tạo ra, vì các chức năng đầu ra như một đồng hồ đồng bộ nguồn.

Hình 1. Mạch mẫu cho ví dụ thiết kế.

Hình 2. Thành phần của reusable_block.

Xác định Tên I/O cấp cao nhất

Hạn chế đối với các reusable_block phải chứa các thay đổi đối với tên I/O cấp cao nhất. Do đó, tên I/O cấp cao nhất phải được xác định trong quá trình biên dịch hoặc phân tích thời gian. Lệnh get_fanouts Tcl trả về một tập hợp ID đại diện cho các cổng hoặc thanh ghi là fanout của một tên được chỉ định. Lệnh get_fanouts Tcl sử dụng netlist thời gian tồn tại trong quá trình biên dịch hoặc phân tích thời gian, vì vậy nó tự động xác định kết nối bất kể tên của các nút fanout. Mã Tcl sau cho thấy cách sử dụng get_fanouts để có được đầu ra cấp cao nhất là quạt trực tiếp của thanh ghi cấp thấp.

foreach_in_collection fanout_id [get_fanouts $low_level_register_name] { break }
set top_level_io_name [get_node_info -name $fanout_id]

Tên hệ thống phân cấp đầy đủ của thanh ghi cấp thấp không cần phải biết, vì bạn có thể sử dụng ký tự đại diện và một phần đã biết của hệ thống phân cấp tồn tại trong khối thiết kế tái sử dụng để phù hợp với nó. Ví dụ mã cuối cùng trên trang này hiển thị một ví dụ về cách khớp với tên đăng ký cấp thấp.

Trong thiết kế trong Hình 1, chân đầu ra mô-đun cấp thấp được kết nối trực tiếp với một đầu ra cấp cao nhất. Mã Tcl sau bổ sung tính năng kiểm tra lỗi để đảm bảo quạt đăng ký cấp thấp chỉ đến một địa điểm và vị trí quạt là cổng đầu ra. Mã Tcl này phải là một phần của tệp SDC hạn chế reusable_block.

# Nhận fanouts của bộ đăng ký cấp thấp fanout_collection [get_fanouts $low_level_register_name] # Đảm bảo chỉ có một fanout được đặt

num_fanouts
[get_collection_size $fanout_collection] nếu
{ 1 != $num_fanouts } { lỗi mã trả lại
    "$low_level_register_name fans ra ngoài $num_fanouts \

nút nhưng phải quạt ra đến một." } # Lấy tên của nút fanout foreach_in_collection fanout_id $fanout_collection { break } đặt fanout_name [get_node_info -name $fanout_id] # Đảm bảo nút fanout là một cổng đầu ra nếu { [chuẩn { get_port_info -is_output_port $fanout_id } is_output] } { # Đã xảy ra lỗi - nó không quạt ra lỗi mã trả lại cổng
    "$low_level_register_name fans ra $fanout_name \ không phải là
        cổng"
} elseif { ! $is_ output } { # Không có lỗi, nhưng cổng không phải là lỗi mã trả lại cổng đầu ra "$fanout_name không phải là cổng đầu ra" } khác { đặt
    top_level_io_name $fanout_name } # top_level_io_name là

fanout duy nhất của low_level_register_name và nó là
số cổng đầu ra

Tạo đồng hồ được tạo

Một đồng hồ đầu ra đồng bộ nguồn phải được định nghĩa là một đồng hồ được tạo ra, dựa trên đồng hồ cung cấp thanh ghi tốc độ dữ liệu kép. Đồng hồ được tạo phải được tạo mà không có bất kỳ thông tin nào được nhập thủ công về đồng hồ trong thiết kế, vì khối thiết kế có thể được khởi tạo trong bất kỳ thiết kế nào với bất kỳ sơ đồ ép tốc nào.

Lệnh SDC sau cho thấy một cách đơn giản để tạo đồng hồ được tạo cho đồng hồ đầu ra nguồn cho thiết kế trong Hình 1, khi không biết vị trí trong hệ thống phân cấp.

create_generated_clock -name reusable_generated -source [get_pins \
    *|reusable_block_clock_out|altddio_out_component|auto_generated|ddio_outa[0]|muxsel] \
    $top_level_io_name

Đó là một cách tiếp cận đơn giản phù hợp cho một lần khởi tạo reusable_block ở bất cứ đâu trong hệ thống phân cấp thiết kế, nhưng nó không xử lý nhiều khởi tạo hoặc tình huống đa xung. Khi sơ đồ đồng hồ không được biết, hạn chế đồng hồ được tạo ra sẽ có thể xử lý các tình huống mà nhiều đồng hồ đã được xác định trên một tín hiệu đồng hồ duy nhất nguồn cấp dữ liệu cho khối thiết kế. Nhiều đồng hồ trên một tín hiệu đồng hồ thường tồn tại trong các thiết kế hỗ trợ tốc độ giao thức I/O khác nhau hoặc các thiết kế hỗ trợ chuyển đổi đồng hồ để dự phòng. Ví dụ xung giờ được tạo đơn giản ở trên không thành công trong các tình huống đa xung vì nó không bao gồm tùy chọn -master_clock để phân biệt giữa nhiều đồng hồ nguồn.

Để xử lý nhiều khởi tạo, hãy sử dụng một vòng lặp để tạo ra các đồng hồ được tạo riêng cho mỗi lần khởi tạo. Để xử lý các tình huống đa xung, sử dụng một quy trình tùy chỉnh get_clocks_driving_pin, được mô tả trong ví dụ thiết kế Chân xung giờ. Để sử dụng quy trình tùy chỉnh, bạn phải sao chép nó từ trang ví dụ về thiết kế Chốt đồng hồ. Bạn có thể lưu nó dưới dạng một tệp SDC riêng biệt được thêm vào dự án hoặc sao chép và dán nó vào một tệp SDC với tất cả các hạn chế khác làm hạn chế một khối tái sử dụng. Nếu bạn lưu nó dưới dạng tệp SDC được thêm vào dự án, hãy đảm bảo tệp đó được liệt kê trước bất kỳ tệp SDC nào sử dụng quy trình get_clocks_driving_pin chỉnh.

Mã Tcl sau cho thấy cách tạo ra các hạn chế về đồng hồ được tạo trên đầu ra cấp cao nhất được thúc đẩy bởi thanh ghi cấp thấp trong thiết kế được hiển thị trong Hình 1. Các đồng hồ được tạo ra sử dụng đầu ra cấp cao nhất làm mục tiêu của họ và các chân muxsel của altddio_output ghi là nguồn của chúng. Mã này sử dụng một vòng lặp để lặp lại thông qua tất cả các khởi tạo của reusable_block trong thiết kế và một vòng lặp được lồng vào để xử lý các tình huống đa xung với quy trình tùy chỉnh get_clocks_driving_pin của bạn. Nó giả định quy trình get_clocks_driving_pin đã được xác định trước đó.

# get_pins trả về một chân muxsel cho mỗi lần khởi tạo reusable_block # foreach_in_collection lần lượt sao chép qua từng chân
muxsel
foreach_in_collection pin_id [get_pins -compatibility_mode \
    *|reusable_block_clock_out|altddio_out_component|auto_generated|ddio_outa[0]|muxsel] { # pin_name có hệ thống phân cấp thiết kế đầy đủ của chân muxsel cho một sự khởi tạo

    # của reusable_block đặt pin_name
    [get_node_info -name $pin_id]
    
    # Sử dụng mã được hiển thị ở trên, không kiểm tra lỗi, để nhận tên của đầu ra cấp cao nhất
    foreach_in_collection port_id [get_fanouts $pin_name] { ngắt } đặt port_name [get_node_info -name $port_id] # Có thể có nhiều đồng hồ định vị thanh ghi altddio_output # Cần một đồng hồ tạo cho mỗi đồng hồ nguồn cấp dữ liệu # một
    
    chân
    muxsel. Mỗi chân đồng hồ định vị chân muxsel là một đồng hồ chính.
    foreach master_clock [get_clocks_feeding_pin $pin_name] { post_message "Tạo đồng hồ được tạo trên $port_name được cung cấp bởi $pin_name" # Tạo đồng hồ được tạo với đồng hồ chính
        phù hợp.
        # Nguồn là chân muxsel của ô altddio_output trong
        # sự khởi tạo hiện tại của giao thức reusable_block.
        # Tên là sự kết hợp của đồng hồ chính và tên hệ thống phân cấp
        đầy đủ của chân muxsel.
        # Mục tiêu là cổng cấp cao nhất là sự bùng phát của chân muxsel.
        create_generated_clock -add -master_clock $master_clock \
            -source [get_pins $pin_name] -name ${master_clock}-${pin_name} \
            [get_ports $port_name]
} }

Với mã này trong tệp SDC có trong dự án, tất cả các khởi tạo dữ liệu reusable_block tự động bị hạn chế với đồng hồ được tạo. Đồng hồ được tạo ra luôn chính xác và cập nhật, ngay cả trong các tình huống sau:

  • reusable_block được lập tức tại hoặc chuyển sang các điểm khác trong hệ thống phân cấp thiết kế
  • I/Os cấp cao nhất được đổi tên
  • Nhà thiết kế sử dụng nhiều định nghĩa đồng hồ trong thiết kế

Nội dung gốc bằng tiếng Anh trên trang này vừa do con người vừa do máy dịch. Nội dung này chỉ để cung cấp thông tin chung và giúp quý vị thuận tiện. Quý vị không nên tin đây là thông tin hoàn chỉnh hoặc chính xác. Nếu có bất kỳ mâu thuẫn nào giữa bản tiếng Anh và bản dịch của trang này, thì bản tiếng Anh sẽ chi phối và kiểm soát. Xem phiên bản tiếng Anh của trang này.