2013-06-22 2 views
0

В этом примере, как создать заявление одного интерфейса связывания, которые могут быть повторно использованы для обоих портов модуля:Как связать интерфейс с несколькими портами без дублирующего кода?

module adderSubtractor2(
    input   clk, 
    input [7:0]  a0, 
    input [7:0]  b0, 
    input   doAdd0, // if this is 1, add; else subtract 
    output reg [8:0] result0 
`ifdef HAS_UNIT_2 
    , 
    input [7:0]  a1, 
    input [7:0]  b1, 
    input   doAdd1, // if this is 1, add; else subtract 
    output reg [8:0] result1 
`endif 
); 
    // ... 
endmodule 

interface adderSubtractor_if(
    input bit clk, 
    input [7:0] a, 
    input [7:0] b, 
    input  doAdd, 
    input [8:0] result 
); 
    // ... 
endinterface: adderSubtractor_if 

// BIND STATEMENT(S) HERE 

// The test that will be run on the DUT 
program automatic test(adderSubtractor_if addSub); 
    initial begin 
    // do stuff with interface 
    end 
endprogram // test 

// The top level testbench. 
module testbench; 
    reg clk; 
    adderSubtractor2 dut(.clk (clk)); 
    test test0(dut.adderSubtractor_if0); 
`ifdef HAS_UNIT_2 
    test test1(dut.adderSubtractor_if1); 
`endif 

    // ... 
endmodule // testbench 
+0

Я не могу понять, что вы пытаетесь сделать. Вы определили интерфейс, но вы его вообще не используете. Вы спрашиваете об использовании интерфейсов или о том, как создать экземпляр переменной количества интерфейсов для вашего модуля? – Vasiliy

+0

Я добавил дополнительные строки в пример выше, чтобы показать, как будет подключен интерфейс. –

ответ

2

Я считаю, что то, что вы ищете, является параметризуемым интерфейсом.

В общем, маскирующие порты с `ifdef очень рискованны, и у вас должны быть очень веские причины для этого. Уже была дискуссия по этому вопросу here.

Я не вижу причин использовать `ifdef в вашем случае. Вы можете:

  1. определить параметр NUM_OF_INSTANCES
  2. определяют все (за исключением CLK и RST) порты модуля в качестве упакованных массивов. то есть

    ввод [1: NUM_OF_INSTANCES] [7: 0] a;

  3. использование «генерировать для» заявления внутри модуля для создания экземпляра несколько сумматоров

  4. Использование параметризуемым интерфейса и связать его с портами модуля обычным способом.

Надеюсь, это поможет.

+0

В моем случае модули модуля adderSubtractor2 и весь код внутри этого модуля исправлены - код исходит из другой команды, и они не изменят его. Каковы мои выборы с точки зрения проверки? –

+0

Стреляйте дизайнером, который написал код. Если это так, я предлагаю вам добавить отдельные привязки для каждого подмодуля (в разделе '' ifdef, конечно). Код с макросами, которые вы написали (даже если он работает) выглядит странно, и люди, которые будут смотреть на ваш код в будущем, пострадают. Вы все равно будете страдать - вам нужно будет добавить эти '' ifdefs в каждом месте вашего кода. Это очень плохой дизайн, и если он не может быть изменен - ​​код проверки также будет неудовлетворительным. Я могу думать о нескольких других параметрах, связанных с преобразованием, в параметры, но они также уродливы и могут не работать. – Vasiliy

+0

Кстати, не возражаете, если я добавлю ссылку на эту страницу в обсуждение '' ifdefs versus генерирует? Я думаю, что этот пример показывает большое злоупотребление \ ifdefs. – Vasiliy

0

Вы можете использовать макросы:

`define BIND_ADD_SUB(INDEX) \ 
bind adderSubtractor2 adderSubtractor_if adderSubtractor_if``INDEX``(\ 
    .clk(clk), \ 
    .a(a``INDEX``), \ 
    .b(b``INDEX``), \ 
    .doAdd(doAdd``INDEX``), \ 
    .result(result``INDEX``) \ 
); \ 

`BIND_ADD_SUB(0) 
`ifdef HAS_UNIT_2 
`BIND_ADD_SUB(1) 
`endif 

Затем пройти dut.adderSubtractor_if0 и dut.adderSubtractor_if1 на ваш тестовый стенд.