Nhận đồng hồ hỗ trợ ghim

author-image

Bởi

Ví dụ thiết kế này hiển thị một quy trình tùy chỉnh mà bạn có thể sử dụng trong các tệp SDC, trả về danh sách tất cả các đồng hồ cho chân nguồn cấp dữ liệu. Quy trình này có thể hữu ích nếu bạn cần tạo đồng hồ được tạo mà không cần biết tên đồng hồ khác trong một thiết kế. Ví dụ thiết kế Đơn giản hóa Việc sử dụng lại thiết kế SDC động cung cấp thêm chi tiết và ví dụ về cách sử dụng quy trình tùy chỉnh được mô tả trên trang này.

Mã đầy đủ cho quy trình nằm ở cuối trang, sau khi giải thích đầy đủ về cách thủ tục hoạt động. Để sử dụng quy trình get_clocks_driving_pins chỉnh trong tệp SDC, hãy đảm bảo quy trình đã được xác định, sau đó gọi nó giống như bất kỳ lệnh SDC nào khác. Có hai cách dễ dàng để đảm bảo quy trình đã được xác định trước khi sử dụng:

  • Lưu mã quy trình trong một tệp SDC riêng biệt và bao gồm tệp SDC trong dự án.
  • Sao chép và dán mã quy trình ở phía trên cùng của bất kỳ tệp SDC nào, trước khi sử dụng get_clocks_driving_pins thủ tục tùy chỉnh.

Tệp SDC riêng

Lưu mã quy trình trong một tệp SDC riêng biệt giữ mã tách biệt với các hạn chế còn lại của bạn và giúp tái sử dụng trong các dự án khác trở nên đơn giản hơn. Nếu bạn sử dụng một tệp SDC riêng biệt, bạn phải thêm tệp SDC với quy trình vào danh sách các tệp trong dự án và nó phải xuất hiện phía trên bất kỳ tệp SDC nào sử dụng quy trình. Liệt kê nó trên các tệp SDC khác đảm bảo rằng phần mềm Quartus® II xác định quy trình trước khi sử dụng nó, bất cứ khi nào tệp SDC được đọc.

Sao chép và dán

Việc sao chép và dán mã thủ tục trong cùng một tệp SDC mà nó được sử dụng sẽ khiến ít tệp SDC hơn trong một dự án. Nếu bạn tạo tệp SDC cho một mô-đun sẽ được các nhà thiết kế khác sử dụng lại, việc đưa tất cả các ràng buộc và mã hỗ trợ vào một tệp SDC một cách đơn giản nhất. Bạn phải đưa mã thủ tục vào tệp SDC trước khi sử dụng quy trình đầu tiên, vì vậy nó được định nghĩa trước khi sử dụng. Thông thường, bạn sẽ đặt nó ở đầu tệp để đáp ứng yêu cầu này.

Thao tác kịch bản

Nhận danh sách tất cả các đồng hồ trong thiết kế nguồn cấp chân thực hiện ba bước chính:

  1. Nhận tất cả các đồng hồ và tạo bản đồ từ các nút mục tiêu của chúng đến đồng hồ trên các nút mục tiêu.
  2. Nhận danh sách các nút có đồng hồ trên đường dẫn quạt đến chân được chỉ định.
  3. Từ danh sách các nút đó, tìm nút gần chân nhất và trả lại đồng hồ trên nút đó.

Bước 1. Nhận tất cả đồng hồ và tạo bản đồ

Mã Tcl sau đây sẽ thực hiện tất cả các xung nhịp trong thiết kế và tạo ánh xạ (với một mảng Tcl) từ một nút đến các đồng hồ trên nút.

ảnh minh họa { unset mảng nodes_with_clocks } bộ mảng nodes_with_clocks [list] # Iterate qua từng đồng hồ trong thiết kế

foreach_in_collection clock_id
[all_clocks] {

    set clock_name [get_clock_info -name $clock_id] # Mỗi đồng hồ được áp dụng cho các

    nút. Nhận bộ sưu tập các nút mục tiêu foreach_in_collection target_id [get_clock_info -targets $clock_id] { # Liên kết tên đồng hồ với bộ nút mục tiêu

        target_name
        [get_node_info -name $target_id]
        lappend nodes_with_clocks($target_name) $clock_name
    }
}

Đồng hồ ảo không có mục tiêu, do đó không thể lập bản đồ nào được thực hiện với đồng hồ ảo. Trong mã quy trình đầy đủ được liệt kê bên dưới, thông tin về loại nút đích (đăng ký, chân, ô hoặc cổng) sẽ được lưu để sử dụng sau này.

Bước 2. Nhận nút với đồng hồ trong Đường dẫn Fanin

Bước thứ hai là tìm tập hợp con các nút có đồng hồ trên đường dẫn fanin đến chân được chỉ định. Đối với mỗi nút có đồng hồ (được tìm thấy trong bước 1), nhận quạt gió đến chân được chỉ định qua nút. Nếu có một fanin, nút ở trong đường dẫn fanin đến chân. Nếu không có fanin, nút không có trên đường dẫn fanin đến chân.

Mã Tcl sau đây sẽ chuyển qua tất cả các nút có đồng hồ từ bước 1 và sử dụng lệnh get_fanins để xác định xem mỗi nút có ở trên đường dẫn fanin của chân được chỉ định hay không. Nếu nút ở trên đường dẫn fanin của chân được chỉ định, nút sẽ được lưu trong danh pin_drivers hành.

đặt pin_drivers [danh sách] # Sao y trên tất cả các nút trong ánh xạ được tạo trong bước 1 foreach node_with_clocks [tên mảng nodes_with_clocks] { # Nhận bất kỳ fanins nào vào chân chỉ định thông qua bộ nút hiện tại
fanin_col
    [get_fanins -clock -through $node_with_clock $pin_name] # Nếu có ít nhất một

    nút fanin, nút hiện tại đang ở trên đường
    dẫn # fanin đến chân được chỉ định,  vì vậy hãy lưu lại.
    nếu { 0 < [get_collection_size $fanin_col] } {
        lappend pin_drivers $node_with_clocks
} }

Mã quy trình đầy đủ được liệt kê dưới đây sử dụng thông tin bổ sung về loại nút để chỉ định một tập hợp kiểu cụ thể cho giá trị -through trong lệnh get_fanins nút.

Bước 3. Tìm Nút gần nhất với Ghim được chỉ định

Biến pin_drivers hiện có danh sách tất cả các nút có đồng hồ trên đường dẫn fanin đến chân được chỉ định. Bước này tìm thấy nút gần nhất với chân được chỉ định. Mặc dù có nhiều hơn một nút trong danh sách pin_drivers, mã này lấy hai nút đầu tiên trong danh sách và kiểm tra xem một nút có ở trên đường dẫn fanin dẫn đến nút còn lại hay không. Nếu nó ở trên đường dẫn fanin, nút đầu tiên phải ở xa chân hơn nút thứ hai, vì vậy nó có thể bị xóa khỏi danh sách.

trong khi { 1 < [llength $pin_drivers] } { Nhận hai nút đầu tiên trong danh sách
    pin_drivers đặt node_a [lindex $pin_drivers 0] đặt node_b [lindex $pin_driver 1] # Kiểm tra xem node_b có ở trên đường dẫn fanin của node_a được đặt
    fanin_col
    [get_fanins -clock -through $node_b $node_a] # Nếu có ít nhất một

    nút fanin,  node_b phải ở xa chân chỉ định hơn
    node_a.
    # Nếu không có nút fanin, bạn cần node_b gần chân chỉ định
    hơn một node_a.
    nếu { 0 < [get_collection_size] } {

        Số node_a gần chân hơn.
        # Xóa node_b khỏi pin_drivers đặt
        pin_drivers [lreplace $pin_drivers 1 1] }

    khác {

        # node_b gần chân hơn.
        # Xóa node_a khỏi danh sách pin_drivers được đặt pin_drivers [lreplace $pin_drivers 0 0] } } # Một nút còn lại trong pin_drivers là nút điều khiển nút đặt node_driving_pin [lindex $pin_drivers 0] # Tra cứu đồng hồ trên nút trong ánh xạ từ bước 1 và trả lại
$nodes_with_clocks ($node_driving_pin

Mã quy trình đầy đủ được liệt kê dưới đây sử dụng thông tin bổ sung về loại nút để chỉ định một tập hợp kiểu cụ thể cho giá trị -through trong lệnh get_fanins nút.

Mã thủ tục đầy đủ

Mã hoàn chỉnh cho quy trình tùy get_clocks_driving_pin được liệt kê bên dưới. Nó bao gồm các tính năng kiểm tra lỗi và hỗ trợ bổ sung không được mô tả chi tiết ở trên.

proc get_clocks_feeding_pin { pin_name } { { Trước khi bước 1, thực hiện kiểm tra lỗi để đảm bảo rằng pin_name # được chuyển vào quy trình khớp với một và chỉ một
    chân.
    # Trả lại lỗi nếu nó không khớp với một và chỉ một chân.
    đặt pin_col [get_pins -compatibility_mode $pin_name] nếu { 0 == [get_collection_size $pin_col] } { lỗi mã trả lại "Không có chân khớp
        với $pin_name"
    } elseif { 1 < [get_collection_size $pin_col] } { lỗi mã trả lại
        "$pin_name khớp với [get_collection_size $pin_col]\ chân nhưng phải khớp với chỉ
            một" } # Khởi tạo
    các
    biến được sử dụng trong giao thức thủ tục { mở mảng nodes_with_clocks } đánh dấu { mảng unset node_types } bộ mảng nodes_with_clocks [danh sách]
    tập hợp mảng node_types [danh sách]
    đặt pin_drivers [danh sách]
    
    # Bước 1. Nhận tất cả các đồng hồ trong thiết kế và tạo ánh xạ từ # các nút mục tiêu đến đồng hồ trên các nút mục tiêu # Iterate qua từng đồng hồ trong thiết kế

    foreach_in_collection clock_id [all_clocks] { đặt clock_name

        [get_clock_info -name $clock_id]
        đặt clock_target_col [get_clock_info -targets $clock_id] #
        
        Mỗi đồng hồ được áp dụng cho các nút. Nhận bộ sưu tập các nút mục tiêu foreach_in_collection target_id [get_clock_info -targets $clock_id] { Liên kết tên đồng hồ với bộ nút mục tiêu

            target_name [get_node_info -name $target_id] lappend nodes_with_clocks($target_name) $clock_name # Lưu loại nút đích cho bộ sử dụng sau này
            target_type
            [get_node_info -type $target_id]
            set node_types($target_name) $target_type
        }
    }

    # Bước 2. Nhận danh sách các nút có đồng hồ trên đường dẫn # fanin đến chân ghim được chỉ định # Iterate trên tất cả các nút trong ánh xạ được tạo trong bước 1 foreach node_with_clocks [tên mảng nodes_with_clocks] { # Sử dụng loại nút đích để tạo một bộ sưu tập

        #type-specific cho
        giá trị -through trong lệnh get_fanins.
        switch -exact -- $node_types($node_with_clocks) {
            "pin" { đặt  through_col [get_pins $node_with_clocks] }
            "cổng" { đặt through_col [get_ports $node_with_clocks] }
            "ô" { đặt through_col [get_cells $node_with_clocks] }
            "reg" { đặt through_col [get_registers $node_with_clocks] } mặc định { lỗi mã trả lại
            "$node_types($node_with_clocks)

        không được xử lý\ dưới dạng loại fanin theo kịch bản" } } # Nhận bất kỳ fanins nào đến chân được chỉ định thông qua bộ nút hiện tại
        fanin_col [get_fanins -clock -through $through_col $pin_name] # Nếu có ít nhất một nút fanin, nút hiện tại nằm trên đường dẫn # fanin đến chân được chỉ định, vì vậy hãy lưu
        nó.
        nếu { 0 < [get_collection_size $fanin_col] } {
            lappend pin_drivers $node_with_clocks } } Trước khi bước

    3, thực
    hiện
    kiểm tra lỗi để đảm bảo rằng ít nhất một số nút có đồng hồ trong thiết kế có trên đường dẫn fanin đến # chân được chỉ định. nếu { 0 == [llength $pin_drivers] } { lỗi mã trả lại "Không thể tìm thấy bất kỳ nút nào có đồng hồ ổ
        đĩa $pin_name"
    } # Bước
    
    3. Từ danh sách các nút được tạo trong bước 2, tìm nút # gần nhất với chân chỉ định và trả
    lại đồng hồ trên nút đó.

    trong khi { 1 < [llength $pin_drivers] } { Nhận hai nút đầu tiên trong danh sách pin_drivers được đặt
        node_a [lindex $pin_drivers 0] đặt
        node_b [lindex $pin_drivers 1] # Sử dụng loại nút mục tiêu để tạo một bộ sưu tập
        #type-specific
        cho giá trị -through trong lệnh get_fanins. switch -exact -- $node_types($node_b) {
            "pin" { set  through_col [get_pins $node_b] }
            "port" { set through_col [get_ports $node_b] }
            "cell" { set through_col [get_cells $node_b] } "reg" { đặt through_col [get_registers $node_b] } mặc định { lỗi mã trả lại
            "$node_types($node_b)        
        không được xử lý\ dưới dạng kiểu fanin theo kịch bản" } } # Kiểm tra xem node_b có ở trên đường dẫn fanin của node_a đặt fanin_col [get_fanins -clock -through $through_col $node_a] # Nếu có ít nhất một nút fanin, node_b phải ở xa chân chỉ định hơn
        node_a.
        # Nếu không có nút fanin, bạn cần node_b gần chân chỉ định
        hơn một node_a.
        nếu { 0 < [get_collection_size $fanin_col] } {

            Số node_a gần chân hơn.
            # Xóa node_b khỏi danh sách pin_drivers được đặt
            pin_drivers [lreplace $pin_drivers 1 1] } khác { # node_b gần chân hơn # Xóa node_a khỏi bộ danh

        sách pin_drivers pin_drivers
            [lrange $pin_drivers 1 đầu] } } # Một nút bên trái trong pin_drivers là nút điều khiển bộ chân được chỉ
            định node_driving_pin
    [lindex $pin_drivers 0]

    # Tra cứu các đồng hồ trên nút trong ánh xạ từ bước 1 và trả lại
    $nodes_with_clocks($node_driving_pin)
}

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.