Loading

verilog中initial块里的阻塞与非阻塞赋值问题

问题描述:

单bit信号跨时钟域,使用握手通信法进行同步处理,在仿真时出现的问题。

构建testbench时,使用了非阻塞赋值。

`timescale 1ns/1ps
module tb_cdc_1bit_f2s_reqack();

reg clka;
reg src_rst_n;
reg pulse_a;
reg clkb;
reg dst_rst_n;
wire pulse_b;

initial begin
    clka = 1'b1;
    src_rst_n = 1'b0; 
    pulse_a = 1'b0; 
    clkb = 1'b1;
    dst_rst_n = 1'b0; 
    #20
    src_rst_n = 1'b1; 
    dst_rst_n = 1'b1; 
    #20
    @(posedge clka)
    pulse_a = 1'b1; 
    #16.666
    pulse_a = 1'b0;
end

always #8.333 clka = ~clka;
always #25 clkb    = ~clkb;

    cdc_1bit_f2s_reqack inst_cdc_1bit_f2s_reqack
        (
            .clka      (clka),
            .src_rst_n (src_rst_n),
            .pulse_a   (pulse_a),
            .pulse_b   (pulse_b),
            .clkb      (clkb),
            .dst_rst_n (dst_rst_n)
        );


endmodule

modelsim波形图如下所示,src_sync_req是在clka时钟域对pulse_a的展宽,作为请求信号传送到时钟域clkb,可以看到无法采样到pulse_a。

 

解决方案:

这篇博文清晰得讲解了阻塞与非阻塞的使用情况:https://www.cnblogs.com/lyc-seu/p/12562107.html

因而可以看出,initial块中的

用法不正确,在这里应该采用阻塞赋值,等待时钟上升沿来后再进行赋值即可。

修改后的仿真波形即可正确地描绘单bit跨时钟域的处理情况。

 

posted @ 2021-12-30 16:39  月光小猪(已长膘)  阅读(871)  评论(0编辑  收藏  举报