gpt4 book ai didi

verilog - 编码 D 触发器的更好方法

转载 作者:行者123 更新时间:2023-12-02 10:23:38 25 4
gpt4 key购买 nike

最近,我在verilog中看到了一些D触发器RTL代码,如下所示:

    module d_ff(
input d,
input clk,
input reset,
input we,
output q
);

always @(posedge clk) begin
if (~reset) begin
q <= 1'b0;
end
else if (we) begin
q <= d;
end
else begin
q <= q;
end
end
endmodule

声明q <= q;吗?有必要吗?

最佳答案

Does the statement q <= q; necessary?

不,事实并非如此,对于 ASIC 来说,它实际上可能会增加面积和功耗。我不确定现代 FPGA 如何处理这个问题。在综合过程中,该工具将看到该语句并要求在每个正时钟沿更新 q。如果没有最后的 else 子句,该工具可以仅在满足给定条件时更新 q

在 ASIC 上,这意味着综合工具可以插入时钟门(假设库有一个)而不是多路复用器。对于单个 DFF,这实际上可能更糟,因为时钟门通常比多路复用器大得多,但如果 q 是 32 位,则节省的空间可能非常显着。现代工具可以自动检测使用共享使能的 DFF 数量是否满足特定阈值,然后适当选择时钟门或多路复用器。

With final else clause

在这种情况下,该工具需要 3 个多路复用器以及额外的路由

always @(posedge CLK or negedge RESET)
if(~RESET)
COUNT <= 0;
else if(INC)
COUNT <= COUNT + 1;
else
COUNT <= COUNT;

Without final else clause

此处该工具对所有 DFF 使用单个时钟门

always @(posedge CLK or negedge RESET)
if(~RESET)
COUNT <= 0;
else if(INC)
COUNT <= COUNT + 1;

Images from here

关于verilog - 编码 D 触发器的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11007729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com