Interfaces in SystemVerilog - 2
SystemVerilog allows tasks and functions to be declared within interface definitions known as interface methods. The task or function has the same syntax as when declared in a module. Using these interface methods, the communication protocol details can be embedded within the interface definition itself.
-
interface ahb_bus (input logic ahb_hclk, ahb_hresetn); // Interface can have ports.
-
wire [31:0] ahb_hdata;
-
wire [31:0] ahb_addr;
-
logic ahb_hwrite;
-
logic [1:0] ahb_htrans;
-
logic [2:0] ahb_hsize;
-
logic [2:0] ahb_hburst;
-
logic ahb_hready;
-
logic [1:0] ahb_hresp;
-
-
// Task defined internal to interface
-
task slave_read ( input logic [31:0] raddr);
-
// ...
-
endtask
-
-
endinterface
Interface methods can also be imported if they are not defined within the interface definition itself. If an interface is connected using modport construct, then the import keyword is used to specify the method. Alternative way is to add the task keyword next to the import and also include function arguments - this is required if the task is exported from an external module.
-
interface ahb_bus (input logic ahb_hclk, ahb_hresetn); // Interface can have ports.
-
wire [31:0] ahb_hdata;
-
wire [31:0] ahb_addr;
-
logic ahb_hwrite;
-
logic [1:0] ahb_htrans;
-
logic [2:0] ahb_hsize;
-
logic [2:0] ahb_hburst;
-
logic ahb_hready;
-
logic [1:0] ahb_hresp;
-
-
modport slave ( import slave_read, // simplest way of importing tasks
-
inout ahb_hdata,
-
input ahb_haddr,
-
input ahb_hsize,
-
output ahb_hready,
-
---
-
);
-
-
// Alternative explicit way
-
modport slave ( import task slave_read (input [31:0] addr), // explicit
-
inout ahb_hdata,
-
input ahb_haddr,
-
input ahb_hsize,
-
output ahb_hready,
-
---
-
);
Importing a task or a function through a modport gives the module access to that task by prepending the interface port name to the task name as with other variables. The imported function/task must be declared as automatic in order to be synthesizable.
SV also includes a way to export a task defined in one module to be available to other modules through an interface. For example, if a function is defined in module A and is exported in the modport construct within interface definition using the export keyword, then the task is available to module B that uses that modport. However, this is not synthesizable and we cannot export the same function from multiple instances of a module.
It is also possible to define a task or function using extern keyword without associating it with the modport construct.
-
interface shb_bus (....)
-
---
-
extern check_parity (input logic [31:0] data); // Not associated with modport
-
-
modport ahb_slave (...);
-
-
endinterface
-
-
module A (...);
-
-
task check_parity (input logic [31:0] data);
-
// --
-
endtask
-
endmodule
Interfaces can also contain procedural blocks like always, always_ff, parameters and generate statements similar to modules.
Sphere: Related Content