在Verilog/SystemVerilog中,(* keep="true" *) 是一个综合属性注释,主要用于告诉综合工具不要优化掉特定的信号或逻辑。
一、语法和作用
(* keep="true" *) wire signal_name; (* keep="true" *) reg variable_name;
二、主要用途
1. 防止信号被优化掉
module example (
input wire clk,
input wire [3:0] a, b,
output wire [3:0] result
);
(* keep="true" *) wire [3:0] temp_calc;
assign temp_calc = a + b;
assign result = temp_calc ^ 4'b1010;
endmodule
没有 keep 属性时,综合工具可能直接将 temp_calc 优化掉。
2. 保留调试信号
module counter (
input wire clk, rst,
output reg [7:0] count
);
(* keep="true" *) wire overflow;
(* keep="true" *) reg [1:0] state;
assign overflow = (count == 8'hFF);
always @(posedge clk) begin
if (rst) begin
count <= 0;
state <= 0;
end else begin
count <= count + 1;
state <= (count[7]) ? 2'b10 : 2'b01;
end
end
endmodule
3. 在层次化设计中保留特定信号
module top;
wire clk, rst;
wire [7:0] data_out;
(* keep="true" *) wire [7:0] internal_bus;
sub_module u_sub (
.clk(clk),
.rst(rst),
.data_out(internal_bus)
);
assign data_out = internal_bus;
endmodule
三、工具支持
-
Xilinx Vivado: 完全支持
-
Intel Quartus: 支持(可能有轻微语法差异)
-
Synopsys Design Compiler: 支持
-
其他EDA工具: 通常都支持此类属性
四、类似属性
(* preserve *) wire signal_name; // 另一种保留方式 (* dont_touch *) wire signal_name; // 更强制性的保留 (* keep = 1 *) wire signal_name; // 使用1代替true
五、使用建议
-
仅在必要时使用 - 过度使用可能影响综合优化效果
-
主要用于调试 - 在最终版本中考虑移除不必要的keep属性
-
检查工具文档 - 不同工具可能有特定的语法要求
这个属性在调试和信号观测时非常有用,特别是在使用ILA(集成逻辑分析仪)或SignalTap时。
1万+

被折叠的 条评论
为什么被折叠?



