如何在Verilog中将寄存器数组传递给具有单位输入和输出的缓冲区?

时间:2013-08-20 23:57:16

标签: verilog

我有一个名为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个实例?

谢谢,

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你应该使用generate:

  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上完成代码,测试和SIM卡结果:http://www.edaplayground.com/s/4/93

相关问题