Использование входов с палочкой

Рассмотрим приведенный ниже код.

module TriState
  (
   // Outputs
   O, 
   // Inouts
   IO, 
   // Inputs
   OE, I
   );

   parameter          width = 1;


   input              OE;

   input [width-1:0]  I;
   output [width-1:0] O;

   inout [width-1:0]  IO;

   assign             IO = (OE) ? I : { width { 1'b1 } };
   assign             O  = IO;

endmodule // TriState

module m1(.a(inout line_P1$IO));
reg val_P1 ;
wire line_P1$IO,line_P1$O;
TriState #(.width(32'd1)) line_SCL(.I(val_P1),
                 .OE(1),
                 .O(line_P1$O),
                 .IO(line_P1$IO));
always @(*) begin
val_P1 <= 1;
end
endmodule //m1

module m2(.a(inout line_P1$IO));
reg val_P1 ;
wire line_P1$IO,line_P1$O;
TriState #(.width(32'd1)) line_SCL(.I(val_P1),
                 .OE(1),
                 .O(line_P1$O),
                 .IO(line_P1$IO));
always @(*) begin
val_P1 <= 0;
end
endmodule //m2

module top();

wand P1;
assign P1 = 1;

m1 ins1(.a(P1));
m2 ins2(.a(P1));
endmodule //top

Извините, я знаю, что это много кода, но для создания тестового сценария я не смог придумать меньшее, чем это. Теперь проблема в том, когда приведенный выше код моделируется,

Значения переменных следующие В м1,

tristate, I = 1, как и ожидалось.

,, IO = 0, неожиданно, как IO = I?

,, O = 0;//= IO, как и ожидалось

,, OE = 1 // очевидно

В м2,

tristate, I = 0, как и ожидалось.

,, IO = 0, ожидается как IO = I

,, O = 0;//= IO, как и ожидалось

,, OE = 1 // очевидно

Теперь я не понимаю, как значение IO в m1 равно 0? Это потому, что я передаю палочку в качестве аргумента для inout, делает ли это inout типом палочки, если это так, то напрашивается следующий вопрос:

Ссылка на мой другой вопрос по stackru

Сначала я задал (вопрос по ссылке), но были некоторые пояснения, которые нужно было добавить, поэтому я добавил поясняющую часть в терминах нового вопроса. По сути, я хочу знать, как получается, что inout ведет себя как wand, и если да, то как мне заставить inout вести себя как wand без использования другого верхнего модуля для создания экземпляров.

1 ответ

Этот синтаксис неверен:

module m1(.a(inout line_P1$IO));

ты должен сделать

module m1(.a(line_P1$IO));
    inout line_P1$IO;

в стандарте ANSI это должно быть

module m1(inout .a(line_P1$IO));

хотя я попробовал версию ANSI в "VCS" и не был реализован там. Не Анси работал.

Другие вопросы по тегам