2

我有一个名为 BUF 的三态缓冲区。我不知道这个缓冲区是如何实现的,但我知道它有两个输入(I 和 T)、一个输出(O)和一个双向端口(IO)。我知道所有这些端口都是单个位。

现在,我有一个寄存器数组(数据)和一个方向寄存器(dir)。此代码是否有效:

reg [15:0] data;
reg dir;
wire [15:0] output;

//more code here

BUF my_buf
(
.I(data),
.T(dir),
.O(output),
.IO(to_phys_pin) //to_phys_pin is a 16bit long array going to the physical pins
)

具体来说,这段代码是否会为我创建 16 个缓冲区实例,它们都与 T 参数共享相同的“dir”寄存器?还是我必须使用“生成”来生成 15 个实例?

谢谢,

4

2 回答 2

2

使用在编译时运行的生成块(需要 IEEE 1364-2001 或更高版本):

genvar i;
generate
for(i=0;i<16;i=i+1) begin : genblk
    BUF my_buf( .I(data[i]), .T(dir), .O(output[i]), .IO(to_phys_pin[i]) );
end
endgenerate

另一种选择是创建一个实例数组(IEEE 1364-1995 或更高版本):

BUF my_buf[15:0]( .I(data[15:0]), .T({16{dir}}), .O(output[15:0]), .IO(to_phys_pin[15:0]) );

这两种样式的一个区别是分层路径名。http://www.edaplayground.com/s/6/94

于 2013-08-21T00:38:19.187 回答
1

您应该使用生成:

  genvar i;
  generate
    for (i=0; i <= 15; i=i+1) begin
      BUF BUF(data[i], dir, out[i],
        to_phys_pin[i]);
    end
  endgenerate

EDA Playground 上的完整代码、测试和模拟结果:http ://www.edaplayground.com/s/4/93

于 2013-08-21T00:33:26.103 回答