// DESCRIPTION: Verilator: Functionally demonstrate an array of interfaces // // This file ONLY is placed into the Public Domain, for any use, // without warranty, 2015 by Todd Strader. interface foo_intf; logic a; modport source ( output a ); modport sink ( input a ); endinterface function integer identity (input integer val); return val; endfunction module t (/*AUTOARG*/ // Inputs clk ); input clk; localparam N = 5; logic [N-1:0] a_in; logic [N-1:0] a_out; logic [N-1:0] ack_out; foo_intf foos [N-1:0] (); // Deferred link dotting with genvars generate genvar i; for (i = 0; i < N-4; i++) begin : someLoop assign ack_out[i] = a_in[i]; assign foos[i].a = a_in[i]; assign a_out[i] = foos[i].a; end endgenerate // Defferred link dotting with localparam localparam THE_LP = N-3; assign ack_out[THE_LP] = a_in[THE_LP]; assign foos[THE_LP].a = a_in[THE_LP]; assign a_out[THE_LP] = foos[THE_LP].a; // Defferred link dotting with arithmetic expression assign ack_out[N-2] = a_in[N-2]; assign foos[N-2].a = a_in[N-2]; assign a_out[N-2] = foos[N-2].a; // Defferred link dotting with funcrefs assign ack_out[identity(N-1)] = a_in[identity(N-1)]; assign foos[identity(N-1)].a = a_in[identity(N-1)]; assign a_out[identity(N-1)] = foos[identity(N-1)].a; initial a_in = '0; always @(posedge clk) begin a_in <= a_in + { {N-1 {1'b0}}, 1'b1 }; if (ack_out != a_out) begin $display("%%Error: Interface and non-interface paths do not match: 0b%b 0b%b", ack_out, a_out); $stop; end if (& a_in) begin $write("*-* All Finished *-*\n"); $finish; end end endmodule