我在 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
问题当然来自于最后一个 test1 的 next 输出端口未连接到任何东西。我实际上希望它保持这种状态,并且不需要这种连接。我怎样才能以最干净的方式告诉 Vivado 此事?
我已经尝试过
(* keep="soft" *)
,但不起作用
附注 该代码按预期工作,我对此没有任何问题。这只是我想摆脱的 linter 违规行为。
如果您确实希望
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