2016-08-19 2 views
1

Я новичок в systemverilog и пытаюсь создать тестовый стенд systemverilog. У меня есть DUT, который должен быть подключен к одному из двух внешних модулей через мультиплексор. Я хочу переключить соединение во время моделирования, и я хочу использовать интерфейсы systemverilog для соединения между тестируемым устройством и мультиплексором, а также соединение между мультиплексором и двумя внешними модулями. Сигналы в интерфейсе являются двунаправленными.Мультиплексор интерфейса SystemVerilog

Я столкнулся с проблемой записи мультиплексора. Я получаю ошибку для текущей реализации, что LHS выражения не может быть проводом. Если я изменю тип интерфейса на логику, я получаю сообщение об ошибке, что это невозможно с двунаправленными сигналами. Я попытался Google, но я не нашел никаких учебных пособий по подключению интерфейса к интерфейсу. Разве это невозможно? Или есть лучший способ сделать то, что я пытаюсь сделать?

До сих пор у меня есть следующие:

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

Интерфейсы в этом случае просто пучок проводов. Кажется, что нет ничего плохого в вашем коде. Но если вы пытаетесь назначить интерфейс напрямую друг другу на основе сигнала выбора, это не сработает. Вам необходимо будет назначить все провода индивидуально на основе сигнала выбора. Для интерфейсов мультиплексоров нет ничего особенного.

Приведенный ниже код делает мультиплексор.

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 

Ссылка на интерфейс учебник - https://www.doulos.com/knowhow/sysverilog/tutorial/interfaces/

+0

Спасибо за Ваш комментарий, но Unforunately код полностью это не распространяется делать то, что я хочу: все сигналы bidicrectional. В моей симуляции я могу видеть следующее: При выборе = 0 все изменения на flash_connect_interface_i_1.interface_f_cle передаются на flash_connect_interface_i_0.interface_f_cle. Но не наоборот, что делает соединение не двунаправленным. – Antonio

+0

В случае двунаправленных сигналов обычно используются квалификационные сигналы, которые используются для инициирования изменения направления шины. Мы могли бы использовать это в модели, чтобы делать подобные вещи. –

+0

Вы имеете в виду добавить эту функциональность в мультиплексор? Что-то вроде: если (реж = 0) правопреемником interface_i_1.interface_f_cle = interface_i_0.interface_f_cle еще правопреемником interface_i_0.interface_f_cle = interface_i_1.interface_f_cle – Antonio

Смежные вопросы