0

モジュールの出力ポートで予期しない高インピーダンス状態の問題が発生しました。他のモジュールをインスタンス化するモジュールのコードは次のとおりです。

`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 を使用しています。

4

1 に答える 1