2013-01-21 19 views
5

Czy istnieje jakiś syntezowalny sposób przekazania interfejsu do funkcji lub zadania? Mój przypadek użycia jest następujący: Mam pakiet z kilkoma funkcjami (chociaż mógłbym przekonwertować je na zadania, jeśli to pomaga :)), z których wszystkie mogą być używane w module i mogą potrzebować dostępu do portów modułu. Teraz zwykle zgrupowałem wszystkie porty w interface, dodałem je do modułu i przekazałem jako funkcję virtual. Jednak podręcznik mojego narzędzia do syntezy wspomina, że ​​virtual nie jest obsługiwany.SystemVerilog: przekazywanie interfejsów do funkcji/zadań (do syntezy!)

Czy brakuje mi czegoś? Musi istnieć sposób na zapewnienie portów dla zadań do syntezy, podobnych do argumentów VHDL: signal?

Niektóre przykładowy kod:

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 

Idealnie zadanie mypack::do_something byłby w stanie wykorzystać porty jako porty, to znaczy czekać na zmiany zachodzące na nich napisać im wartości, etc; w zasadzie to samo można osiągnąć w VHDL, przekazując je jako argumenty signal (w przeciwieństwie do argumentów variable lub constant).

+0

Czy możesz dodać kod? –

Odpowiedz

2

Zwykle zadeklarowałeś dowolne funkcje specyficzne dla interfejsu w samej definicji interfejsu. W ten sposób wszelkie deklaracje zadań lub funkcji mają już porty interfejsu w zakresie.

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

Dzięki za pomysł. Jednak w moim przypadku funkcja implementuje specyficzne dla modułu zachowanie, które po prostu używa niektórych portów modułu. Ta dziwna obojętność wynika z faktu, że kod jest generowany automatycznie i wykorzystuje funkcje/pakiety z przyczyn poza tym pytaniem;). – rainer

2

Niestety wygląda na to, że interfejs musi być wirtualny, aby mógł zostać przekazany przez listę funkcji lub portów zadań.

SystemVerilog IEEE Std 1800-2009 mówi lista port funkcja musi być data_type. Zobacz rozdział 13.4, Aneks A.2.6 i Składnia 13-2 dla składni deklaracji funkcji. I patrz A.2.2.1 do definiowania typ danych. Sprawdziłem także IEEE Std 1800-2005 i wydaje się, że ma takie samo ograniczenie, po prostu nie jest jasno napisane. Patrz rozdział 12.3 i załącznik A z 1800-2005.

Jeśli chcesz użyć interfejsu, spróbuj użyć funkcji translacji w interfejsie, aby struct (może wymagać packed patrz IEEE Std 1800-2009 Sekcja 13.4, przypis nr 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 

Alternatywnie zawsze możesz zrobić klasyczne `include "myports", gdzie zawsze potrzebna metoda.