我们常常能看到一个Verilog RTL Coding guideline :在建模时序逻辑的时候,使用非阻塞赋值。
但事实上,当我们遵循使用非阻塞赋值来建模分频时钟(时钟路径)时,可能会存在竞争冒险的问题。
module Non_blocking(
input clk ,
input rst_n,
input data_in,
output data_out)
reg clk_div ,
always@(posedgeclk or negedge rst_n) begin
if(!rst_n) begin
clk_div<= 0 ;
end
else begin
clk_div <= ~clk_div ; //update value after delta
end
end
reg data_reg ;
always@(posedgeclk or negedge rst_n) begin
if(!rst_n) begin
data_reg<= 0 ;
end
else begin
data_reg <= data_in ; //update value after delta
end
end
always@(posedgeclk_div or negedge rst_n) begin
if(!rst_n) be