1
votes

I´m new to systemverilog and trying to build a systemverilog testbench. I have a DUT that should be connected to one of two external modules via a multiplexer. I want to switch the connection during simulation and I want to use systemverilog interfaces for the connection between the DUT and the multiplexer as well as the connection between multiplexer and the two external modules. The signals in the interface are bidirectional.

I am facing trouble writing the multiplexer. I´m getting an error for the current implementation that the LHS of the expression can´t be a wire. If I change the type in the interface to logic, I get an error that this is not possible with bidirectional signals. I tried to google, but I didn´t find any tutorials on connecting interface to interface. Is this not possible? Or is there a better way of doing what I´m trying to do?

So far I have the following:

interface flash_connect_interface;
  wire interface_f_cle;
  wire interface_f_ale;
endinterface: flash_connect_interface


module flash_connect_testbench_top;     
[...]  
  // Interfaces
  flash_connect_interface flash_connect_interface_i0();
  flash_connect_interface flash_connect_interface_i1();
  flash_connect_interface flash_connect_interface_i2();

  // Connecting DUT to interface
  flash_connect flash_connect_i0(  
  .flash_connect_interface_i(flash_connect_interface_i0),
  );

  // Multiplexer  
  flash_connect_mux mux1(
  .flash_connect_interface_i_0(flash_connect_interface_i0),
  .flash_connect_interface_i_1(flash_connect_interface_i1),
  .flash_connect_interface_i_2(flash_connect_interface_i2),   
  .select(sel) 
  );

  nand_model nand_model0 (
        .Cle      (flash_connect_interface_i1.interface_f_cle),
        .Ale      (flash_connect_interface_i1.interface_f_ale),
        );

  nand_model nand_model1 (
        .Cle      (flash_connect_interface_i2.interface_f_cle),
        .Ale      (flash_connect_interface_i2.interface_f_ale),
        );  
[...]   
endmodule // end testbench_top



module flash_connect_mux(
  flash_connect_interface flash_connect_interface_i_0,
  flash_connect_interface flash_connect_interface_i_1,
  flash_connect_interface flash_connect_interface_i_2,
  input select 
  );

  always_comb begin
    // *** Here is the problem ***  
    if (select == 1'b0) flash_connect_interface_i_1 = flash_connect_interface_i_0;    
    else flash_connect_interface_i_2 = flash_connect_interface_i_0;   
  end

endmodule
1

1 Answers

1
votes

The interfaces in this case is just bundle of wires . There seems nothing apparently wrong with your code. But if you are trying to assign interface directly to each other based on the select signal it will not work. You will need to assign all the wires individually based on the select signal. There is nothing special to mux interfaces.

The code below does the muxing.

interface flash_connect_interface;
  wire interface_f_cle;
  wire interface_f_ale;
endinterface: flash_connect_interface

module nand_model ( inout Cle , inout Ale ) ; // Sample nand model 

reg r = 1;
assign Cle = r?1:1'bz;
assign Ale = r?1:1'bz;

endmodule

module   flash_connect_mux  ( flash_connect_interface  flash_connect_interface_i_0 , flash_connect_interface flash_connect_interface_i_1 , flash_connect_interface 

flash_connect_interface_i_2 ,input [3:0] select ) ;
  // Interconnect interface assignment 
     assign flash_connect_interface_i_0.interface_f_cle = (select== 0)  ? flash_connect_interface_i_1.interface_f_cle : flash_connect_interface_i_2.interface_f_cle;
     assign flash_connect_interface_i_0.interface_f_ale =  (select== 0) ? flash_connect_interface_i_1.interface_f_ale : flash_connect_interface_i_2.interface_f_ale;
endmodule

  module flash_connect ( flash_connect_interface flash_connect_interface_i )  ;

        //check  flash_connect_interface_i.interface_f_cle ;
        //check  flash_connect_interface_i.interface_f_ale ;
  endmodule

module flash_connect_testbench_top;

reg [3:0] select ;
  // Interfaces
  flash_connect_interface flash_connect_interface_i0();
  flash_connect_interface flash_connect_interface_i1();
  flash_connect_interface flash_connect_interface_i2();

  // Connecting DUT to interface
  flash_connect flash_connect_i0(
  .flash_connect_interface_i(flash_connect_interface_i0)
  );

  // Multiplexer
  flash_connect_mux mux1(
  .flash_connect_interface_i_0(flash_connect_interface_i0),
  .flash_connect_interface_i_1(flash_connect_interface_i1),
  .flash_connect_interface_i_2(flash_connect_interface_i2),
  .select(select)
  );

  nand_model nand_model0 (
        .Cle      (flash_connect_interface_i1.interface_f_cle),
        .Ale      (flash_connect_interface_i1.interface_f_ale)
        );

  nand_model nand_model1 (
        .Cle      (flash_connect_interface_i2.interface_f_cle),
        .Ale      (flash_connect_interface_i2.interface_f_ale)
        );

endmodule // end testbench_top

Link to interface tutorial - https://www.doulos.com/knowhow/sysverilog/tutorial/interfaces/