将输入端口分配给双向输入
Assinging inout port to inout in both directions
为了模拟目的,我想使用 Verilog 创建一个只有 2 个输入输出端口(比如左和右)的块,并且将从左到右或从右到左传输信号。可以假设该块仅在转换期间处于活动状态,其余时间将等待输入。但我不允许使用任何其他端口。所以理论上模块定义将是这样的:
module blackbox(inout left, inout right)
assign left = right;
assign right = left;
specify
(left => (right:1'b1)) = 7;
(right => (left:1'b1)) = 8;
endspecify
endmodule
有解决办法吗?
作为第2题,可以通过放置后确定方向来简化问题。例如,如果将方块放置在一个位置,它将始终从左向右传输信号,但在另一个位置,它可以从右向左传输。是否可以在模块中以某种方式对此进行编码?
谢谢,
在 Verilog 中
module blackbox(inout .left(internal), inout .right(internal));
wire internal;
specify
(left => (right:1'b1)) = 7;
(right => (left:1'b1)) = 8;
endspecify
endmodule
或
module blackbox(inout left, right);
tran t(left,right); // some simulators might require this to work with specify block
specify
(left => (right:1'b1)) = 7;
(right => (left:1'b1)) = 8;
endspecify
endmodule
在 SystemVerilog 中:
module blackbox(inout left, right)
alias left = right;
specify
(left => (right:1'b1)) = 7;
(right => (left:1'b1)) = 8;
endspecify
endmodule
对于你的第二个问题,我不确定你为什么需要这个用于仿真模型,或者你如何将布局信息添加到网表中。
您应该使用三态信号,就像在真实硬件中一样:
assign A_inout = direction_is_A_to_B ? A_out : 1'bz;
assign B_inout = direction_is_A_to_B ? 1'bz : B_out;
然后您可以安全地将 A_inout 连接到 B_inout;
输入是A_inout的副本,但显式使用信号可能更清楚:
assign A_in = A_inout;
通常所有这些都在双向板内完成:
module bi_pad (
inout P,
input I,
input tri,
output O
);
assign P = tri ? 1'bz : O;
assign I = P;
endmodule
您可以使用参数来确定方向,但您必须知道何时实例化块,它必须具有哪个方向。没有来自 e.g. 的反馈。一个布局和布线工具来为你做这件事。
为了模拟目的,我想使用 Verilog 创建一个只有 2 个输入输出端口(比如左和右)的块,并且将从左到右或从右到左传输信号。可以假设该块仅在转换期间处于活动状态,其余时间将等待输入。但我不允许使用任何其他端口。所以理论上模块定义将是这样的:
module blackbox(inout left, inout right)
assign left = right;
assign right = left;
specify
(left => (right:1'b1)) = 7;
(right => (left:1'b1)) = 8;
endspecify
endmodule
有解决办法吗?
作为第2题,可以通过放置后确定方向来简化问题。例如,如果将方块放置在一个位置,它将始终从左向右传输信号,但在另一个位置,它可以从右向左传输。是否可以在模块中以某种方式对此进行编码?
谢谢,
在 Verilog 中
module blackbox(inout .left(internal), inout .right(internal));
wire internal;
specify
(left => (right:1'b1)) = 7;
(right => (left:1'b1)) = 8;
endspecify
endmodule
或
module blackbox(inout left, right);
tran t(left,right); // some simulators might require this to work with specify block
specify
(left => (right:1'b1)) = 7;
(right => (left:1'b1)) = 8;
endspecify
endmodule
在 SystemVerilog 中:
module blackbox(inout left, right)
alias left = right;
specify
(left => (right:1'b1)) = 7;
(right => (left:1'b1)) = 8;
endspecify
endmodule
对于你的第二个问题,我不确定你为什么需要这个用于仿真模型,或者你如何将布局信息添加到网表中。
您应该使用三态信号,就像在真实硬件中一样:
assign A_inout = direction_is_A_to_B ? A_out : 1'bz;
assign B_inout = direction_is_A_to_B ? 1'bz : B_out;
然后您可以安全地将 A_inout 连接到 B_inout;
输入是A_inout的副本,但显式使用信号可能更清楚:
assign A_in = A_inout;
通常所有这些都在双向板内完成:
module bi_pad (
inout P,
input I,
input tri,
output O
);
assign P = tri ? 1'bz : O;
assign I = P;
endmodule
您可以使用参数来确定方向,但您必须知道何时实例化块,它必须具有哪个方向。没有来自 e.g. 的反馈。一个布局和布线工具来为你做这件事。