Verilog 触发器建模的正确方法
我正在浏览Microsemi网站()上的一个文档,发现了一些触发器的实现(同步、异步等)。在所有情况下,作者都使用阻塞语句对触发器进行了建模 我想知道这些实现是否正确,因为我总是使用非阻塞来建模顺序逻辑?我是否遗漏了一些东西,或者这只是一种只对触发器建模的方法,而不是一般的时序电路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
// 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