考虑下面的代码。使用魔杖插入
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
我很抱歉,我知道这是很多代码,但建立一个测试场景中我没能想到比这更小。 现在的问题是上面的代码进行仿真时,
变量的值都以下 M1中,
三态,I = 1,如所预期。
。 ,IO = 0,意外的是IO = I?
。 ,O = 0; // = IO如预期
。 ,OE = 1 //明显
在平方米,
三态,I = 0,如所预期。
。 ,IO = 0,预计为IO = I
。 ,O = 0; // = IO如预期
。 ,OE = 1 //明显
现在我不明白IO中m1的值是如何为0? 是不是因为我传递棒作为参数传递给INOUT,也使INOUT一棒型,如果因此它回避以下问题,
A link to my another question on stackoverflow
我问(链路问题)第一,但有是需要补充的一些澄清,所以我根据一个新问题添加了澄清部分。 基本上我想知道inout的行为如何像魔杖一样,如果是这样的话,我怎样才能使inout的行为像魔杖一样,不需要使用不同的顶层模块来实例化。
剪切和粘贴错误?此代码不会编译(请参阅m1定义的行),并且没有任何内容被声明为棒。 –