发现未分配的位(vivado)

问题描述 投票:0回答:1

我在 Vivado 中遇到了 ASSIGN-9 linting 违规,并且想摆脱它。

我有一个复杂的模块存在此错误,但我能够编写一个简单的可重现示例来很好地显示它:

`timescale 1ps / 1ps

module test1 (
    input clk,
    input prev,
    output reg next
); 
    always @(posedge clk ) begin
        next <= prev;
    end
endmodule

module test2 #(
    parameter param = 3
) (
    input clk,
    input first
);
    wire [0:param - 2] link;

    genvar i;
    generate
        for (i = 0; i < param; i = i + 1) begin : test1_
            test1 t1
            (
                .clk(clk),
                .prev(i ? link[i-1] : first)
            );
            // The last one is not linked to anything
            if (i < param - 1) begin
                assign link[i] = t1.next;
            end
        end       
    endgenerate
endmodule

问题当然来自于最后一个 test1next 输出端口未连接到任何东西。我实际上希望它保持这种状态,并且不需要这种连接。我怎样才能以最干净的方式告诉 Vivado 此事?

我已经尝试过

(* keep="soft" *)
,但不起作用

附注 该代码按预期工作,我对此没有任何问题。这只是我想摆脱的 linter 违规行为。

verilog xilinx vivado
1个回答
0
投票

如果您确实希望

next
不连接到任何东西,请在端口连接中使用
.next()
告诉模拟器/合成器/linter/等,空连接是故意的。这应该可以解决警告问题。

            test1 t1
            (
                .clk(clk),
                .prev(i ? link[i-1] : first),
                .next() // <- connect to nothing
            );

也就是说,请注意,通过模块分层探测信号旨在验证其他不可合成的编码。可综合的 RTL 设计应仅通过端口接口连接信号。优化阶段将在综合期间删除任何未使用的逻辑,因此没有理由不将

next
连接到网络。

您可能想做这样的事情以获得更清晰的代码:

module test2 #(
    parameter param = 3
) (
    input clk,
    input first,
    output out
);
    wire [0:param] link;

    assign link[0] = first;
    assign out = link[param]; // out=first if param==0
    genvar i;
    generate
        for (i = 1; i <= param; i = i + 1) begin : test1_ // Note 'i' starts at 1,
            test1 t1
            (
                .clk(clk),
                .prev(link[i-1]),
                .next(link[i])
            );
        end       
    endgenerate
endmodule
© www.soinside.com 2019 - 2024. All rights reserved.