2016-10-11 3 views
0

Я новичок в Verilog и все еще изучаю его, но первое, что я думаю об этом, - это то, что все связано с соединениями портов. Итак, я наивно написал следующий код:Использование «назначить» для портов модуля привязки

module mult4(input wire [3:0] x, y, 
      output wire [7:0] z) 
    sum8 sh, sl, ss; 
    assign sl.x = (y[0] ? x : 0), 
      sl.y = (y[1] ? x : 0) << 1, 
      sh.x = (y[2] ? x : 0) << 2, 
      sh.x = (y[3] ? x : 0) << 3, 
      ss.x = sl.z, 
      ss.y = sh.z, 
      sl.cin = 0, 
      sh.cin = 0, 
      ss.cin = 0, 
      z = ss.z; 
endmodule 

и он не собирался работать вообще. Здесь sum8 это всего лишь 8-битный сумматор с следующей подписью:

module sum8(input wire  cin, // carry-in bit 
      input wire [7:0] x, y, // operands 
      output wire  cout, // carry-out bit 
      output wire [7:0] z); // result 

Конечно, я могу переписать этот код, чтобы сделать его компиляции, но я хотел бы знать другую вещь. Есть ли способ достичь аналогичного внешнего вида в Verilog, или единственное место, где я могу определить отображение порта, находится в круглых скобках после имени модуля? Если да, есть ли причины для этого? У других HDL есть функция, как я хочу?

+0

Вы покажете, какую функциональность вы ищете? То есть, что представляет собой 'sum8'? И как ss.z получает ценность? –

+0

Что такое 'sum8'? –

+0

@ dave_59: извините за долгую задержку, я только что обновил вопрос. Но речь идет не о том, как работает конкретный модуль, а о том, почему я могу читать его из модуля module.port, но не могу его назначить. Возможно, сам вопрос не так хорош. – firegurafiku

ответ

2

Ближе всего было бы interface конструкт в SystemVerilog. Это будет выглядеть примерно так:

interface adder8_itf; 
    wire    cin; // carry-in bit 
    wire [7:0] x, y; // operands 
    wire    cout; // carry-out bit 
    wire [7:0] z;  // result 
endinterface 
module mult4(input wire [3:0] x, y, 
      output wire [7:0] z); 
    adder8_itf sh(), sl(), ss(); 
    sum8 i1(sh), i2(sl), i3(ss); 
    assign sl.x = (y[0] ? x : 0), 
      sl.y = (y[1] ? x : 0) << 1, 
      sh.x = (y[2] ? x : 0) << 2, 
      sh.x = (y[3] ? x : 0) << 3, 
      ss.x = sl.z, 
      ss.y = sh.z, 
      sl.cin = 0, 
      sh.cin = 0, 
      ss.cin = 0, 
      z = ss.z; 
endmodule 
module sum8 (adder8_itf itf); 
    assign {itf.cout,itf.z} = itf.x +itf.y; 
endmodule 

Хотя, это, вероятно, больше работы, только так вы можете организовать ваш порт заданий другому.

1

Насколько я знаю, есть только два способа подключения портов в Verilog по имени или по заказу. Вы можете взглянуть на this article, который объясняет, как это сделать.

Однако вы можете найти что-то похожее на то, что вы описываете в VHDL с the port map directive.

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