2016-11-17 103 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區域正確地將信息發送給它的鄰居。 測試臺只是實例化一列,並生成觸發器和時鐘信號。我讀過如果只有導線連接沒有連接到寄存器,可能會導致高阻抗狀態,但據我所知,我將連線連接到輸出寄存器......親愛的,可能是什麼它的問題?如果它很重要,我正在使用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 

希望它能幫助別人!