Verilog 触发器建模的正确方法

Verilog 触发器建模的正确方法,verilog,flip-flop,Verilog,Flip Flop,我正在浏览Microsemi网站()上的一个文档,发现了一些触发器的实现(同步、异步等)。在所有情况下,作者都使用阻塞语句对触发器进行了建模 我想知道这些实现是否正确,因为我总是使用非阻塞来建模顺序逻辑?我是否遗漏了一些东西,或者这只是一种只对触发器建模的方法,而不是一般的时序电路 // Rising Edge Flip-Flop with Asynchronous Reset module dff_async_rst (data, clk, reset, q); input data, c

我正在浏览Microsemi网站()上的一个文档,发现了一些触发器的实现(同步、异步等)。在所有情况下,作者都使用阻塞语句对触发器进行了建模

我想知道这些实现是否正确,因为我总是使用非阻塞来建模顺序逻辑?我是否遗漏了一些东西,或者这只是一种只对触发器建模的方法,而不是一般的时序电路

// Rising Edge Flip-Flop with Asynchronous Reset
module dff_async_rst (data, clk, reset, q);
  input data, clk, reset;
  output q;
  reg q;

   always @(posedge clk or negedge reset)
     if (~reset)
       q = 1'b0;
     else
       q = data;

   endmodule

//Rising Edge Flip-Flop with Synchronous Reset
module dff_sync_rst (data, clk, reset, q);
  input data, clk, reset;
  output q;
  reg q;

  always @ (posedge clk)
    if (~reset)
      q = 1'b0;
    else 
      q = data;

endmodule

注:在always block中使用的用于获得顺序逻辑触发器的阻塞分配应使用非阻塞建模(
当我编码时,我使用与您的答案相同的编码风格。我使用非阻塞分配进行编码。但是,由于给定链接中的作者使用阻塞分配,编码风格正确吗?我不得不问,它是否正确,因为它来自Microsemi网站不正确。非阻塞是用来模拟触发器的行为的这就是它存在的原因。不使用正确的形式可能会导致RTL到门级模拟不匹配。大多数合成工具都会为这些示例生成触发器,尽管阻塞分配在顺序逻辑中并不常见。此答案将为您提供更详细的信息:
module dff_async_rst (
  input  data,
  input  clk, 
  input  reset_n,
  output reg q    //SystemVerilog logic is preferred over reg
);

always @(posedge clk or negedge reset_n) begin
  if (~reset_n) begin
    q <= 1'b0;
  end
  else begin
    q <= data;
  end
end

endmodule
module dff_sync_rst(
  input  data,
  input  clk, 
  input  reset_n,
  output reg q    //SystemVerilog logic is preferred over reg
);


always @(posedge clk) begin
  if (~reset_n) begin
    q <= 1'b0;
  end
  else begin
    q <= data;
  end
end

endmodule