§Trước tiên: cần gì để chạy?
Completion đọc 4 database sinh sẵn trong thư mục 0_ENV. Bạn
không phải nhớ từng cái — một lệnh \all_09 build tất cả. Bảng dưới
chỉ để bạn biết file nào ở đâu:
File (đặt ở 0_ENV/) | Là gì | Sinh bằng |
|---|---|---|
project.tags | Mọi symbol: define, module, signal, class, function… | \tg |
project.hier | Cây phân cấp thật (instance + signal + class) | \hr |
project.pathmap | Ánh xạ `define Verilog ↔ đường dẫn | \hr |
project.hdlmap | Ánh xạ hdl-key UVM (trong "…") ↔ đường dẫn | \hr |
ACách nhanh nhất — một lệnh
Mở một file .sv/.v trong Vim, ở Normal mode gõ:
\all_09 ← build cả 4 database, tuần tự. Chờ đến khi hiện "=== \all XONG ==="
Xong — dùng được ngay. Lần đầu hơi lâu (quét ~2000+ file): tags ~30s, pathmap ~20s, hdlmap ~30s. Về sau chỉ chạy lại khi mã nguồn đổi nhiều.
BBước Verdi — để cây phân cấp chính xác 100%
project.hier do một parser tĩnh đoán từ mã nguồn — nó không resolve
được `ifdef, generate-if(param), mảng instance [N].
Verdi (đã elaborate design với đúng +define của testcase) là
nguồn chân lý. Muốn cây chuẩn xác tuyệt đối thì làm thêm bước này.
source …09_extract_verdi_hier.tcl (trong Verdi) →
sinh 0_ENV/verdi_hier.txt →
về Vim gõ \hr (tự merge).
- 1
Mở Verdi GUI như bình thường
Trên máy có Verdi + license (máy compute thật) — không phải container B31/B32. Ví dụ chạy
z_run_ide.cshđể load design. - 2
Trong console Tcl của Verdi, gõ đúng một dòng
source ~/A0_scripts/AS010_VIMRC/source/09_extract_verdi_hier.tclThay bằng đường dẫn tới file
.tcltrên máy bạn nếu khác. - 3
Script tự ghi kết quả ra
0_ENV/verdi_hier.txtBạn không cần quan tâm Verdi đang ở thư mục nào: script tự leo lên tìm
0_ENVvà luôn đặt file ở đó. Không đóng Verdi GUI của bạn. - 4
Quay lại Vim, gõ
\hr(hoặc\all_09)\hrtự phát hiện0_ENV/verdi_hier.txt, dùng Verdi làm chuẩn vá lạiproject.hier, rồi sinh tiếppathmap+hdlmap. Xong.
Nếu máy bạn đã có sẵn 0_ENV/verdi_hier.hier (bản 5 cột đã merge từ trước),
\hr cũng tự nhận và dùng nó — không cần làm gì thêm. Nếu không có cả hai,
\hr vẫn chạy với cây do parser tĩnh sinh (kém chính xác hơn một chút).
✓Kiểm tra đã sẵn sàng
# Trong shell: ls -la 0_ENV/project.tags 0_ENV/project.hier 0_ENV/project.pathmap 0_ENV/project.hdlmap # Trong Vim: gõ \help_09 — nếu hiện bảng hướng dẫn là OK.
1Gợi ý cơ bản — Tab
Ở Insert mode, gõ vài ký tự rồi bấm Tab. Popup gợi ý các symbol khớp (define, module, signal, class, function…). Bật auto-popup bằng F6 để khỏi bấm Tab.
Define Verilog / SV
Gõ PATH_SYS + Tab → chèn `PATH_SYSCTL (tự thêm
backtick). Gõ sẵn ` cũng không bị nhân đôi.
Ưu tiên đúng ngữ cảnh
Symbol trong file đang sửa nổi lên đầu; trùng tên chỉ hiện một lần; thư mục include ưu tiên cao hơn gốc dự án.
2Đi sâu theo cây phân cấp — . + Tab
Gõ một đường dẫn rồi dấu chấm + Tab để liệt kê con thật của nó. Có 3 kiểu đường dẫn, module tự nhận biết:
a) Đường dẫn phân cấp thẳng — top.…
top.sysss_dut.▏ DCDC_model instance OPBT_drive instance SYSCTL instance apb_sel signal bist_model instance msystop0_awo instance msystop0_iso instance … (còn nữa)
Con thực của top.sysss_dut — instance đứng trên, signal dưới.
b) Define Verilog — `PATH_X. + Tab
assign x = `PATH_SYSCTL.▏ # = top.sysss_dut.SYSCTL awovdd_TOP isovdd_TOP pllvdd_TOP hocovdd_TOP ADMODE ADPSM ADNCMP ADNSMP RESETZ … (800 con)
`PATH_SYSCTL được dịch sang top.sysss_dut.SYSCTL rồi liệt kê con của nó.
c) ⭐ Đường dẫn UVM trong chuỗi — "hdl_key. + Tab
sys.force_hdl("sysctl.▏ # "sysctl" = top.sysss_dut.SYSCTL awovdd_TOP isovdd_TOP hocovdd_TOP pllvdd_TOP ADMODE ADPSM ADNCMP ADNSMP ADRSRV … (800 con)
Trong dấu nháy kép, hdl-key (như sysctl) được dịch qua
project.hdlmap — không dùng define `PATH. Ngoài chuỗi thì
sysctl. sẽ không gợi ý (tránh nhầm).
3Rút gọn / Bung đường dẫn — cl / ep
Đặt con trỏ trên một đường dẫn (Normal mode) rồi bấm cl (collapse — rút gọn) hoặc ep (expand — bung). Hiện menu có màu; chọn bằng số + Enter. Cột [x|y]: x = số cấp được rút, y = số cấp còn lại.
Trong chuỗi UVM → dùng hdl-key (không dấu `)
sys.force_hdl("top.sysss_dut.SYSCTL.MRAMVCCFLTW", 8'hff); [cc] Trang 1/1 | số+<Enter>=chọn <Space>/n=sau p=trước <Esc>/q=huỷ 1. [3|1] sysctl.MRAMVCCFLTW 2. [2|2] dut.SYSCTL.MRAMVCCFLTW 3. [2|2] sysss_dut.SYSCTL.MRAMVCCFLTW 4. [0|4] top.sysss_dut.SYSCTL.MRAMVCCFLTW > chọn số (1-4): ▏
Chọn 1 → "sysctl.MRAMVCCFLTW" (dấu nháy giữ nguyên).
Mục [0|4] là đường dẫn tuyệt đối đầy đủ (không rút).
Ngoài chuỗi (Verilog) → dùng `define (có dấu `)
[cc] Trang 1/1 | số+<Enter>=chọn … 1. [3|1] `PATH_SYSCTL.awovdd_TOP 2. [3|1] `SYSCTL.awovdd_TOP 3. [2|2] `PATH_DUT.SYSCTL.awovdd_TOP 4. [2|2] `PATH_SYSSS_DUT.SYSCTL.awovdd_TOP 5. [0|4] top.sysss_dut.SYSCTL.awovdd_TOP … (còn nữa)
ep làm ngược lại: đưa đường dẫn tuyệt đối [0|…] lên đầu để bung ra. Menu tối đa 25 mục/trang — Space/n sang trang, p lùi, Esc/q huỷ.
4Bảng lệnh đầy đủ
| Lệnh | Việc |
|---|---|
\all_09 | Build TẤT CẢ (tags + hier + pathmap + hdlmap) — dùng cái này là đủ. |
\tg | Build riêng project.tags. |
\hr | Build project.hier (+ merge Verdi nếu có) + pathmap + hdlmap. |
\hp | Build riêng project.pathmap. |
\hh | Build riêng project.hdlmap. |
\help_09 | In hướng dẫn nhanh (bảng lệnh + ví dụ). |
\all / \help | Liệt kê mọi module \all_xx / \help_xx đang có. |
| Tab | Gợi ý code (Insert mode). |
| F6 | Bật/tắt auto-popup. |
| cl / ep | Rút gọn / bung đường dẫn dưới con trỏ (Normal mode). |
Quên tên lệnh? Gõ \all hoặc \help (thuần)
[\all] Các lệnh build-tất-cả đang có (gõ tên để chạy): \all_09 CodeCompletion: build tags + hier + pathmap + hdlmap \all_10 (ví dụ module tương lai) Ví dụ: \all_09
Gõ \all và dừng ~1 giây → danh sách. Gõ liền \all_09 → chạy ngay.
(Sau này có nhiều module, mỗi module tự đăng ký vào danh sách này.)
?Xử lý sự cố
| Triệu chứng | Cách xử lý |
|---|---|
| Tab không gợi ý gì | Chưa build DB → chạy \all_09. |
`PATH_X. báo không thấy | Chưa có pathmap, hoặc define đó không phải đường dẫn → \hp. |
"hdl. không ra con | Chưa có hdlmap → \hh (hoặc \all_09). |
cl/ep trong chuỗi báo cần hdlmap | Chạy \hr để sinh project.hdlmap. |
| Cây phân cấp sai (thiếu/thừa instance) | Parser tĩnh đoán sai → làm bước Verdi (Tab 1 · §B) rồi \hr. |