私のモジュールの出力ポートで予期せぬ高インピーダンス状態の問題が発生しました。他のモジュールをインスタンス化し、モジュールのコードは以下の通りです:予期しない高インピーダンス状態
`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の場合、すべて問題なく動作しますが、その値を増やそうとしている場合は、ベットされているすべての領域ween 1とAMOUNT_OF_REGIONS-2(を含む)、それらの入力と出力が乱されます(2'bzz)。しかし0の領域は、領域1に情報を送信し、AMOUNT_OF_REGIONS-1の領域はその情報を近隣の領域に正しく送信します。 テストベンチは列をインスタンス化するだけで、トリガー信号とclk信号を生成します。私は高インピーダンス状態を引き起こす可能性のあるレジスタへのアタッチメントなしのワイヤ接続のみがあれば読むことができましたが、私が見る限り、出力レジスタにワイヤを接続しています。それの問題?それが重要であれば、私はIcarus Verilogを使用しています。
http://stackoverflow.com/help/mcve – toolic