2016-11-17 35 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 

希望它能帮助别人!