モジュールの出力ポートで予期しない高インピーダンス状態の問題が発生しました。他のモジュールをインスタンス化するモジュールのコードは次のとおりです。
`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 を使用しています。