2008-09-15 44 views
6

Tôi có mô-đun "người theo dõi" hiện đang sử dụng phân cấp toàn cầu bên trong nó. Tôi cần phải khởi tạo một trường hợp thứ hai của điều này với một hệ thống thứ bậc toàn cầu thứ hai.Chuyển hệ thống phân cấp vào mô-đun Verilog

Hiện tại:

module watcher; 
wire sig = `HIER.sig; 
wire bar = `HIER.foo.bar; 
... 
endmodule 

watcher w; // instantiation 

mong muốn:

module watcher(input base_hier); 
wire sig = base_hier.sig; 
wire bar = base_hier.foo.bar; 
... 
endmodule 

watcher w1(`HIER1); // instantiation 
watcher w2(`HIER2); // second instantiation, except with a different hierarchy 

ý tưởng tốt nhất của tôi là sử dụng vpp (Verilog Preprocessor) để brute-lực lượng tạo ra hai mô-đun hầu như giống hệt nhau (một với mỗi hệ thống phân cấp) , nhưng có cách nào thanh lịch hơn không?

Trả lời

8

Sở thích của tôi là có một mô-đun đơn (hoặc một số nhỏ mô-đun) trong testbench của bạn có chứa tất cả các đầu dò của bạn nhưng không có chức năng nào khác. Tất cả các mô-đun khác trong testbench của bạn yêu cầu đầu dò rồi kết nối với "mô-đun thăm dò" đó. Sử dụng giao diện SystemVerilog ưu tiên các dây thô nếu đó là tùy chọn cho bạn. Điều này phá vỡ vấn đề của bạn vì không có người xem nào yêu cầu hệ thống phân cấp toàn cầu và testbench của bạn trên toàn bộ sẽ dễ dàng hơn để duy trì. Xem Law of Demeter.

Ngoài ... (nhưng điều này đặt hệ thống cấp bậc trong sự khởi tạo của bạn ...)

module watcher(sig, bar); 
    input sig; 
    input bar; 
... 
endmodule 

watcher w1(`HIER1.sig, `HIER1.foo.bar); // instantiation 
watcher w2(`HIER2.sig, `HIER2.foo.bar); // second instantiation, except with a different hierarchy 

Sau đó bạn cũng có thể:

`define WATCHER_INST(NAME, HIER) watcher NAME(HIER.sig, HIER.foo.sig) 

`WATCHER_INST(w1, `HIER1); 
`WATCHER_INST(w2, `HIER2); 
+0

Cảm ơn bạn đã phản hồi và tôi chắc chắn đồng ý với hầu hết các điểm của bạn nói chung. Thật không may trong trường hợp này module có ~ 100 dây dò trong nội bộ, do đó chuyển đổi chúng thành đầu vào rõ ràng, trong khi rõ ràng hơn, khá lộn xộn. – pdq

+1

Xin chào pdq. Tôi đoán đó là lý do tại sao tôi đề cập đến các giao diện SV. Ít nhất bạn có thể đóng gói chúng vào một số nhóm hợp lý và truy cập các dây từ bên trong mô-đun của bạn bằng cách sử dụng ký hiệu chấm. – DMC

2

Bạn có thể sử dụng từ khóa SystemVerilog bind để ràng buộc các module vào mỗi phân cấp yêu cầu nó? (Điều này yêu cầu bạn sử dụng SystemVerilog và có giấy phép cho trình giả lập.)

Sử dụng liên kết giống như tạo mô-đun theo cách thông thường, ngoại trừ việc bạn cung cấp đường dẫn đến phân cấp mà mô-đun được "tạo từ xa" :

bind top.my.hier my_module instance_name(.*); 
bind top.my_other.hier my_module instance_name(.*); 

Thậm chí tốt hơn: giả sử rằng mỗi phân cấp mà bạn đang ràng buộc vào là một phiên bản riêng biệt của cùng một mô-đun. Sau đó:

bind remote_module my_module instance_name(.*); 

này liên kết với mô-đun của bạn vào mọi trường hợp của mục tiêu, bất kể nó ở đâu trong thiết kế. Điều này rất mạnh nếu mô-đun của bạn là trình kiểm tra xác minh.

Các vấn đề liên quan