Vim · Verilog / SystemVerilog / UVM

Code Completion — Hướng dẫn sử dụng

Gợi ý code thông minh, đi sâu theo cây phân cấp, rút gọn / bung đường dẫn — kể cả đường dẫn UVM trong chuỗi force_hdl("…").

module 09 · 09_code_completion.vim

§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.tagsMọi symbol: define, module, signal, class, function…\tg
project.hierCâ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.

⚑ Luồng Verdi — chỉ cần nhớ 3 mốc

source …09_extract_verdi_hier.tcl (trong Verdi) → sinh 0_ENV/verdi_hier.txt → về Vim gõ \hr (tự merge).

  1. 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. 2

    Trong console Tcl của Verdi, gõ đúng một dòng

    source ~/A0_scripts/AS010_VIMRC/source/09_extract_verdi_hier.tcl

    Thay bằng đường dẫn tới file .tcl trên máy bạn nếu khác.

  3. 3

    Script tự ghi kết quả ra 0_ENV/verdi_hier.txt

    Bạn không cần quan tâm Verdi đang ở thư mục nào: script tự leo lên tìm 0_ENV và luôn đặt file ở đó. Không đóng Verdi GUI của bạn.

  4. 4

    Quay lại Vim, gõ \hr (hoặc \all_09)

    \hr tự phát hiện 0_ENV/verdi_hier.txt, dùng Verdi làm chuẩn vá lại project.hier, rồi sinh tiếp pathmap + hdlmap. Xong.

ℹ Không có verdi_hier.txt?

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.

tự thêm dấu `

Define Verilog / SV

PATH_SYS + Tab → chèn `PATH_SYSCTL (tự thêm backtick). Gõ sẵn ` cũng không bị nhân đôi.

lọc thông minh

Ư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.…

Insert mode · project.hier
  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

Insert mode · pathmap → hierarchy
  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

Insert mode · hdlmap (chỉ trong "…")
  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.hdlmapkhô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 `)

Normal mode · bấm cl trên đường dẫn trong "…"
  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 `)

Normal mode · bấm cl trên đường dẫn Verilog
  [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ệnhViệc
\all_09Build TẤT CẢ (tags + hier + pathmap + hdlmap) — dùng cái này là đủ.
\tgBuild riêng project.tags.
\hrBuild project.hier (+ merge Verdi nếu có) + pathmap + hdlmap.
\hpBuild riêng project.pathmap.
\hhBuild riêng project.hdlmap.
\help_09In hướng dẫn nhanh (bảng lệnh + ví dụ).
\all / \helpLiệt kê mọi module \all_xx / \help_xx đang có.
TabGợi ý code (Insert mode).
F6Bật/tắt auto-popup.
cl / epRú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)

Normal mode · gõ \all rồi dừng ~1 giây
[\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

\alldừ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ứngCách xử lý
Tab không gợi ý gìChưa build DB → chạy \all_09.
`PATH_X. báo không thấyChưa có pathmap, hoặc define đó không phải đường dẫn → \hp.
"hdl. không ra conChưa có hdlmap → \hh (hoặc \all_09).
cl/ep trong chuỗi báo cần hdlmapChạ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.