在两个方向分配inout port inout

时间:2018-05-21 14:47:46

标签: verilog inout

出于模拟目的,使用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 个答案:

答案 0 :(得分:3)

在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

关于第二个问题,我不确定为什么你需要这个模拟模型,或者如何将位置信息放入网表。

答案 1 :(得分:1)

您应该使用三态信号,就像在真实硬件中一样:

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

您可以使用参数来确定方向,但必须知道块何时实例化它必须具有的方向。没有来自例如一个地方&路由工具为你做。