Verilog 更好的D触发器编码方法

Verilog 更好的D触发器编码方法,verilog,Verilog,最近,我在verilog中看到一些D触发器RTL代码,如下所示: module d_ff( input d, input clk, input reset, input we, output q ); always @(posedge clk) begin if (~reset) begin

最近,我在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
模块d\u ff(
输入d,
输入时钟,
输入复位,
输入我们,
输出q
);
始终@(posedge clk)开始
如果(~reset)开始

q就模拟而言,删除该语句不应该改变任何东西,因为q应该是reg类型(或SystemVerilog中的逻辑),并且应该保持其值

此外,大多数合成工具应在两种情况下生成相同的电路,因为q是使用非阻塞分配更新的。也许更好的代码是使用always\u ff而不是always(如果您的工具支持的话)。通过这种方式,编译器将检查始终使用非阻塞分配更新q,并生成顺序逻辑


语句q看起来像是synth对任何一段代码进行的优化,因为其行为与时钟选通相同。它可能会导致故障。
always @(posedge CLK or negedge RESET)
  if(~RESET)
    COUNT <= 0;
  else if(INC)
    COUNT <= COUNT + 1;
  else
    COUNT <= COUNT;
always @(posedge CLK or negedge RESET)
  if(~RESET)
    COUNT <= 0;
  else if(INC)
    COUNT <= COUNT + 1;