【问题标题】:Unexpected high impedance state意外的高阻抗状态
【发布时间】:2016-11-17 17:13:19
【问题描述】:

我遇到了模块输出端口出现意外高阻抗状态的问题。实例化其他模块的模块代码如下:

`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。

【问题讨论】:

    标签: module verilog instantiation icarus


    【解决方案1】:

    意外地,我找到了问题的根源。我会留下一个答案,也许有一天它会对陷入这种情况的人有所帮助。

    我做了错误的端口分配,所以,我猜,他们被循环或类似的东西。问题在于:

    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
    

    希望它对某人有所帮助!

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2019-10-02
      • 2022-09-29
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多