Monday, December 9, 2019

Một số câu lệnh cần thiết khi làm việc với gate net list

Tác giả: TrongTran
Ngày: 09/12/2019


Bài này mình sẽ hướng dẫn các bạn một số câu lệnh tcl để làm việc với gate net list (DC compiler.....).

Tuy nó không đủ nhưng mình tin là với bài viết này và nếu bạn chịu khó đọc thêm thì bạn hoàn toàn có thể hiểu được toàn bộ một môi trường synthesis và làm những công việc với gate cực nhanh (ECO).
Thực tế, một số bạn thích dùng phần mềm trực quan để kiểm tra hoặc debug.
Mình thì dùng cả hai và với một design lớn thì mình thích làm việc với command line hơn. Điều này sẽ giúp bạn rút ngắn được thời gian nhiều hơn.

Mình không làm backend nên mình không biết hết tất cả các lệnh. Mình chỉ nêu ra một số lệnh cần thiết và cơ bản nhất.

Trong bài này mình quy định màu đỏ là cú pháp câu lệnh. Màu xanh là option của câu lệnh và màu đen là phần người dùng điền vào (Có thể là tên biến, key word tìm kiếm ....).


Lệnh đầu tiên mình muốn nói là:

  • read_verilog design.v
  • current_design /current_block /current_lib
  • close_lib design.v
3 lệnh trên có chức năng là:
  • Load file Verilog design.v
  • Kiểm tra design hiện tại đang được load.
  • Đóng file Verilog design.v



get_cell tên_cell

get_cells -[option] tên_cell


Hai câu lệnh trên là nhầm lấy các cell trong một design dựa vào key word trong đã biết.

Ví dụ: bạn muốn lấy 1 cell có chứa key word “AND” bạn dùng lệnh:

get_cells -hierarchical *AND*

Điểm khác biệt giữa get_cells và get_cell là get_cell không dùng được với option còn get_cells thì có.

Một điểm lưu ý nữa là khi bạn có link đầy đủ của 1 cell thì bạn có thể dùng lệnh

get_cells top/AND (Nhớ là không dùng option –hierarchical nhé).

Còn khi bạn chưa biết link instance đầy đủ hoặc cần lấy tất cả các cell chứa key word nào đó bạn dùng lệnh:

get_cells –hierarchical *AND*




get_net tên_net

get_nets –[option] tên_net

Hai câu lệnh này nhầm lấy net name trong design dựa vào key word đã biết. Cách dùng tương tự hai câu lệnh get_cell bên trên.

Để tạo ra một bộ collection của các phần tử (cell, net, port, ….) bạn dùng cặp lệnh:

set NET_COL {}

set NET_COL [add_to_collection $NET_COL [get_nets -hierarchical "AND"]]

Dòng đầu là để khai báo bộ collection tên NET_COL.

Dòng thứ hai là để tìm tất cả các net chứa key word “AND” và lưu vào collection NET_COL.

set NET_TARGET {}

set NET_REMOVE{}

set NET_TARGET [add_to_collection $NET_TARGET [get_nets -hierarchical "AND"]]

set NET_REMOVE [add_to_collection $NET_REMOVE [get_nets -hierarchical "2"]]

set NET_TARGET [remove_from_collection ${NET_TARGET} ${NET_REMOVE}]

Giả sử bạn tìm được các net chứa key word “AND”. Bây giờ bạn cần loại bỏ các net chứa key word số “2” trong bộ collection trên. Tập lệnh bên trên sẽ giúp bạn.

if {[sizeof_collection $NET_TARGET] != 0} {

}

Dòng code trên đang tiến hành kiểm tra xem liệu bộ collection NET_TARGET có chứa phần tử nào không (size # 0), nếu có thì tiến hành các lệnh bên trong dấu ngoặc {}.

foreach_in_collection port_gnd_0 $NET_TARGET {

}

Dòng code trên nhầm lấy từng phần tử trong bộ sưu tập NET_TARGET ra để tiếp tục xử lí bên trong cặp dấu {}. Cái này giống câu lệnh foreach trong cshell nhé.


Lúc bạn lưu net name vào bộ sưu tập NET_COL, các giá trị sẽ lưu dạng 1 phần tử trong design chứ không phải dạng chuỗi.

Nếu bạn muốn chuyển phần tử đó sang dạng chuỗi nhầm dễ xử lí hãy dùng câu lệnh:

set name_2 [get_object_name $port_gnd_0]

Trước khi thực hiện câu lệnh này, bạn phải thực hiện câu lệnh bên trên nhầm chuyển phần tử sang chuỗi nhé. Giả sử trong bộ collection đó, bạn chỉ muốn thao tác với một vài phần tử có chứa key word cụ thể. Bạn nên dùng lệnh bên dưới, Câu lệnh này được dùng thường xuyên luôn nhé, hãy ghi nhớ thật kĩ:

if {[regexp "sync" $name_2]} {

}

Hoặc

if {[regexp {A|B} $name_2]} {

}

Hoặc

if {[regexp {A&B} $name_2]} {

}

Câu lệnh số 2 là nếu chứa key word A hoặc B.

Câu lệnh số 3 là nếu chứa key word A và B.


Bạn đang có 1 collection của các port. Bây giờ bạn muốn chỉ xử lí chỉ các port output. Câu lệnh bên dưới sẽ giúp bạn. Tương tự cho các port input nhé (Thay “out bằng “in”).

if {[get_attribute ${port} direction] == "out"} {

}

Để kiểm tra xem port /net cụ thể có bao nhiêu phân nhánh mình có câu lệnh bên dưới:

set fanout_name [sizeof_collection [all_fanout -from [get_ports “AND”]]]

Câu lệnh để kiểm tra xem có tồn tại thư mục với tên nào đó không. Ta có câu lệnh sau:

if { [file exists $FOLDER] && [file isdirectory $FOLDER] } {

}

In ra một chuỗi, Bạn có lệnh sau:

puts “Hello world”

Để chạy 1 script viết bằng ngôn ngữ khác trong file tcl, Bạn có câu lệnh sau:

exec ./run.pl

Đễ chạy 1 câu lệnh cshell trong file tcl bạn chạy lệnh như bên dưới:

sh mkdir folder

Khi bạn có 1 link của instance name và bạn muốn biết module name của instance này là gì trong design hãy dùng câu lệnh sau:

get_attribute top/sub_0/sub_1 ref_name

Câu lệnh get_attribute rất mạnh nhé. Hãy vào chế độ command line của các tool và chạy lệnh:

man get_attribute

Để biết được hướng dẫn của chúng.

Nếu bạn còn có câu lệnh nào chưa biết hãy gửi mail hoặc comment góp ý với mình nhé.

1 comment:

  1. Anh có thể giải thích rõ hơn giúp Em về những lệnh này được không ạ:
    get_nets
    get_pins
    get_flat_cells/nets/pins
    get_flat_cells -filter
    insert_buffer
    get_cells/nets/pins –hierarchy
    get_object_name
    get_lib_cells
    change_selection
    Em cám ơn ạ!

    ReplyDelete

Cách tính BW và latency trong 1 hệ thống SoC sử dụng chuẩn giao tiếp AXI protocol

Tác giả:  TrongTran Ngày:  31/12/2019 Nếu bạn nào đang làm về verification cho system performance (ST) thì bài này sẽ bổ ích cho bạn. Ngày ...