Instans dan Entitas Penganalisis Waktu dalam Skrip

author-image

Oleh

Ketika Anda menulis skrip kustom untuk Penganalisis Waktu, Anda harus mengetahui bagaimana fungsi API Tcl yang berbeda menangani dan mengembalikan nama entitas dan instans dalam nama node. Ada pengaturan dalam perangkat lunak Quartus® II yang disebut Nama entitas Tampilan untuk nama node yang mengontrol apakah nama node ditampilkan dengan atau tanpa nama entitas.
Fungsi API Tcl get_registers selalu dapat menerima nama yang menyertakan entitas untuk filternya, terlepas dari pengaturan Nama entitas Tampilan untuk nama node. Fungsi get_registers selalu mengembalikan nama sesuai dengan pengaturan Nama entitas Tampilan untuk nama node.
Tabel 1 menunjukkan contoh nama node yang dikembalikan oleh perintah get_registers <filter>,di mana desain mencakup register dengan nama ram:my_ram|ctrl:ctrl_1|addr[0].

Fungsi API Tcl get_pins dan get_cells berulah berbeda dari get_registers. Fungsi get_pins dan get_cells hanya menerima dan mengembalikan nama yang berisi nama instans. Mereka tidak menerima atau mengembalikan nama dengan entitas, terlepas dari nilai nama entitas Tampilan untuk nama node.
Tabel 2 menunjukkan contoh nama node yang dikembalikan oleh get_pins <filter>,di mana desain meliputi register dengan nama ram:my_ram|ctrl:ctrl_1|addr[0] dengan clock pin bernama clk. Fungsi get_cells memiliki perilaku yang sama, meskipun fungsi menerima dan mengembalikan nama sel.

Catatan:

  1. Fungsi get_pins menghasilkan peringatan yang menunjukkan bahwa filter yang ditentukan tidak dapat dicocokkan dengan pin.

Ketika Anda mengetahui perbedaan cara get_registers, get_pins, dan get_cells menangani dan mengembalikan nama node yang mencakup entitas, Anda dapat menghindari masalah halus yang dapat terjadi ketika Anda menggabungkan fungsi. Contoh berikut menunjukkan kode yang berfungsi saat Nama entitas Tampilan untuk nama node mati, tetapi gagal saat menyala.

foreach_in_collection reg_id [get_registers foo*] { set
    reg_name [get_node_info -name $reg_id]
    # ...
    set pin_id [get_pins ${reg_name}|clk]
    # Jika reg_name mencakup entitas, panggilan get_pins selalu gagal
}

Ketika Nama entitas Tampilan untuk nama node tidak aktif, variabel reg_name tidak menyertakan nama entitas, sehingga panggilan get_pins berhasil. Saat Nama entitas tampilan untuk nama node aktif, variabel reg_name mencakup nama entitas, sehingga panggilan get_pins gagal.

Solusi

Cara term mudah untuk menghindari potensi masalah adalah mematikan Nama entitas Tampilan untuk nama node dan hanya menggunakan nama instans untuk merujuk ke node. Solusi ini memastikan bahwa nama yang dikembalikan oleh get_registers adalah nama instans saja dan berfungsi dengan get_pins dan get_cells.

Jika Anda tidak mematikan Nama entitas Tampilan untuk nama node, dan Anda meneruskan nama yang dikembalikan oleh get_registers ke get_pins atau get_cells, Anda harus memastikan bahwa Anda menghapus semua nama entitas. Anda dapat menggunakan ekspresi regsub sederhana untuk menghapus sebagian besar nama entitas. Perintah Tcl berikut menghapus semua nama entitas dari nama node, selama nama entitas hanya berisi huruf, digit, dan garis bawah (karakter di \w kelas karakter).

regsub -all {\w*:} $reg_name {} reg_name

Pola ekspresi reguler yang tercantum tidak menangani setiap karakter yang valid dalam pengidentifikasi HDL. Tidak menangani nama entitas yang dihasilkan yang mencakup backslashes (\), karakter tanda dolar ($) dalam pengidentifikasi HDL Verilog sederhana, pengenal HDL Verilog yang lolos, atau pengenal yang diperluas di VHDL. Anda dapat membangun ekspresi reguler yang lebih canggih untuk menangani nama entitas dengan karakter tersebut, tetapi lebih mudah untuk mematikan Nama entitas Tampilan untuk nama node.
Contoh berikut menunjukkan cara mengintegrasikan ekspresi regsub dengan contoh tidak berfungsi di atas. Dalam contoh berikut, ekspresi regsub menghapus nama entitas dari nama register (tunduk pada pengecualian karakter yang dijelaskan), sehingga panggilan get_pins tidak gagal. Contoh bekerja terlepas dari nilai nama entitas Tampilan untuk nama node.

foreach_in_collection reg_id [get_registers foo*] { set
    reg_name [get_node_info -name $reg_id]
    regsub -all {\w*:} $reg_name {} reg_name
    # reg_name tidak lagi mencakup entitas #
    ...
    set pin_id [get_pins ${reg_name}|clk] # reg_name tidak lagi
    mencakup entitas, sehingga get_pins berhasil
}

Isi halaman ini adalah kombinasi terjemahan manusia dan komputer dari konten berbahasa Inggris. Konten ini diberikan hanya untuk kenyamanan Anda serta sebagai informasi umum dan tidak bisa dianggap sebagai lengkap atau akurat. Jika terdapat kontradiksi antara versi bahasa Inggris halaman ini dan terjemahannya, versi bahasa Inggris akan didahulukan. Lihat versi bahasa Inggris halaman ini.