FPGA中不必要的寄存器复位
unnecessary register reset in FPGA
假设我有一些不需要重置的内部寄存器,例如,如果我将它们设置为使用它们之前的状态——比如这里的缓冲区,我在重置时不给它任何值,当状态转换为 STATE_1(我需要缓冲区)我加载它:
always @(posedge clk or negedge reset_n)
begin
if(!reset_n)
state <= IDLE
else begin
case(state)
IDLE: begin
if(in1) begin
buffer <= in2
state <= STATE_1
end
end
STATE_1 :begin
use buffer..
end
endcase
end
end
是否真的有必要在异步重置中也包含缓冲区并在重置时给它一个值?
综合工具会这样做吗?这取决于什么?什么是好的做法?
因为直觉上这感觉更有效,因为综合将不必找到将重置连接到缓冲区的方法。
这取决于您如何使用 buffer
信号。如果只在STATE_1
中使用,不重置是安全的。 EDA 工具不应重置它,除非上电重置应将所有寄存器设置为已知状态。
不重置触发器是安全的。省略重置有很多好处:
在 IC 中,这将导致触发器没有复位
合成的,这将略小于一个将重置。
在 FPGA 中可能不会出现这种情况,因为带有复位功能的触发器会
无论如何都要在场。 (然而,一些 FPGA 合成器可以制作触发器
在 LUT 之外,这是否可能取决于
不管你有没有重置。)
不管是IC还是FPGA,都不会占用走线资源
将复位信号路由到触发器。
但是,在 IC 中,某些设计流程可能会出于制造测试目的强制执行重置。这在 FPGA 中不是问题。
假设我有一些不需要重置的内部寄存器,例如,如果我将它们设置为使用它们之前的状态——比如这里的缓冲区,我在重置时不给它任何值,当状态转换为 STATE_1(我需要缓冲区)我加载它:
always @(posedge clk or negedge reset_n)
begin
if(!reset_n)
state <= IDLE
else begin
case(state)
IDLE: begin
if(in1) begin
buffer <= in2
state <= STATE_1
end
end
STATE_1 :begin
use buffer..
end
endcase
end
end
是否真的有必要在异步重置中也包含缓冲区并在重置时给它一个值? 综合工具会这样做吗?这取决于什么?什么是好的做法? 因为直觉上这感觉更有效,因为综合将不必找到将重置连接到缓冲区的方法。
这取决于您如何使用 buffer
信号。如果只在STATE_1
中使用,不重置是安全的。 EDA 工具不应重置它,除非上电重置应将所有寄存器设置为已知状态。
不重置触发器是安全的。省略重置有很多好处:
在 IC 中,这将导致触发器没有复位 合成的,这将略小于一个将重置。 在 FPGA 中可能不会出现这种情况,因为带有复位功能的触发器会 无论如何都要在场。 (然而,一些 FPGA 合成器可以制作触发器 在 LUT 之外,这是否可能取决于 不管你有没有重置。)
不管是IC还是FPGA,都不会占用走线资源 将复位信号路由到触发器。
但是,在 IC 中,某些设计流程可能会出于制造测试目的强制执行重置。这在 FPGA 中不是问题。