我在模块的输出端口上遇到了意外的高阻抗状态问题。实例化其他模块的模块代码如下:
`timescale 1ns/1ps
module column(
input wire clk,
input wire reset,
input wire trigger,
input wire [7:0] latency
);
localparam AMOUNT_OF_REGIONS = 3;
wire [24:0] o_data [0:AMOUNT_OF_REGIONS-1];
wire [1:0] up_in [0:AMOUNT_OF_REGIONS-1];
//same declarations for do_in, up_out, do_out
assign up_in[0] = 0;
assign do_in[AMOUNT_OF_REGIONS-1] = 0;
generate
genvar i;
for (i = 0; i < AMOUNT_OF_REGIONS; i = i + 1) begin : multiple_regions_instantiation
if ((i == 0) || (i == AMOUNT_OF_REGIONS-1)) begin
region tmp(
clk,
reset,
trigger,
latency,
up_in[i],
do_in[i],
up_out[i],
do_out[i],
o_data[i]
);
end
else begin
region tmp(
clk,
reset,
trigger,
latency,
do_out[i-1],
up_out[i+1],
do_in[i-1],
up_in[i+1],
o_data[i]
);
end
end
endgenerate
endmodule
可实例化模块的端口声明如下:
module region(
input wire clk,
input wire reset,
input wire trigger,
input wire [7:0] latency,
input wire [1:0] up,
input wire [1:0] do,
output reg [1:0] to_up,
output reg [1:0] to_do,
output reg [24:0] odata
);
输出的分配是在初始块中进行的,如下所示:
initial begin
latency_cnt = 255;
start_cnt = 0;
preset = 0;
read_out = 0;
begin: hit_generation
cnt = 0;
forever begin
cnt = cnt + 1;
fork
#20 hit0 = ($random > 0) ? 1 : 0;
#20 hit1 = ($random > 0) ? 1 : 0;
#20 hit2 = ($random > 0) ? 1 : 0;
#20 hit3 = ($random > 0) ? 1 : 0;
to_up = {hit1, hit0};
to_do = {hit3, hit2};
join
if (cnt == 10000) disable hit_generation;
end
end
end
所以,现在的问题是,如果它 AMOUNT_OF_REGIONS == 3 或 2 那么一切正常,但如果我试图增加它的值,那么对于介于 1 和 AMOUNT_OF_REGIONS-2(包括)之间的所有区域,它们的输入和输出搞砸了(2'bzz)。但是 0 区域很好地向区域 1 发送信息,并且 AMOUNT_OF_REGIONS-1 区域将信息正确地发送给它的邻居。测试台只是实例化一列并生成触发和 clk 信号。我已经读过,如果只有电线连接而没有连接到可能导致高阻抗状态的寄存器,但据我所知,我正在将电线连接到输出寄存器......亲爱的,什么可能是有问题吗?如果重要的话,我正在使用 Icarus Verilog。