2016-11-17 6 views
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の場合、すべて問題なく動作しますが、その値を増やそうとしている場合は、ベットされているすべての領域ween 1とAMOUNT_OF_REGIONS-2(を含む)、それらの入力と出力が乱されます(2'bzz)。しかし0の領域は、領域1に情報を送信し、AMOUNT_OF_REGIONS-1の領域はその情報を近隣の領域に正しく送信します。 テストベンチは列をインスタンス化するだけで、トリガー信号とclk信号を生成します。私は高インピーダンス状態を引き起こす可能性のあるレジスタへのアタッチメントなしのワイヤ接続のみがあれば読むことができましたが、私が見る限り、出力レジスタにワイヤを接続しています。それの問題?それが重要であれば、私はIcarus Verilogを使用しています。

+0

http://stackoverflow.com/help/mcve – toolic

答えて

0

偶然、私は私の問題の根本を見つけました。私は答えを残します、それはこのような状況に立ち往生する誰かにいつか役立つかもしれません。

私は間違ったポート割り当てをしていました。だから、それらはサイクリングされたものか、そういうものでした。問題はここにあった:

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] 
); 

私は別の出力にモジュールの入力ポートを割り当てられ、それが間違いだった...

だから、このような状況にポートを割り当てるの適切な方法は次のように(いっぱいですインスタンス化サイクルのコード):

generate 
    genvar i; 
    for (i = 0; i < AMOUNT_OF_REGIONS; i = i + 1) begin : multiple_regions_instantiation 
     if (i == 0) begin 
      region tmp(
       clk, 
       reset, 
       trigger, 
       latency, 
       up_in[i], 
       do_in[i], 
       up_out[i], 
       up_in[i+1], //CHANGED 
       o_data[i] 
      ); 
     end 
     else if (i == AMOUNT_OF_REGIONS-1) begin 
      region tmp(
       clk, 
       reset, 
       trigger, 
       latency, 
       up_in[i], 
       do_in[i], 
       do_in[i-1], //CHANGED 
       do_out[i], 
       o_data[i] 
      ); 
     end 
     else begin 
      region tmp(
       clk, 
       reset, 
       trigger, 
       latency, 
       up_in[i], //CHANGED 
       do_in[i], //CHANGED 
       do_in[i-1], 
       up_in[i+1], 
       o_data[i] 
      ); 
     end 
    end 
endgenerate 

誰かを助けてくれることを願っています!

関連する問題