2013-01-21 28 views
5

Có cách tổng hợp nào để truyền một giao diện đến một chức năng hay một nhiệm vụ không? Trường hợp sử dụng của tôi là như sau: Tôi có một gói với một số chức năng (mặc dù tôi có thể chuyển đổi chúng thành công việc, nếu điều đó giúp :)), tất cả đều có thể được sử dụng trong mô-đun và có thể cần truy cập các cổng của mô-đun. Bây giờ, thông thường tôi sẽ chỉ nhóm tất cả các cổng trong một interface, thêm nó vào mô-đun và chuyển nó thành virtual cho hàm. Tuy nhiên, hướng dẫn sử dụng công cụ tổng hợp của tôi đề cập rằng virtual không được hỗ trợ.SystemVerilog: Truyền các giao diện cho các chức năng/nhiệm vụ (để tổng hợp!)

Tôi có thiếu gì không? Phải có cách để cung cấp cổng cho các nhiệm vụ tổng hợp, tương tự như đối số signal của VHDL?

Một số mã ví dụ:

module mymod (
    input logic clk, 
    input logic rst, 
    input uint16_t adr, 
    input bit cyc, 
    input uint32_t dat_m, 
    input bit stb, 
    input bit we, 
    output bit ack, 
    output uint32_t dat_s 
    ); 

    always_comb begin 
     mypack::do_something(a, b, c, adr, cyc, dat_m, stb, we, ack, dat_s); 
endmodule 

Lý tưởng nhất, nhiệm vụ mypack::do_something sẽ có thể sử dụng các cảng như cảng, ví dụ: chờ đợi những thay đổi trên chúng, viết giá trị cho họ, vv; về cơ bản, giống như bạn đạt được trong VHDL bằng cách chuyển chúng thành đối số signal (ngược với đối số variable hoặc constant).

+0

Bạn có thể đăng một số mã không? –

Trả lời

2

Thông thường bạn sẽ khai báo bất kỳ chức năng giao diện cụ thể nào trong chính định nghĩa giao diện. Bằng cách đó, bất kỳ nhiệm vụ hoặc khai báo hàm nào đã có các cổng giao diện trong phạm vi.

interface int1(ports...); 
    function func1(args...); 
    // Do stuff with ports and args 
    endfunction 
endinterface 

module mod1(input wire clk,interface intf); 
... 
    always @(posedge clk) 
    intf.func1(module_specific_data); 
... 
endmodule 
+0

Cảm ơn ý tưởng. Tuy nhiên, trong trường hợp của tôi, hàm thực thi hành vi của mô-đun cụ thể mà chỉ xảy ra khi sử dụng một số cổng của mô-đun. Ngưỡng này khá kỳ lạ là do mã được tự động tạo ra và sử dụng các hàm/gói vì các lý do bên ngoài câu hỏi này;). – rainer

2

Thật không may, có vẻ như giao diện phải được chuyển qua mặc dù chức năng hoặc danh sách cổng công việc.

SystemVerilog IEEE Std 1800-2009 cho biết danh sách cổng chức năng phải là data_type. Xem Phần 13.4, Phụ lục A.2.6 và Cú pháp 13-2 để biết cú pháp khai báo hàm. Và xem A.2.2.1 để xác định một data_type. Tôi đã kiểm tra IEEE Std 1800-2005 quá và nó cũng có vẻ có cùng một hạn chế, chỉ cần không viết ra rõ ràng. Xem Phần 12.3 và Phụ lục A của 1800-2005.

Nếu bạn muốn sử dụng một giao diện, hãy thử sử dụng một chức năng dịch thuật trong giao diện để tạo ra một cấu trúc (có thể yêu cầu packed, xem IEEE Std 1800-2009 Mục 13.4, chú thích số 12):

interface myif (/* ... */); 
/* signal list */ 
function mypack::var_list_s toStruct(); 
    /* make translation */ 
endfunction : toStruct 
endinterface : myif 

module mymod(myif my_if); 
always_comb 
    mypack::do_something(my_if.toStruct(), my_if.ack, my_if.dat_s); 
endmodule : mymod 

Ngoài ra, bạn luôn có thể thực hiện các phương pháp cổ điển `include "myports".

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