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